build_images.sh 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #!/bin/bash
  2. FTP_DATA=/data/ftp
  3. #PROJECT_NAME=wisecloud
  4. MIRROR_ADDRESS="registry.svicloud.com"
  5. GIT_ADDRESS="git@git.svicloud.com:svicloud/wisecloud.git"
  6. anynowtime="date +'%Y-%m-%d %H:%M:%S'"
  7. NOW="echo [\`$anynowtime\`][PID:$$]"
  8. function tms_start
  9. {
  10. echo "`eval $NOW` tms_start" >>"${BUILD_LOG}"
  11. }
  12. function tms_success
  13. {
  14. msg="$*"
  15. echo "`eval $NOW` tms_success:[$msg]" >>"${BUILD_LOG}"
  16. echo "`eval $NOW` tms_success:[$msg]"
  17. return 0
  18. }
  19. function tms_fail
  20. {
  21. msg="$*"
  22. echo "`eval $NOW` tms_fail:[$msg]" >>"${BUILD_LOG}"
  23. echo "`eval $NOW` tms_fail:[$msg]"
  24. return 1
  25. }
  26. function fn_print_err()
  27. {
  28. local info_error=$1
  29. echo "====================================================================================================" >>"${BUILD_LOG}"
  30. cat "${ERROR_LOG}" >>"${BUILD_LOG}"
  31. echo "====================================================================================================" >>"${BUILD_LOG}"
  32. tms_fail "${info_error}" || return $?
  33. }
  34. function fn_build_images()
  35. {
  36. local images_name=$1
  37. #build new images
  38. docker build -t "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"${IMAGE_VERSION}" . >"${ERROR_LOG}" 2>&1
  39. if [ $? -ne 0 ]
  40. then
  41. fn_print_err "Build <${MIRROR_ADDRESS}/${PROJECT_NAME}/${WANGYUAN_NAME}/${images_name}:${IMAGE_VERSION}> failure." || return $?
  42. fi
  43. docker rmi "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"latest"
  44. #tag images latest, modify by dongcj
  45. docker tag "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"${IMAGE_VERSION}" "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":latest >"${ERROR_LOG}" 2>&1
  46. if [ $? -ne 0 ]
  47. then
  48. fn_print_err "Tag <${MIRROR_ADDRESS}/${PROJECT_NAME}/${WANGYUAN_NAME}/${images_name}:latest> failure." || return $?
  49. fi
  50. #push images, modify by dongcj
  51. docker push "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"${IMAGE_VERSION}" >"${ERROR_LOG}" 2>&1
  52. if [ $? -ne 0 ]
  53. then
  54. echo "retry pushing after 3 seconds..."
  55. sleep 3
  56. docker push "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"${IMAGE_VERSION}" >"${ERROR_LOG}" 2>&1
  57. if [ $? -ne 0 ]; then
  58. fn_print_err "docker push ${MIRROR_ADDRESS}/${PROJECT_NAME}/${WANGYUAN_NAME}/${images_name}:${IMAGE_VERSION} failure." || return $?
  59. fi
  60. fi
  61. echo
  62. echo "Ready to push latest image"
  63. sleep 3
  64. #push images latest
  65. docker push "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"latest" >"${ERROR_LOG}" 2>&1
  66. if [ $? -ne 0 ]
  67. then
  68. echo "retry push latest after 3 seconds..."
  69. sleep 3
  70. docker push "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"latest" >"${ERROR_LOG}" 2>&1
  71. if [ $? -ne 0 ]; then
  72. fn_print_err "docker push ${MIRROR_ADDRESS}/${PROJECT_NAME}/${WANGYUAN_NAME}/${images_name}:latest failure." || return $?
  73. fi
  74. fi
  75. sleep 5
  76. docker pull "${MIRROR_ADDRESS}"/"${PROJECT_NAME}"/"${WANGYUAN_NAME}"/"${images_name}":"latest" >"${ERROR_LOG}" 2>&1
  77. if [ $? -ne 0 ]
  78. then
  79. fn_print_err "Pull<${MIRROR_ADDRESS}/${PROJECT_NAME}/${WANGYUAN_NAME}/${images_name}:latest> failure." || return $?
  80. fi
  81. return 0
  82. }
  83. function fn_version_json()
  84. {
  85. local new_version
  86. [ -d /tmp/wisecloud ] && rm -rf /tmp/wisecloud
  87. cd /tmp
  88. git clone "${GIT_ADDRESS}" >"${ERROR_LOG}" 2>&1
  89. if [ $? -ne 0 ]
  90. then
  91. fn_print_err "Git <wisecloud.git> failure." || return $?
  92. fi
  93. cd /tmp/wisecloud && cp version.json version.backup
  94. jq ".${WANGYUAN_NAME}.${MODULE_SERVICE_NAME}_version = \"${MODULE_SERVICE_VERSION}\"" version.backup >version.json
  95. new_version=`jq ".${WANGYUAN_NAME}.${MODULE_SERVICE_NAME}_version" version.json |xargs`
  96. if [ "${new_version}" != "${MODULE_SERVICE_VERSION}" ]
  97. then
  98. fn_print_err "Version upgrade ${MODULE_SERVICE_VERSION} failed" || return $?
  99. else
  100. rm version.backup
  101. fi
  102. git add version.json || return $?
  103. git commit -m "${MODULE_SERVICE_VERSION}"
  104. git push || return $?
  105. tms_success "Version upgrade ${MODULE_SERVICE_VERSION} finish."
  106. return 0
  107. }
  108. fn_main()
  109. {
  110. MODUL_NAME=$1
  111. local svn_number=$2
  112. PROJECT_NAME=$3
  113. #定义日志打印的路径
  114. BUILD_LOG=/tmp/${MODUL_NAME}/build.log
  115. ERROR_LOG=/tmp/${MODUL_NAME}/error.log
  116. #创建日志文件
  117. [ -d /tmp/${MODUL_NAME} ] && rm -rf /tmp/${MODUL_NAME}
  118. mkdir -p /tmp/${MODUL_NAME}
  119. cd /tmp/${MODUL_NAME} && touch build.log error.log
  120. if [ -z "${MODUL_NAME}" -o -z "${svn_number}" -o -z "${PROJECT_NAME}" ]
  121. then
  122. fn_print_err "Jenkins SVN version or modul name or project name does not exist." || return $?
  123. fi
  124. #通过网元模块名和svn版本号找到包名,取最近一次时间的版本号
  125. pkg_name=`ls -rt /data/ftp |grep -i ${MODUL_NAME} |grep ${svn_number} |tail -n 1`
  126. if [ -z "${pkg_name}" ]
  127. then
  128. fn_print_err "SVN version or modul name is Error." || return $?
  129. fi
  130. local pkg_dir=`echo ${pkg_name} |awk -F'-' '{print $1}'`
  131. #获取拆分变量
  132. local images_name wangyuan_version
  133. WANGYUAN_NAME=`echo ${pkg_name} |awk -F'_' '{print $1}' |tr [A-Z] [a-z]`
  134. local server_name=`echo ${pkg_name} |awk -F'_' '{print $2}' |tr [A-Z] [a-z]`
  135. if echo "${server_name}" |grep [0-9] >/dev/null 2>&1
  136. then
  137. images_name="${WANGYUAN_NAME}"
  138. wangyuan_version=`echo ${pkg_name} |awk -F'_' '{print $2}'`
  139. else
  140. images_name="${server_name}"
  141. wangyuan_version=`echo ${pkg_name} |awk -F'_' '{print $3}'`
  142. fi
  143. #拼接镜像的版本号,由网元版本号和svn版本号组成
  144. IMAGE_VERSION="${wangyuan_version}"-"${svn_number}"
  145. #提取Dockerfile文件
  146. cp /data/ftp/${pkg_name} /tmp/${MODUL_NAME}
  147. cd /tmp/${MODUL_NAME} && tar -zxvf ${pkg_name} --wildcards ${pkg_dir}/Dockerfile
  148. cp -p ${pkg_dir}/Dockerfile ./ && rm -rf ${pkg_dir}
  149. sed -i "/^ENV APP_NAME/a\ENV IMAGES_VERSION ${IMAGE_VERSION}" Dockerfile
  150. #build镜像
  151. cd /tmp/${MODUL_NAME}
  152. tms_success "Start build ${MODUL_NAME} images."
  153. # modify by dongcj
  154. fn_build_images "${images_name}" >"${ERROR_LOG}" 2>&1
  155. if [ $? -ne 0 ]
  156. then
  157. fn_print_err "build <${images_name}> failure." || return $?
  158. fi
  159. #清理临时目录
  160. tms_success "Build ${MODUL_NAME} images Success."
  161. cd /tmp && rm -rf "${MODUL_NAME}"
  162. return 0
  163. }
  164. ####################################################################################
  165. fn_main $1 $2 $3 || exit $?
  166. ####################################################################################