stages.nodejs.groovy 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. sharedLibsPath = "${env.WORKSPACE}/sharedLibs"
  2. backup_destination = '/var/jenkins_home/backups'
  3. backup_targetFile = 'dockerImage.tar'
  4. generateFullImageUri = {Map DOCKER, String base_branch, String BUILD_NUMBER ->
  5. return "${DOCKER.registry}/${DOCKER.image}:${base_branch}-${BUILD_NUMBER}"
  6. }
  7. generateImageName = {Map DOCKER, String base_branch, String BUILD_NUMBER ->
  8. return "${DOCKER.image}:${base_branch}-${BUILD_NUMBER}"
  9. }
  10. def generateImageName(String imageName, String base_branch, String BUILD_NUMBER) {
  11. return "${imageName}:${base_branch}-${BUILD_NUMBER}"
  12. }
  13. def generateDockerfile(Object SERVICE, String pathOfDockerfile='projdir') {
  14. def module = SERVICE.module == null ? '' : (SERVICE.module[-1] == '/' ? SERVICE.module : SERVICE.module + '/')
  15. echo "-----> Generating Dockerfile: ${pathOfDockerfile}/Dockerfile ..."
  16. sh """cat > ${pathOfDockerfile}/Dockerfile<<EOF
  17. FROM node:14-slim as BUILD
  18. LABEL stage=STATICRES-BUILD
  19. COPY ./admin /admin
  20. WORKDIR /admin
  21. RUN npm config set registry https://registry.npm.taobao.org && npm install && npm run build
  22. FROM nginx:1.23-alpine as FINAL
  23. # configs for default
  24. COPY ./default.conf /etc/nginx/conf.d
  25. COPY ./html /usr/share/nginx/html
  26. # configs for partner.hobbystocks.cn
  27. COPY ./partner.hobbystocks.cn.conf /etc/nginx/conf.d
  28. COPY --from=BUILD /admin/dist /usr/share/nginx/partner/admin
  29. EOF
  30. """
  31. return pathOfDockerfile
  32. }
  33. def buildDockerImage(Object SERVICE, Object DOCKER, String base_branch, projDir='projdir', String filter2Remove=null) {
  34. def imageUri = generateFullImageUri(DOCKER, base_branch, BUILD_NUMBER)
  35. echo "-----> Building docker image: ${imageUri} ..."
  36. dir(projDir) {
  37. docker.withRegistry("http://${DOCKER.registry}", "${DOCKER.push_credentialId}") {
  38. def imageName = generateImageName(DOCKER, base_branch, BUILD_NUMBER)
  39. def image = docker.build(imageName)
  40. image.push()
  41. sh "docker rmi ${imageName}"
  42. if(filter2Remove != null)
  43. sh "docker image prune --filter label=${filter2Remove} -f"
  44. }
  45. }
  46. return imageUri
  47. }
  48. def restoreDockerImage(Object DOCKER, String workspace, String base_branch, String rollbackBuildNumber) {
  49. dir(workspace) {
  50. imageUri = generateFullImageUri(DOCKER, base_branch, rollbackBuildNumber)
  51. sh "docker load -i ${backup_targetFile}"
  52. docker.withRegistry("http://${DOCKER.registry}", "${DOCKER.push_credentialId}") {
  53. def image = docker.image(imageUri)
  54. image.push()
  55. }
  56. }
  57. return imageUri
  58. }
  59. def cleanDockerImage(String dockerImgName) {
  60. sh "docker rmi ${dockerImgName}"
  61. }
  62. def backupDockerImage(String dockerImgName) {
  63. echo "-----> Backup artifact(docker image : ${dockerImgName}) ..."
  64. path = "${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}"
  65. sh """
  66. docker save ${dockerImgName} -o ${backup_targetFile}
  67. if [ -d ${path} ];
  68. then
  69. echo \"${path} already exists\"
  70. else
  71. mkdir -p ${path}
  72. mv ${backup_targetFile} ${path}
  73. fi
  74. """
  75. }
  76. def backupK8sConfigs(String[] files2backup) {
  77. path = "${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/k8s"
  78. sh """if [ -d ${path} ];
  79. then
  80. echo \"${path} already exists!\"
  81. else
  82. mkdir -p ${path}
  83. fi
  84. """
  85. for(file in files2backup) {
  86. sh "cp ${file} ${path}"
  87. }
  88. }
  89. def applyDeployment(SERVICE, K3S, String base_branch) {
  90. print "loading ${sharedLibsPath}/k3sUtil.groovy..."
  91. def k3sUtils = load "${sharedLibsPath}/k3sUtil.groovy"
  92. kvs = [:]
  93. kvs.put('<service_name>', SERVICE.name)
  94. kvs.put('<service_version>', SERVICE.version)
  95. kvs.put('<release>', base_branch)
  96. kvs.put('<COMMIT_SHA>', COMMIT_SHA)
  97. kvs.put('<imagePullSecret>', K3S.pull_secretId)
  98. kvs.put('<docker_image>', imageUri)
  99. k3sUtils.generateDeployment(kvs, 'deployment.yaml')
  100. k3sUtils.applyDeployment(K3S)
  101. k3sUtils.generateService(kvs, 'service.yaml')
  102. k3sUtils.applyService(K3S)
  103. }
  104. def execute(CONFIG, base_branch, closures=[:]) {
  105. stage('source code check out') {
  106. println "loading ${sharedLibsPath}/gitUtil.groovy..."
  107. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy"
  108. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE()
  109. }
  110. stage("docker image build") {
  111. def projDir = 'projdir'
  112. if (closures.GENERATEDOCKERFILE != null)
  113. projDir = closures.GENERATEDOCKERFILE()
  114. else
  115. projDir = generateDockerfile(CONFIG.service) //default
  116. if (closures.BUILDIMAGE != null)
  117. imageUri = closures.BUILDIMAGE()
  118. else
  119. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir, 'stage=STATICRES-BUILD')
  120. }
  121. stage("apply K8S Deployment") {
  122. if (closures.K3SDEPLOY != null) {
  123. closures.K3SDEPLOY()
  124. return
  125. }
  126. applyDeployment(CONFIG.service, CONFIG.k3s, base_branch)
  127. }
  128. }
  129. def upgrade(Object CONFIG, String base_branch, String[] k8sBackupFiles, closures=[:]) {
  130. stage('source code check out') {
  131. println "loading ${sharedLibsPath}/gitUtil.groovy..."
  132. def gitUtils = load "${sharedLibsPath}/gitUtil.groovy"
  133. COMMIT_SHA = closures.GITCLONE == null ? gitUtils.clone(CONFIG.git, base_branch) : closures.GITCLONE()
  134. }
  135. stage("docker image build") {
  136. def projDir = 'projdir'
  137. if (closures.GENERATEDOCKERFILE != null)
  138. projDir = closures.GENERATEDOCKERFILE()
  139. else
  140. projDir = generateDockerfile(CONFIG.service) //default
  141. if (closures.BUILDIMAGE != null)
  142. imageUri = closures.BUILDIMAGE()
  143. else
  144. imageUri = buildDockerImage(CONFIG.service, CONFIG.docker, base_branch, projDir, 'stage=STATICRES-BUILD')
  145. // stage("Docker Image backup") {
  146. backupDockerImage(imageUri)
  147. envFile = new File("${backup_destination}/${JOB_NAME}/${BUILD_NUMBER}/env")
  148. envFile << "${COMMIT_SHA}\n"
  149. envFile << "${base_branch}\n"
  150. // }
  151. // stage("K8s configs backup") {
  152. backupK8sConfigs(k8sBackupFiles)
  153. // }
  154. cleanDockerImage(imageUri)
  155. }
  156. stage("apply K8S Deployment") {
  157. if (closures.K3SDEPLOY != null) {
  158. closures.K3SDEPLOY()
  159. return
  160. }
  161. applyDeployment(CONFIG.service, CONFIG.k3s, base_branch)
  162. }
  163. stage("Clear older backup version") {
  164. dir("${backup_destination}/${JOB_NAME}") {
  165. echo "-----> Clear older backup version ..."
  166. sh """
  167. save_file=`ls -ltr | tail -5 | awk '{print \$NF}'`
  168. ls | grep -v "\$save_file" | xargs rm -rf
  169. """
  170. }
  171. }
  172. }
  173. def rollback(Object CONFIG, String rollbackBuildNumber, closures=[:]) {
  174. path = "${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}"
  175. if (fileExists(path)) {
  176. envFile = new File("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/env")
  177. def lines = envFile.readLines()
  178. COMMIT_SHA = lines[0]
  179. BASE_BRANCH = lines[1]
  180. stage('source code check out') {
  181. print("souce code check out. Skipped!")
  182. }
  183. stage("docker image build") {
  184. print("restore docker image from rollbackNo. #${rollbackBuildNumber}")
  185. imageUri = restoreDockerImage(CONFIG.docker, path, BASE_BRANCH, rollbackBuildNumber)
  186. cleanDockerImage(imageUri)
  187. }
  188. stage("apply K8S Deployment") {
  189. if (closures.K3SDEPLOY != null) {
  190. closures.K3SDEPLOY()
  191. return
  192. }
  193. dir("${backup_destination}/${JOB_NAME}/${rollbackBuildNumber}/k8s") {
  194. applyDeployment(CONFIG.service, CONFIG.k3s, BASE_BRANCH)
  195. }
  196. }
  197. stage("Clear rollback workspace") {
  198. dir("${backup_destination}/${JOB_NAME}") {
  199. echo "-----> Clear rollback workspace ..."
  200. sh "rm -rf *@tmp"
  201. }
  202. }
  203. }
  204. }
  205. return this