3
0

stages.k8s.groovy 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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('<namespace>', namespace)
  152. kvs.put('<service_name>', SERVICE.name)
  153. kvs.put('<service_version>', SERVICE.version)
  154. kvs.put('<release>', base_branch)
  155. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  156. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  157. kvs.put('<docker_image>', imageUri)
  158. kvs.put('<java_args>', java_args)
  159. if (SERVICE.health != null)
  160. kvs.put('<service_health>', SERVICE.health)
  161. kvs.put('<configmap_env_name>', configmap_env_name)
  162. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  163. k3sUtils.applyDeployment(K3S, 'deployment.yaml', namespace)
  164. k3sUtils.generateService(kvs, 'service.yaml')
  165. k3sUtils.applyService(K3S, 'service.yaml', namespace)
  166. }
  167. def deployWithConfigmapEnvOnly_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  168. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  169. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  170. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  171. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  172. def java_args = '['
  173. args.each{item -> java_args += "\"$item\","}
  174. java_args = java_args[0..-2] + ']'
  175. kvs = [:]
  176. kvs.put('<service_name>', SERVICE.name)
  177. kvs.put('<service_version>', SERVICE.version)
  178. kvs.put('<release>', BASE_BRANCH)
  179. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  180. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  181. kvs.put('<docker_image>', imageUri)
  182. kvs.put('<java_args>', java_args)
  183. if (SERVICE.health != null)
  184. kvs.put('<service_health>', SERVICE.health)
  185. kvs.put('<configmap_env_name>', configmap_env_name)
  186. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  187. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  188. k3sUtils.generateService(kvs, 'service.yaml')
  189. k3sUtils.applyService(K3S, 'service.yaml')
  190. }
  191. }
  192. def deployWithConfigmapEnvOnly2nd(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  193. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  194. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  195. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  196. def java_args = '['
  197. args.each{item -> java_args += "\"$item\","}
  198. java_args = java_args[0..-2] + ']'
  199. kvs = [:]
  200. kvs.put('<service_name>', SERVICE.name)
  201. kvs.put('<service_version>', SERVICE.version)
  202. kvs.put('<release>', base_branch)
  203. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  204. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  205. kvs.put('<docker_image>', imageUri)
  206. kvs.put('<java_args>', java_args)
  207. if (SERVICE.health != null)
  208. kvs.put('<service_health>', SERVICE.health)
  209. kvs.put('<configmap_env_name>', configmap_env_name)
  210. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  211. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  212. k3sUtils.generateService(kvs, 'service2.yaml')
  213. k3sUtils.applyService(K3S, 'service2.yaml')
  214. }
  215. def deployWithConfigmapEnvOnly2nd_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", namespace='default') {
  216. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  217. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  218. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  219. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv, namespace)
  220. def java_args = '['
  221. args.each{item -> java_args += "\"$item\","}
  222. java_args = java_args[0..-2] + ']'
  223. kvs = [:]
  224. kvs.put('<service_name>', SERVICE.name)
  225. kvs.put('<service_version>', SERVICE.version)
  226. kvs.put('<release>', BASE_BRANCH)
  227. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  228. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  229. kvs.put('<docker_image>', imageUri)
  230. kvs.put('<java_args>', java_args)
  231. if (SERVICE.health != null)
  232. kvs.put('<service_health>', SERVICE.health)
  233. kvs.put('<configmap_env_name>', configmap_env_name)
  234. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  235. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  236. k3sUtils.generateService(kvs, 'service2.yaml')
  237. k3sUtils.applyService(K3S, 'service2.yaml')
  238. }
  239. }
  240. def deployWithConfigmaps_rollback(SERVICE, K3S, String rollbackBuildNumber, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  241. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  242. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  243. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  244. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  245. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  246. def java_args = '['
  247. args.each{item -> java_args += "\"$item\","}
  248. java_args = java_args[0..-2] + ']'
  249. kvs = [:]
  250. kvs.put('<service_name>', SERVICE.name)
  251. kvs.put('<service_version>', SERVICE.version)
  252. kvs.put('<release>', BASE_BRANCH)
  253. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  254. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  255. kvs.put('<docker_image>', imageUri)
  256. kvs.put('<java_args>', java_args)
  257. if (SERVICE.health != null)
  258. kvs.put('<service_health>', SERVICE.health)
  259. kvs.put('<configmap_env_name>', configmap_env_name)
  260. kvs.put('<configmap_conf_name>', configmap_conf_name)
  261. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  262. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  263. k3sUtils.generateService(kvs, 'service.yaml')
  264. k3sUtils.applyService(K3S, 'service.yaml')
  265. }
  266. }
  267. // 灰度发布: 部署Canary版本pod
  268. // version: release or canary
  269. def deployCanaryWithConfigmaps(SERVICE, K3S, String base_branch, String[] args, String version, namespace = "default") {
  270. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  271. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  272. def configmap_env_name = k3sUtils.applyCanaryConfigMapEnv(SERVICE, K3S, version, "./configmap-env.ini")
  273. def configmap_conf_name = k3sUtils.applyCanaryConfigMapConfig(SERVICE, K3S, version, "./configmap")
  274. def java_args = '['
  275. args.each{item -> java_args += "\"$item\","}
  276. java_args = java_args[0..-2] + ']'
  277. def kvs = [:]
  278. kvs.put('<namespace>', namespace)
  279. kvs.put('<service_name>', SERVICE.name)
  280. kvs.put('<service_version>', SERVICE.version)
  281. kvs.put('<gray_version>', version)
  282. kvs.put('<release>', base_branch)
  283. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  284. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  285. kvs.put('<docker_image>', imageUri)
  286. kvs.put('<java_args>', java_args)
  287. if (SERVICE.health != null)
  288. kvs.put('<service_health>', SERVICE.health)
  289. kvs.put('<configmap_env_name>', configmap_env_name)
  290. kvs.put('<configmap_conf_name>', configmap_conf_name)
  291. def canaryDeploy = k3sUtils.generateCanaryDeployment(kvs, version, "./deployment.yaml")
  292. k3sUtils.applyDeployment(K3S, canaryDeploy)
  293. def canaryService = k3sUtils.generateCanaryService(kvs, version, "service.yaml")
  294. k3sUtils.applyService(K3S, canaryService)
  295. }
  296. def deployWithConfigmaps(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  297. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  298. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  299. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  300. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  301. def java_args = '['
  302. args.each{item -> java_args += "\"$item\","}
  303. java_args = java_args[0..-2] + ']'
  304. kvs = [:]
  305. kvs.put('<service_name>', SERVICE.name)
  306. kvs.put('<service_version>', SERVICE.version)
  307. kvs.put('<release>', base_branch)
  308. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  309. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  310. kvs.put('<docker_image>', imageUri)
  311. kvs.put('<java_args>', java_args)
  312. if (SERVICE.health != null)
  313. kvs.put('<service_health>', SERVICE.health)
  314. kvs.put('<configmap_env_name>', configmap_env_name)
  315. kvs.put('<configmap_conf_name>', configmap_conf_name)
  316. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  317. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  318. k3sUtils.generateService(kvs, 'service.yaml')
  319. k3sUtils.applyService(K3S, 'service.yaml')
  320. }
  321. def deployWithConfigmapsWithNameSpace(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap", namespace = "default") {
  322. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  323. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  324. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  325. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  326. def java_args = '['
  327. args.each{item -> java_args += "\"$item\","}
  328. java_args = java_args[0..-2] + ']'
  329. kvs = [:]
  330. kvs.put('<namespace>', namespace)
  331. kvs.put('<service_name>', SERVICE.name)
  332. kvs.put('<service_version>', SERVICE.version)
  333. kvs.put('<release>', base_branch)
  334. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  335. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  336. kvs.put('<docker_image>', imageUri)
  337. kvs.put('<java_args>', java_args)
  338. if (SERVICE.health != null)
  339. kvs.put('<service_health>', SERVICE.health)
  340. kvs.put('<configmap_env_name>', configmap_env_name)
  341. kvs.put('<configmap_conf_name>', configmap_conf_name)
  342. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  343. k3sUtils.applyDeployment(K3S, 'deployment.yaml')
  344. k3sUtils.generateService(kvs, 'service.yaml')
  345. k3sUtils.applyService(K3S, 'service.yaml')
  346. }
  347. def deployWithConfigmaps2nd(SERVICE, K3S, String base_branch, String[] args, configmapEnv="./configmap-env.ini", configmapConf="./configmap") {
  348. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  349. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  350. def configmap_env_name = k3sUtils.applyConfigMapEnv(SERVICE, K3S, configmapEnv)
  351. def configmap_conf_name = k3sUtils.applyConfigMapConfig(SERVICE, K3S, configmapConf)
  352. def java_args = '['
  353. args.each{item -> java_args += "\"$item\","}
  354. java_args = java_args[0..-2] + ']'
  355. kvs = [:]
  356. kvs.put('<service_name>', SERVICE.name)
  357. kvs.put('<service_version>', SERVICE.version)
  358. kvs.put('<release>', base_branch)
  359. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  360. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  361. kvs.put('<docker_image>', imageUri)
  362. kvs.put('<java_args>', java_args)
  363. if (SERVICE.health != null)
  364. kvs.put('<service_health>', SERVICE.health)
  365. kvs.put('<configmap_env_name>', configmap_env_name)
  366. kvs.put('<configmap_conf_name>', configmap_conf_name)
  367. k3sUtils.generateDeployment(kvs, 'deployment2.yaml')
  368. k3sUtils.applyDeployment(K3S, 'deployment2.yaml')
  369. k3sUtils.generateService(kvs, 'service2.yaml')
  370. k3sUtils.applyService(K3S, 'service2.yaml')
  371. }
  372. def execute(CONFIG, base_branch, closures=[:]) { //配置文件,当前分支,自定义闭包
  373. stage('source code check out') {
  374. println "loading ${sharedLibsPath}/gitUtil.groovy..." //打印信息共享库路径,变量路径,存储加载的录像本身地址,脚本名称
  375. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy" //load方法加载对象,赋值给gitUtils
  376. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE() //定义变量,为空则调用git配置中git仓库信息branch当前分支,不空调用自定义闭包
  377. }
  378. stage("docker image build") {
  379. def projDir = 'projdir' //定义变量,项目目录
  380. if (closures.BUILDJAR != null) //检查是否自定义闭包,有就使用,没有就使用默认方法
  381. projDir = closures.BUILDJAR()
  382. else
  383. projDir = buildJar(CONFIG.service, projDir) //default
  384. if (closures.BACKUP != null)
  385. closures.BACKUP()
  386. if (closures.GENERATEDOCKERFILE != null)
  387. projDir = closures.GENERATEDOCKERFILE()
  388. else
  389. projDir = generateDockerfile(CONFIG.service) //default
  390. if (closures.BUILDIMAGE != null)
  391. imageUri = closures.BUILDIMAGE()
  392. else
  393. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir)
  394. if (closures.CLEANJAR != null)
  395. closures.CLEANJAR()
  396. else
  397. cleanJar(projDir)
  398. }
  399. stage("notify when build") {
  400. //notifywhenbuild(base_branch, CONFIG.service.name)
  401. }
  402. stage("apply K8S ConfigMaps && Deployment") {
  403. if (closures.K3SDEPLOY != null) {
  404. closures.K3SDEPLOY()
  405. return
  406. }
  407. }
  408. }
  409. // 灰度发布: 部署release版本pod
  410. def deployReleaseWithConfigmaps(SERVICE, K3S, String BASE_BRANCH, String[] args, namespace='default') {
  411. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  412. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  413. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  414. def configmap_env_name = k3sUtils.applyCanaryConfigMapEnv(SERVICE, K3S, 'release', "./configmap-env.ini")
  415. def configmap_conf_name = k3sUtils.applyCanaryConfigMapConfig(SERVICE, K3S, 'release', "./configmap")
  416. def java_args = '['
  417. args.each{item -> java_args += "\"$item\","}
  418. java_args = java_args[0..-2] + ']'
  419. def kvs = [:]
  420. kvs.put('<namespace>', namespace)
  421. kvs.put('<service_name>', SERVICE.name)
  422. kvs.put('<service_version>', SERVICE.version)
  423. kvs.put('<gray_version>', 'release')
  424. kvs.put('<release>', BASE_BRANCH)
  425. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  426. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  427. kvs.put('<docker_image>', imageUri)
  428. kvs.put('<java_args>', java_args)
  429. if (SERVICE.health != null)
  430. kvs.put('<service_health>', SERVICE.health)
  431. kvs.put('<configmap_env_name>', configmap_env_name)
  432. kvs.put('<configmap_conf_name>', configmap_conf_name)
  433. def releaseDeploy = k3sUtils.generateCanaryDeployment(kvs, 'release', 'deployment.yaml')
  434. k3sUtils.applyDeployment(K3S, releaseDeploy)
  435. def releaseService = k3sUtils.generateCanaryService(kvs, 'release', 'service.yaml')
  436. k3sUtils.applyService(K3S, releaseService)
  437. }
  438. }
  439. def upgrade_release(Object CONFIG, String base_branch, closures = [:]) {
  440. stage('find latest Canary version') {
  441. def basePath = "${backup_destination}/${JOB_NAME}"
  442. def baseDir = new File(basePath)
  443. if (!baseDir.exists() || !baseDir.isDirectory()) {
  444. error "Path does not exist or is not a directory: ${basePath}"
  445. return
  446. }
  447. latestDir = baseDir
  448. .listFiles()
  449. ?.findAll { f ->
  450. f.isDirectory() && (f.name ==~ /^\d+$/)
  451. }
  452. ?.max { it.lastModified() }
  453. rollbackBuildNumber = latestDir.name
  454. }
  455. // 2. docker image build
  456. stage("docker image restore") {
  457. envFile = new File("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/env")
  458. def lines = envFile.readLines()
  459. COMMIT_SHA = lines[0]
  460. BASE_BRANCH = lines[1]
  461. def path = "${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}"
  462. print("restore docker image from rollbackBuildNo. #${rollbackBuildNumber}")
  463. imageUri = restoreDockerImage(CONFIG.docker, path, BASE_BRANCH, rollbackBuildNumber)
  464. // cleanDockerImage(imageUri)
  465. }
  466. stage("apply Release(Canary:${rollbackBuildNumber}) K8S ConfigMaps && Deployment") {
  467. if (closures.K3SDEPLOY != null)
  468. closures.K3SDEPLOY()
  469. }
  470. stage("Post Execution Script") {
  471. // print "Clear rollback workspace"
  472. // 清理rollback工作目录
  473. // dir("${backup_destination}/${JOB_NAME}") {
  474. // sh "rm -rf *@tmp"
  475. // }
  476. }
  477. }
  478. def upgrade(Object CONFIG, String base_branch, String[] k8sBackupFiles, closures=[:]) {
  479. stage('source code check out') {
  480. println "loading ${sharedLibsPath}/gitUtil.groovy..."
  481. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy"
  482. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE()
  483. if (closures.POST_GITCLONE != null)
  484. closures.POST_GITCLONE()
  485. }
  486. stage("docker image build") {
  487. def projDir = 'projdir'
  488. if (closures.BUILDJAR != null)
  489. projDir = closures.BUILDJAR()
  490. else
  491. projDir = buildJar(CONFIG.service, projDir) //default
  492. if (closures.GENERATEDOCKERFILE != null)
  493. projDir = closures.GENERATEDOCKERFILE()
  494. else
  495. projDir = generateDockerfile(CONFIG.service) //default
  496. if (closures.BUILDIMAGE != null)
  497. imageUri = closures.BUILDIMAGE()
  498. else
  499. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir)
  500. if (closures.CLEANJAR != null)
  501. closures.CLEANJAR()
  502. else
  503. cleanJar(projDir)
  504. if (k8sBackupFiles != null && k8sBackupFiles.size() > 0) {
  505. backupDockerImage(imageUri)
  506. envFile = new File("${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/env")
  507. envFile << "${COMMIT_SHA}\n"
  508. envFile << "${base_branch}\n"
  509. }
  510. cleanDockerImage(imageUri)
  511. }
  512. stage("apply K8S ConfigMaps && Deployment") {
  513. if (k8sBackupFiles != null && k8sBackupFiles.size() > 0)
  514. backupK8sConfigs(k8sBackupFiles)
  515. if (closures.K3SDEPLOY != null) {
  516. closures.K3SDEPLOY()
  517. return
  518. }
  519. }
  520. stage("notify when build") {
  521. if (closures.BUILDINFO != null) {
  522. def buildInfo = closures.ALLCHANGES()
  523. if (buildInfo.length() > 800) {
  524. buildInfo = buildInfo.substring(buildInfo.length() - 800)
  525. }
  526. def title = closures.BUILDINFO()+"正在发布"
  527. def content = "变更:"+buildInfo+"\\n"+
  528. "分支:"+base_branch+"\\n"+
  529. "版本:"+BUILD_NUMBER+"\\n"
  530. sendGroupNotification(title, content)
  531. }
  532. }
  533. stage("Post Execution Script") {
  534. print "Clear older backup version"
  535. // 清理旧的备份
  536. dir("${backup_destination}/${JOB_NAME}") {
  537. sh """
  538. save_file=`ls -ltr | tail -${BACKUP_MAX} | awk '{print \$NF}'`
  539. ls | grep -v "\$save_file" | xargs rm -rf
  540. """
  541. }
  542. }
  543. }
  544. def rollback(CONFIG, rollbackBuildNumber, closures=[:]) {
  545. // 1. restore specified version
  546. path = "${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}"
  547. if (fileExists(path)) {
  548. stage('source code check out') {
  549. print("souce code check out. Skipped!")
  550. }
  551. envFile = new File("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/env")
  552. def lines = envFile.readLines()
  553. COMMIT_SHA = lines[0]
  554. BASE_BRANCH = lines[1]
  555. // 2. docker image build
  556. stage("docker image build") {
  557. print("restore docker image from rollbackNo. #${rollbackBuildNumber}")
  558. imageUri = restoreDockerImage(CONFIG.docker, path, BASE_BRANCH, rollbackBuildNumber)
  559. cleanDockerImage(imageUri)
  560. }
  561. // 3. k8s configmap && deployment apply
  562. stage("apply K8S ConfigMaps && Deployment") {
  563. if (closures.K3SDEPLOY != null)
  564. closures.K3SDEPLOY()
  565. }
  566. stage("Post Execution Script") {
  567. print "Clear rollback workspace"
  568. // 清理rollback工作目录
  569. dir("${backup_destination}/${JOB_NAME}") {
  570. sh "rm -rf *@tmp"
  571. }
  572. }
  573. }
  574. }
  575. def sendGroupNotification(String title, String content) {
  576. WECHAT_ROBOT_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=92059925-97db-4830-8438-1514a246a143"
  577. stage('Send Message') {
  578. // 构建要发送的企业微信消息
  579. def message = """
  580. {
  581. "msgtype": "text",
  582. "text": {
  583. "content": "【${title}】\n${content}"
  584. }
  585. }
  586. """
  587. // 发送消息到企业微信
  588. sh """
  589. curl -X POST -H 'Content-Type: application/json' -d '${message}' ${WECHAT_ROBOT_URL}
  590. """
  591. }
  592. }
  593. return this