Jenkinsfile-uat-build-deploy.groovy 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /**
  2. * 预生产(UAT):Checkout → Maven 打包 → 将 jar/lib 拷到 UAT 部署目录并 docker restart。
  3. *
  4. * Jenkins Job:Pipeline script from SCM 时 Script Path 填 docs/jenkins/Jenkinsfile-uat-build-deploy.groovy
  5. *
  6. * 构建分支:在「Build with Parameters」中填写 GIT_BRANCH,默认 uat-20260202;须与 Gitea 远端分支名完全一致(连字符/下划线不要混用)。
  7. */
  8. pipeline {
  9. agent any
  10. options {
  11. buildDiscarder(logRotator(numToKeepStr: '2', artifactNumToKeepStr: '2'))
  12. timestamps()
  13. timeout(time: 60, unit: 'MINUTES')
  14. }
  15. parameters {
  16. string(
  17. name: 'GIT_BRANCH',
  18. defaultValue: 'uat-20260202',
  19. trim: true,
  20. description: '要构建的 Git 分支名,须与远端一致,例如 uat-20260202、main'
  21. )
  22. booleanParam(name: 'FORCE_UPDATE', defaultValue: true, description: '是否强制更新依赖(mvn -U)')
  23. booleanParam(name: 'ALLOW_SNAPSHOTS', defaultValue: true, description: '是否允许 SNAPSHOT 依赖')
  24. }
  25. environment {
  26. MAVEN_HOME = tool '3.6.3'
  27. PATH = "${MAVEN_HOME}/bin:${env.PATH}"
  28. GIT_URL = 'http://8.152.195.41:3000/alien/alien_cloud'
  29. GIT_CREDENTIALS = 'zhanghaomimapingzheng'
  30. }
  31. stages {
  32. stage('Checkout') {
  33. steps {
  34. script {
  35. def branch = (params.GIT_BRANCH ?: 'uat-20260202').trim()
  36. if (!branch) {
  37. error('GIT_BRANCH 不能为空')
  38. }
  39. env.GIT_BRANCH = branch
  40. echo ">>> 正在拉取代码... 分支: ${env.GIT_BRANCH}"
  41. git branch: "${env.GIT_BRANCH}",
  42. credentialsId: "${env.GIT_CREDENTIALS}",
  43. url: "${env.GIT_URL}"
  44. sh """
  45. set -e
  46. git fetch origin
  47. git reset --hard origin/${env.GIT_BRANCH}
  48. echo ">>> 当前构建使用的提交:"
  49. git log -1 --oneline
  50. git rev-parse HEAD
  51. """
  52. }
  53. }
  54. }
  55. stage('Prepare Maven Settings') {
  56. steps {
  57. script {
  58. writeFile file: 'settings.xml', text: """<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  59. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  60. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  61. <profiles>
  62. <profile>
  63. <id>repo-mix</id>
  64. <repositories>
  65. <repository>
  66. <id>central</id>
  67. <name>Maven Central</name>
  68. <url>https://repo.maven.apache.org/maven2</url>
  69. <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
  70. <snapshots><enabled>false</enabled></snapshots>
  71. </repository>
  72. <repository>
  73. <id>spring-milestones</id>
  74. <name>Spring Milestones</name>
  75. <url>https://repo.spring.io/milestone</url>
  76. <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
  77. <snapshots><enabled>false</enabled></snapshots>
  78. </repository>
  79. <repository>
  80. <id>spring-snapshots</id>
  81. <name>Spring Snapshots</name>
  82. <url>https://repo.spring.io/snapshot</url>
  83. <releases><enabled>false</enabled></releases>
  84. <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
  85. </repository>
  86. </repositories>
  87. <pluginRepositories>
  88. <pluginRepository>
  89. <id>central</id>
  90. <url>https://repo.maven.apache.org/maven2</url>
  91. <releases><enabled>true</enabled></releases>
  92. <snapshots><enabled>false</enabled></snapshots>
  93. </pluginRepository>
  94. <pluginRepository>
  95. <id>spring-milestones</id>
  96. <url>https://repo.spring.io/milestone</url>
  97. <releases><enabled>true</enabled></releases>
  98. <snapshots><enabled>false</enabled></snapshots>
  99. </pluginRepository>
  100. </pluginRepositories>
  101. </profile>
  102. </profiles>
  103. <activeProfiles>
  104. <activeProfile>repo-mix</activeProfile>
  105. </activeProfiles>
  106. </settings>
  107. """
  108. }
  109. echo ">>> 已生成 settings.xml(包含 Spring 官方仓库)"
  110. }
  111. }
  112. stage('Maven Build') {
  113. steps {
  114. script {
  115. def updateFlag = params.FORCE_UPDATE ? '-U' : ''
  116. echo ">>> 开始 Maven 打包(FORCE_UPDATE=${params.FORCE_UPDATE})"
  117. retry(2) {
  118. sh """
  119. set -e
  120. mvn -version
  121. echo ">>> [1/3] 清理代理环境变量 (防止 HTTP 劫持)..."
  122. unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY all_proxy no_proxy NO_PROXY || true
  123. echo ">>> [2/3] 启用 SSL 证书绕过 (防止证书不匹配)..."
  124. export MAVEN_OPTS="-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true"
  125. echo ">>> [3/3] 清理本地仓库缓存 (防止 404 缓存)..."
  126. rm -rf /root/.m2/repository/org/springframework/cloud/spring-cloud-dependencies/Hoxton.SR1 || true
  127. rm -rf /root/.m2/repository/org/springframework/boot/spring-boot-dependencies/2.3.2.RELEASE || true
  128. rm -rf ${WORKSPACE}/.m2/repository/org/springframework/cloud/spring-cloud-dependencies/Hoxton.SR1 || true
  129. rm -rf ${WORKSPACE}/.m2/repository/org/springframework/boot/spring-boot-dependencies/2.3.2.RELEASE || true
  130. echo ">>> 执行 Maven 打包..."
  131. mvn clean package -DskipTests -s settings.xml ${updateFlag} -e -Dmaven.repo.local=${WORKSPACE}/.m2/repository
  132. """
  133. }
  134. }
  135. }
  136. }
  137. stage('Deploy Services') {
  138. steps {
  139. script {
  140. def services = [
  141. "alien-gateway:gateway-uat",
  142. "alien-job:job-uat",
  143. "alien-lawyer:lawyer-uat",
  144. "alien-second:second-uat",
  145. "alien-store:store-uat",
  146. "alien-dining:dining-uat",
  147. "alien-store-platform:store-platform-uat"
  148. ]
  149. for (item in services) {
  150. def (moduleName, dirName) = item.split(':')
  151. def sourceJar = "${env.WORKSPACE}/${moduleName}/target/${moduleName}-1.0.0.jar"
  152. def sourceLib = "${env.WORKSPACE}/${moduleName}/target/lib"
  153. def targetDir = "/app_deploy_uat/${dirName}"
  154. sh """
  155. set -e
  156. echo ">>> 正在处理模块: ${moduleName}"
  157. if [ -f "${sourceJar}" ]; then
  158. mkdir -p "${targetDir}"
  159. if [ -d "${sourceLib}" ]; then
  160. rm -rf "${targetDir}/lib"
  161. cp -rf "${sourceLib}" "${targetDir}"
  162. fi
  163. cp -f "${sourceJar}" "${targetDir}/"
  164. if docker ps -a --format '{{.Names}}' | grep -wq "${dirName}"; then
  165. docker restart "${dirName}"
  166. echo ">>> [${dirName}] 重启成功"
  167. else
  168. echo ">>> [${dirName}] 容器不存在,仅完成文件拷贝"
  169. fi
  170. else
  171. echo ">>> [${dirName}] 未发现 Jar 包,跳过"
  172. fi
  173. """
  174. }
  175. }
  176. }
  177. }
  178. }
  179. post {
  180. always {
  181. echo ">>> 构建任务结束"
  182. sh "rm -f settings.xml || true"
  183. }
  184. success {
  185. echo ">>> 流水线执行成功"
  186. }
  187. failure {
  188. echo ">>> 流水线执行失败,请检查 Maven 日志中是否仍有 Download 失败"
  189. }
  190. }
  191. }