stages.k8s.groovy 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. myUtil = { ->
  2. println "hello myUtil"
  3. }
  4. sharedLibsPath = "${env.WORKSPACE}/sharedLibs"
  5. backup_destination = '/var/jenkins_home/backups'
  6. backup_targetFile = 'javaDockerImage.tar'
  7. BACKUP_MAX = 2
  8. generateFullImageUri = {Map DOCKER, String base_branch, String BUILD_NUMBER ->
  9. return "${DOCKER.registry}/${DOCKER.image}:${base_branch}-${BUILD_NUMBER}"
  10. }
  11. generateImageName = {Map DOCKER, String base_branch, String BUILD_NUMBER ->
  12. return "${DOCKER.image}:${base_branch}-${BUILD_NUMBER}"
  13. }
  14. def processString(String content) {
  15. return content
  16. }
  17. def buildJar(Object SERVICE, String path='projdir') {
  18. echo "-----> Building project package ..."
  19. dir(path) {
  20. if (SERVICE.module != null && SERVICE.module.trim())
  21. sh "$MAVEN_HOME/bin/mvn clean package -pl \"${SERVICE.module}\" -am -Dmaven.test.skip=true"
  22. else
  23. sh "$MAVEN_HOME/bin/mvn clean package -Dmaven.test.skip=true"
  24. }
  25. return path
  26. }
  27. @Deprecated
  28. def backup_jar(Object SERVICE, String srcPath, String workingPath='projdir') {
  29. echo "-----> Backup project artifact ..."
  30. def module = SERVICE.module == null ? '' : (SERVICE.module[-1] == '/' ? SERVICE.module : SERVICE.module + '/')
  31. path = "${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/target"
  32. sh """if [ -d ${path} ];
  33. then
  34. echo \"${path} already exists\"
  35. else
  36. mkdir -p ${path}
  37. fi
  38. cp ${workingPath}/${module}${srcPath} ${path}
  39. """
  40. }
  41. def cleanDockerImage(String dockerImgName) {
  42. sh "docker rmi ${dockerImgName}"
  43. }
  44. def backupDockerImage(String dockerImgName) {
  45. echo "-----> Backup artifact(docker image : ${dockerImgName}) ..."
  46. path = "${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}"
  47. sh """
  48. docker save ${dockerImgName} -o ${backup_targetFile}
  49. if [ -d ${path} ];
  50. then
  51. echo \"${path} already exists\"
  52. else
  53. mkdir -p ${path}
  54. mv ${backup_targetFile} ${path}
  55. fi
  56. """
  57. }
  58. def backupK8sConfigs(String[] files2backup) {
  59. path = "${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/k8s"
  60. sh """if [ -d ${path} ];
  61. then
  62. echo \"${path} already exists!\"
  63. else
  64. mkdir -p ${path}
  65. fi
  66. """
  67. for(file in files2backup) {
  68. sh "cp -r ${file} ${path}"
  69. }
  70. }
  71. def cleanJar(String path='projdir') {
  72. echo "-----> Cleaning project package ..."
  73. dir(path){
  74. sh '$MAVEN_HOME/bin/mvn clean'
  75. }
  76. return path
  77. }
  78. def generateDockerfile(Object SERVICE, String pathOfDockerfile='projdir') {
  79. def module = SERVICE.module == null ? '' : (SERVICE.module[-1] == '/' ? SERVICE.module : SERVICE.module + '/')
  80. echo "-----> Generating Dockerfile: ${pathOfDockerfile}/Dockerfile ..."
  81. sh """cat > ${pathOfDockerfile}/Dockerfile<<EOF
  82. FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-jdk-alpine as final
  83. # ADD skywalking-agent /app/skywalking-agent
  84. ADD ${module}target/${SERVICE.jar} /app/target/${SERVICE.jar}
  85. EOF
  86. """
  87. return pathOfDockerfile
  88. }
  89. def buildDockerImage(Object SERVICE, Object DOCKER, String base_branch, projDir='projdir', String filter2Remove=null) {
  90. def imageUri = generateFullImageUri(DOCKER, base_branch, BUILD_NUMBER)
  91. echo "-----> Building docker image: ${imageUri} ..."
  92. dir(projDir) {
  93. docker.withRegistry("http://${DOCKER.registry}", "${DOCKER.push_credentialId}") {
  94. def imageName = generateImageName(DOCKER, base_branch, BUILD_NUMBER)
  95. def image = docker.build(imageName)
  96. image.push()
  97. sh "docker rmi ${imageName}"
  98. if(filter2Remove != null)
  99. sh "docker image prune --filter label=${filter2Remove} -f"
  100. }
  101. }
  102. return imageUri
  103. }
  104. def restoreDockerImage(Object DOCKER, String workspace, String base_branch, String rollbackBuildNumber) {
  105. dir(workspace) {
  106. imageUri = generateFullImageUri(DOCKER, base_branch, rollbackBuildNumber)
  107. sh "docker load -i ${backup_targetFile}"
  108. docker.withRegistry("http://${DOCKER.registry}", "${DOCKER.push_credentialId}") {
  109. def image = docker.image(imageUri)
  110. image.push()
  111. }
  112. }
  113. return imageUri
  114. }
  115. // 灰度发布: 部署Canary版本pod
  116. // version: release or canary
  117. def deployCanaryWithConfigmapEnvOnly(SERVICE, K3S, String base_branch, String[] args, String version, namespace='default') {
  118. print "loading ${sharedLibsPath}/k3sUtil.groovy ..."
  119. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  120. def configmap_env_name = k3sUtils.applyCanaryConfigMapEnv(SERVICE, K3S, version, "./configmap-env.ini", namespace)
  121. print "get configmap_env_name: ${configmap_env_name}"
  122. def java_args = '['
  123. args.each{item -> java_args += "\"$item\", "}
  124. java_args = java_args[0..-2] + ']'
  125. kvs = [:]
  126. kvs.put('<namespace>', namespace)
  127. kvs.put('<service_name>', SERVICE.name)
  128. kvs.put('<service_version>', SERVICE.version)
  129. kvs.put('<gray_version>', version)
  130. kvs.put('<release>', base_branch)
  131. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  132. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  133. kvs.put('<docker_image>', imageUri)
  134. kvs.put('<java_args>', java_args)
  135. if (SERVICE.health != null)
  136. kvs.put('<service_health>', SERVICE.health)
  137. kvs.put('<configmap_env_name>', configmap_env_name)
  138. def canaryDeploy = k3sUtils.generateCanaryDeployment(kvs, version, "./deployment.yaml")
  139. k3sUtils.applyDeployment(K3S, canaryDeploy)
  140. def canaryService = k3sUtils.generateCanaryService(kvs, version, "service.yaml")
  141. k3sUtils.applyService(K3S, canaryService)
  142. }
  143. def deployWithConfigmapEnvOnly(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  144. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  145. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  146. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  147. def java_args = '['
  148. args.each{item -> java_args += "\"$item\","}
  149. java_args = java_args[0..-2] + ']'
  150. kvs = [:]
  151. kvs.put('<service_name>', SERVICE.name)
  152. kvs.put('<service_version>', SERVICE.version)
  153. kvs.put('<release>', base_branch)
  154. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  155. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  156. kvs.put('<docker_image>', imageUri)
  157. kvs.put('<java_args>', java_args)
  158. if (SERVICE.health != null)
  159. kvs.put('<service_health>', SERVICE.health)
  160. kvs.put('<configmap_env_name>', configmap_env_name)
  161. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  162. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  163. k3sUtils.generateService(kvs, 'service.yaml')
  164. k3sUtils.applyService(K3S, 'service.yaml')
  165. }
  166. def deployWithConfigmapEnvOnly_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  167. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  168. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  169. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  170. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  171. def java_args = '['
  172. args.each{item -> java_args += "\"$item\","}
  173. java_args = java_args[0..-2] + ']'
  174. kvs = [:]
  175. kvs.put('<service_name>', SERVICE.name)
  176. kvs.put('<service_version>', SERVICE.version)
  177. kvs.put('<release>', BASE_BRANCH)
  178. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  179. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  180. kvs.put('<docker_image>', imageUri)
  181. kvs.put('<java_args>', java_args)
  182. if (SERVICE.health != null)
  183. kvs.put('<service_health>', SERVICE.health)
  184. kvs.put('<configmap_env_name>', configmap_env_name)
  185. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  186. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  187. k3sUtils.generateService(kvs, 'service.yaml')
  188. k3sUtils.applyService(K3S, 'service.yaml')
  189. }
  190. }
  191. def deployWithConfigmapEnvOnly2nd(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  192. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  193. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  194. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  195. def java_args = '['
  196. args.each{item -> java_args += "\"$item\","}
  197. java_args = java_args[0..-2] + ']'
  198. kvs = [:]
  199. kvs.put('<service_name>', SERVICE.name)
  200. kvs.put('<service_version>', SERVICE.version)
  201. kvs.put('<release>', base_branch)
  202. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  203. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  204. kvs.put('<docker_image>', imageUri)
  205. kvs.put('<java_args>', java_args)
  206. if (SERVICE.health != null)
  207. kvs.put('<service_health>', SERVICE.health)
  208. kvs.put('<configmap_env_name>', configmap_env_name)
  209. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  210. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  211. k3sUtils.generateService(kvs, 'service2.yaml')
  212. k3sUtils.applyService(K3S, 'service2.yaml')
  213. }
  214. def deployWithConfigmapEnvOnly2nd_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  215. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  216. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  217. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  218. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  219. def java_args = '['
  220. args.each{item -> java_args += "\"$item\","}
  221. java_args = java_args[0..-2] + ']'
  222. kvs = [:]
  223. kvs.put('<service_name>', SERVICE.name)
  224. kvs.put('<service_version>', SERVICE.version)
  225. kvs.put('<release>', BASE_BRANCH)
  226. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  227. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  228. kvs.put('<docker_image>', imageUri)
  229. kvs.put('<java_args>', java_args)
  230. if (SERVICE.health != null)
  231. kvs.put('<service_health>', SERVICE.health)
  232. kvs.put('<configmap_env_name>', configmap_env_name)
  233. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  234. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  235. k3sUtils.generateService(kvs, 'service2.yaml')
  236. k3sUtils.applyService(K3S, 'service2.yaml')
  237. }
  238. }
  239. def deployWithConfigmaps_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  240. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  241. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  242. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  243. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  244. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  245. def java_args = '['
  246. args.each{item -> java_args += "\"$item\","}
  247. java_args = java_args[0..-2] + ']'
  248. kvs = [:]
  249. kvs.put('<service_name>', SERVICE.name)
  250. kvs.put('<service_version>', SERVICE.version)
  251. kvs.put('<release>', BASE_BRANCH)
  252. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  253. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  254. kvs.put('<docker_image>', imageUri)
  255. kvs.put('<java_args>', java_args)
  256. if (SERVICE.health != null)
  257. kvs.put('<service_health>', SERVICE.health)
  258. kvs.put('<configmap_env_name>', configmap_env_name)
  259. kvs.put('<configmap_conf_name>', configmap_conf_name)
  260. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  261. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  262. k3sUtils.generateService(kvs, 'service.yaml')
  263. k3sUtils.applyService(K3S, 'service.yaml')
  264. }
  265. }
  266. // 灰度发布: 部署Canary版本pod
  267. // version: release or canary
  268. def deployCanaryWithConfigmaps(SERVICE, K3S, String base_branch, String[] args, String version, namespace = "default") {
  269. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  270. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  271. def configmap_env_name = k3sUtils.applyCanaryConfigMapEnv(SERVICE, K3S, version, "./configmap-env.ini")
  272. def configmap_conf_name = k3sUtils.applyCanaryConfigMapConfig(SERVICE, K3S, version, "./configmap")
  273. def java_args = '['
  274. args.each{item -> java_args += "\"$item\","}
  275. java_args = java_args[0..-2] + ']'
  276. def kvs = [:]
  277. kvs.put('<namespace>', namespace)
  278. kvs.put('<service_name>', SERVICE.name)
  279. kvs.put('<service_version>', SERVICE.version)
  280. kvs.put('<gray_version>', version)
  281. kvs.put('<release>', base_branch)
  282. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  283. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  284. kvs.put('<docker_image>', imageUri)
  285. kvs.put('<java_args>', java_args)
  286. if (SERVICE.health != null)
  287. kvs.put('<service_health>', SERVICE.health)
  288. kvs.put('<configmap_env_name>', configmap_env_name)
  289. kvs.put('<configmap_conf_name>', configmap_conf_name)
  290. def canaryDeploy = k3sUtils.generateCanaryDeployment(kvs, version, "./deployment.yaml")
  291. k3sUtils.applyDeployment(K3S, canaryDeploy)
  292. def canaryService = k3sUtils.generateCanaryService(kvs, version, "service.yaml")
  293. k3sUtils.applyService(K3S, canaryService)
  294. }
  295. def deployWithConfigmaps(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  296. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  297. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  298. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  299. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  300. def java_args = '['
  301. args.each{item -> java_args += "\"$item\","}
  302. java_args = java_args[0..-2] + ']'
  303. kvs = [:]
  304. kvs.put('<service_name>', SERVICE.name)
  305. kvs.put('<service_version>', SERVICE.version)
  306. kvs.put('<release>', base_branch)
  307. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  308. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  309. kvs.put('<docker_image>', imageUri)
  310. kvs.put('<java_args>', java_args)
  311. if (SERVICE.health != null)
  312. kvs.put('<service_health>', SERVICE.health)
  313. kvs.put('<configmap_env_name>', configmap_env_name)
  314. kvs.put('<configmap_conf_name>', configmap_conf_name)
  315. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  316. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  317. k3sUtils.generateService(kvs, 'service.yaml')
  318. k3sUtils.applyService(K3S, 'service.yaml')
  319. }
  320. def deployWithConfigmapsWithNameSpace(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap", namespace = "default") {
  321. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  322. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  323. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  324. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  325. def java_args = '['
  326. args.each{item -> java_args += "\"$item\","}
  327. java_args = java_args[0..-2] + ']'
  328. kvs = [:]
  329. kvs.put('<namespace>', namespace)
  330. kvs.put('<service_name>', SERVICE.name)
  331. kvs.put('<service_version>', SERVICE.version)
  332. kvs.put('<release>', base_branch)
  333. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  334. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  335. kvs.put('<docker_image>', imageUri)
  336. kvs.put('<java_args>', java_args)
  337. if (SERVICE.health != null)
  338. kvs.put('<service_health>', SERVICE.health)
  339. kvs.put('<configmap_env_name>', configmap_env_name)
  340. kvs.put('<configmap_conf_name>', configmap_conf_name)
  341. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  342. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  343. k3sUtils.generateService(kvs, 'service.yaml')
  344. k3sUtils.applyService(K3S, 'service.yaml')
  345. }
  346. def deployWithConfigmaps2nd(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  347. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  348. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  349. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  350. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  351. def java_args = '['
  352. args.each{item -> java_args += "\"$item\","}
  353. java_args = java_args[0..-2] + ']'
  354. kvs = [:]
  355. kvs.put('<service_name>', SERVICE.name)
  356. kvs.put('<service_version>', SERVICE.version)
  357. kvs.put('<release>', base_branch)
  358. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  359. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  360. kvs.put('<docker_image>', imageUri)
  361. kvs.put('<java_args>', java_args)
  362. if (SERVICE.health != null)
  363. kvs.put('<service_health>', SERVICE.health)
  364. kvs.put('<configmap_env_name>', configmap_env_name)
  365. kvs.put('<configmap_conf_name>', configmap_conf_name)
  366. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  367. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  368. k3sUtils.generateService(kvs, 'service2.yaml')
  369. k3sUtils.applyService(K3S, 'service2.yaml')
  370. }
  371. def execute(CONFIG, base_branch, closures=[:]) { //配置文件,当前分支,自定义闭包
  372. stage('source code check out') {
  373. println "loading ${sharedLibsPath}/gitUtil.groovy..." //打印信息共享库路径,变量路径,存储加载的录像本身地址,脚本名称
  374. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy" //load方法加载对象,赋值给gitUtils
  375. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE() //定义变量,为空则调用git配置中git仓库信息branch当前分支,不空调用自定义闭包
  376. }
  377. stage("docker image build") {
  378. def projDir = 'projdir' //定义变量,项目目录
  379. if (closures.BUILDJAR != null) //检查是否自定义闭包,有就使用,没有就使用默认方法
  380. projDir = closures.BUILDJAR()
  381. else
  382. projDir = buildJar(CONFIG.service, projDir) //default
  383. if (closures.BACKUP != null)
  384. closures.BACKUP()
  385. if (closures.GENERATEDOCKERFILE != null)
  386. projDir = closures.GENERATEDOCKERFILE()
  387. else
  388. projDir = generateDockerfile(CONFIG.service) //default
  389. if (closures.BUILDIMAGE != null)
  390. imageUri = closures.BUILDIMAGE()
  391. else
  392. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir)
  393. if (closures.CLEANJAR != null)
  394. closures.CLEANJAR()
  395. else
  396. cleanJar(projDir)
  397. }
  398. stage("notify when build") {
  399. //notifywhenbuild(base_branch, CONFIG.service.name)
  400. }
  401. stage("apply K8S ConfigMaps && Deployment") {
  402. if (closures.K3SDEPLOY != null) {
  403. closures.K3SDEPLOY()
  404. return
  405. }
  406. }
  407. }
  408. // 灰度发布: 部署release版本pod
  409. def deployReleaseWithConfigmaps(SERVICE, K3S, String BASE_BRANCH, String[] args, namespace='default') {
  410. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  411. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  412. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  413. def configmap_env_name = k3sUtils.applyCanaryConfigMapEnv(SERVICE, K3S, 'release', "./configmap-env.ini")
  414. def configmap_conf_name = k3sUtils.applyCanaryConfigMapConfig(SERVICE, K3S, 'release', "./configmap")
  415. def java_args = '['
  416. args.each{item -> java_args += "\"$item\","}
  417. java_args = java_args[0..-2] + ']'
  418. def kvs = [:]
  419. kvs.put('<namespace>', namespace)
  420. kvs.put('<service_name>', SERVICE.name)
  421. kvs.put('<service_version>', SERVICE.version)
  422. kvs.put('<gray_version>', 'release')
  423. kvs.put('<release>', BASE_BRANCH)
  424. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  425. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  426. kvs.put('<docker_image>', imageUri)
  427. kvs.put('<java_args>', java_args)
  428. if (SERVICE.health != null)
  429. kvs.put('<service_health>', SERVICE.health)
  430. kvs.put('<configmap_env_name>', configmap_env_name)
  431. kvs.put('<configmap_conf_name>', configmap_conf_name)
  432. def releaseDeploy = k3sUtils.generateCanaryDeployment(kvs, 'release', 'deployment.yaml')
  433. k3sUtils.applyDeployment(K3S, releaseDeploy)
  434. def releaseService = k3sUtils.generateCanaryService(kvs, 'release', 'service.yaml')
  435. k3sUtils.applyService(K3S, releaseService)
  436. }
  437. }
  438. def upgrade_release(Object CONFIG, String base_branch, closures = [:]) {
  439. stage('find latest Canary version') {
  440. def basePath = "${backup_destination}/${JOB_NAME}"
  441. def baseDir = new File(basePath)
  442. if (!baseDir.exists() || !baseDir.isDirectory()) {
  443. error "Path does not exist or is not a directory: ${basePath}"
  444. return
  445. }
  446. latestDir = baseDir
  447. .listFiles()
  448. ?.findAll { f ->
  449. f.isDirectory() && (f.name ==~ /^\d+$/)
  450. }
  451. ?.max { it.lastModified() }
  452. rollbackBuildNumber = latestDir.name
  453. }
  454. // 2. docker image build
  455. stage("docker image restore") {
  456. envFile = new File("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/env")
  457. def lines = envFile.readLines()
  458. COMMIT_SHA = lines[0]
  459. BASE_BRANCH = lines[1]
  460. def path = "${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}"
  461. print("restore docker image from rollbackBuildNo. #${rollbackBuildNumber}")
  462. imageUri = restoreDockerImage(CONFIG.docker, path, BASE_BRANCH, rollbackBuildNumber)
  463. // cleanDockerImage(imageUri)
  464. }
  465. stage("apply Release(Canary:${rollbackBuildNumber}) K8S ConfigMaps && Deployment") {
  466. if (closures.K3SDEPLOY != null)
  467. closures.K3SDEPLOY()
  468. }
  469. stage("Post Execution Script") {
  470. // print "Clear rollback workspace"
  471. // 清理rollback工作目录
  472. // dir("${backup_destination}/${JOB_NAME}") {
  473. // sh "rm -rf *@tmp"
  474. // }
  475. }
  476. }
  477. def upgrade(Object CONFIG, String base_branch, String[] k8sBackupFiles, closures=[:]) {
  478. stage('source code check out') {
  479. println "loading ${sharedLibsPath}/gitUtil.groovy..."
  480. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy"
  481. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE()
  482. if (closures.POST_GITCLONE != null)
  483. closures.POST_GITCLONE()
  484. }
  485. stage("docker image build") {
  486. def projDir = 'projdir'
  487. if (closures.BUILDJAR != null)
  488. projDir = closures.BUILDJAR()
  489. else
  490. projDir = buildJar(CONFIG.service, projDir) //default
  491. if (closures.GENERATEDOCKERFILE != null)
  492. projDir = closures.GENERATEDOCKERFILE()
  493. else
  494. projDir = generateDockerfile(CONFIG.service) //default
  495. if (closures.BUILDIMAGE != null)
  496. imageUri = closures.BUILDIMAGE()
  497. else
  498. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir)
  499. if (closures.CLEANJAR != null)
  500. closures.CLEANJAR()
  501. else
  502. cleanJar(projDir)
  503. if (k8sBackupFiles != null && k8sBackupFiles.size() > 0) {
  504. backupDockerImage(imageUri)
  505. envFile = new File("${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/env")
  506. envFile << "${COMMIT_SHA}\n"
  507. envFile << "${base_branch}\n"
  508. }
  509. cleanDockerImage(imageUri)
  510. }
  511. stage("apply K8S ConfigMaps && Deployment") {
  512. if (k8sBackupFiles != null && k8sBackupFiles.size() > 0)
  513. backupK8sConfigs(k8sBackupFiles)
  514. if (closures.K3SDEPLOY != null) {
  515. closures.K3SDEPLOY()
  516. return
  517. }
  518. }
  519. stage("notify when build") {
  520. if (closures.BUILDINFO != null) {
  521. def buildInfo = closures.ALLCHANGES()
  522. if (buildInfo.length() > 800) {
  523. buildInfo = buildInfo.substring(buildInfo.length() - 800)
  524. }
  525. def title = closures.BUILDINFO()+"正在发布"
  526. def content = "变更:"+buildInfo+"\\n"+
  527. "分支:"+base_branch+"\\n"+
  528. "版本:"+BUILD_NUMBER+"\\n"
  529. sendGroupNotification(title, content)
  530. }
  531. }
  532. stage("Post Execution Script") {
  533. print "Clear older backup version"
  534. // 清理旧的备份
  535. dir("${backup_destination}/${JOB_NAME}") {
  536. sh """
  537. save_file=`ls -ltr | tail -${BACKUP_MAX} | awk '{print \$NF}'`
  538. ls | grep -v "\$save_file" | xargs rm -rf
  539. """
  540. }
  541. }
  542. }
  543. def rollback(CONFIG, rollbackBuildNumber, closures=[:]) {
  544. // 1. restore specified version
  545. path = "${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}"
  546. if (fileExists(path)) {
  547. stage('source code check out') {
  548. print("souce code check out. Skipped!")
  549. }
  550. envFile = new File("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/env")
  551. def lines = envFile.readLines()
  552. COMMIT_SHA = lines[0]
  553. BASE_BRANCH = lines[1]
  554. // 2. docker image build
  555. stage("docker image build") {
  556. print("restore docker image from rollbackNo. #${rollbackBuildNumber}")
  557. imageUri = restoreDockerImage(CONFIG.docker, path, BASE_BRANCH, rollbackBuildNumber)
  558. cleanDockerImage(imageUri)
  559. }
  560. // 3. k8s configmap && deployment apply
  561. stage("apply K8S ConfigMaps && Deployment") {
  562. if (closures.K3SDEPLOY != null)
  563. closures.K3SDEPLOY()
  564. }
  565. stage("Post Execution Script") {
  566. print "Clear rollback workspace"
  567. // 清理rollback工作目录
  568. dir("${backup_destination}/${JOB_NAME}") {
  569. sh "rm -rf *@tmp"
  570. }
  571. }
  572. }
  573. }
  574. def sendGroupNotification(String title, String content) {
  575. WECHAT_ROBOT_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=92059925-97db-4830-8438-1514a246a143"
  576. stage('Send Message') {
  577. // 构建要发送的企业微信消息
  578. def message = """
  579. {
  580. "msgtype": "text",
  581. "text": {
  582. "content": "【${title}】\n${content}"
  583. }
  584. }
  585. """
  586. // 发送消息到企业微信
  587. sh """
  588. curl -X POST -H 'Content-Type: application/json' -d '${message}' ${WECHAT_ROBOT_URL}
  589. """
  590. }
  591. }
  592. return this