Jenkinsfile 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /**
  2. * 整体 / 单服务 / 多选:仅晋升 Harbor 镜像 + 可选 ACK。
  3. * Script Path:docs/jenkins/produ/whole/Jenkinsfile
  4. */
  5. def sparseCheckoutProduShared() {
  6. checkout scm: [
  7. $class: 'GitSCM',
  8. branches: scm.branches,
  9. extensions: [
  10. [$class: 'CloneOption', depth: 1, shallow: true, noTags: true],
  11. [$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [
  12. [path: 'docs/jenkins/produ/_shared/'],
  13. ]],
  14. ],
  15. userRemoteConfigs: scm.userRemoteConfigs,
  16. ]
  17. }
  18. def getProduLibs() {
  19. sparseCheckoutProduShared()
  20. def k8s = load 'docs/jenkins/produ/_shared/k8s-produ-lib.groovy'
  21. def reg = load 'docs/jenkins/produ/_shared/service-registry.groovy'
  22. return [k8s, reg]
  23. }
  24. pipeline {
  25. agent any
  26. options {
  27. buildDiscarder(logRotator(numToKeepStr: '15'))
  28. disableConcurrentBuilds()
  29. skipDefaultCheckout(true)
  30. timestamps()
  31. timeout(time: 120, unit: 'MINUTES')
  32. }
  33. parameters {
  34. choice(name: 'DEPLOY_MODE', choices: ['whole', 'single', 'multi'],
  35. description: 'whole=7个服务;single=选一个;multi=勾选 MULTI_*')
  36. choice(name: 'SINGLE_SERVICE', choices: [
  37. 'gateway', 'store', 'second', 'store-platform', 'lawyer', 'job', 'dining',
  38. ], description: '仅 DEPLOY_MODE=single 时生效')
  39. booleanParam(name: 'MULTI_gateway', defaultValue: false)
  40. booleanParam(name: 'MULTI_store', defaultValue: false)
  41. booleanParam(name: 'MULTI_second', defaultValue: false)
  42. booleanParam(name: 'MULTI_store_platform', defaultValue: false)
  43. booleanParam(name: 'MULTI_lawyer', defaultValue: false)
  44. booleanParam(name: 'MULTI_job', defaultValue: false)
  45. booleanParam(name: 'MULTI_dining', defaultValue: false)
  46. string(name: 'SOURCE_TAG', defaultValue: 'uat-latest', trim: true,
  47. description: 'Harbor UAT tag,默认 uat-latest;回滚填 uat-build-<N>')
  48. string(name: 'TARGET_TAG', defaultValue: '', trim: true,
  49. description: '留空则 produ-${BUILD_NUMBER}')
  50. choice(name: 'PROMOTE_METHOD', choices: ['harbor-api', 'docker-pull'],
  51. description: 'harbor-api=服务端打 tag(快);docker-pull=拉取再 push(慢,兼容)')
  52. booleanParam(name: 'PARALLEL_ACK_DEPLOY', defaultValue: true,
  53. description: 'whole/multi 时并行 kubectl rollout(显著缩短 ACK 阶段)')
  54. string(name: 'HARBOR_REGISTRY', defaultValue: '39.105.153.68', trim: true)
  55. string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
  56. choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary', 'skip'],
  57. description: '''rolling=更新 stable Deployment,kubectl 滚动替换 Pod(全量发版)
  58. canary=仅更新 *-canary Deployment,并按 CANARY_WEIGHT 设置 Ingress 灰度流量
  59. skip=只晋升 Harbor 镜像,不执行 kubectl''')
  60. string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
  61. string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
  62. booleanParam(name: 'DRY_RUN', defaultValue: false)
  63. }
  64. environment {
  65. HARBOR_CREDENTIALS = 'harbor-robot-alien'
  66. KUBECONFIG_CREDENTIALS = 'ack-kubeconfig-alien'
  67. }
  68. stages {
  69. stage('Promote & Deploy') {
  70. steps {
  71. script {
  72. def (k8s, reg) = getProduLibs()
  73. def services = reg.filterServices(reg.getServiceRegistry(), params)
  74. env.SOURCE_TAG_RESOLVED = k8s.requireSourceTag(this, params.SOURCE_TAG)
  75. env.TARGET_TAG_RESOLVED = k8s.resolveTargetTag(this, params.TARGET_TAG)
  76. env.PROMOTE_LIST = services*.prodDir.join(',')
  77. echo ">>> DEPLOY_MODE=${params.DEPLOY_MODE} 服务=${env.PROMOTE_LIST}"
  78. echo ">>> ${env.SOURCE_TAG_RESOLVED} → ${env.TARGET_TAG_RESOLVED} promote=${params.PROMOTE_METHOD}"
  79. k8s.promoteHarborImages(this, services, [
  80. harborRegistry: params.HARBOR_REGISTRY,
  81. harborProject: params.HARBOR_PROJECT,
  82. sourceTag: env.SOURCE_TAG_RESOLVED,
  83. targetTag: env.TARGET_TAG_RESOLVED,
  84. harborCredentialsId: env.HARBOR_CREDENTIALS,
  85. promoteMethod: params.PROMOTE_METHOD,
  86. dryRun: params.DRY_RUN == true,
  87. ])
  88. if (params.DEPLOY_STRATEGY != 'skip' && !params.DRY_RUN) {
  89. k8s.deployServicesToAck(this, services, [
  90. harborRegistry: params.HARBOR_REGISTRY,
  91. harborProject: params.HARBOR_PROJECT,
  92. targetTag: env.TARGET_TAG_RESOLVED,
  93. deployStrategy: params.DEPLOY_STRATEGY,
  94. k8sNamespace: params.K8S_NAMESPACE,
  95. canaryWeight: params.CANARY_WEIGHT,
  96. kubeCredentialsId: env.KUBECONFIG_CREDENTIALS,
  97. parallelDeploy: params.PARALLEL_ACK_DEPLOY == true,
  98. ])
  99. }
  100. }
  101. }
  102. }
  103. }
  104. post {
  105. success { echo ">>> 完成: ${env.PROMOTE_LIST} tag=${env.TARGET_TAG_RESOLVED}" }
  106. }
  107. }