Pārlūkot izejas kodu

生产 whole Jenkinsfile

dujian 2 nedēļas atpakaļ
vecāks
revīzija
9f6a687e08
1 mainītis faili ar 105 papildinājumiem un 0 dzēšanām
  1. 105 0
      docs/jenkins/produ/whole/Jenkinsfile

+ 105 - 0
docs/jenkins/produ/whole/Jenkinsfile

@@ -0,0 +1,105 @@
+/**
+ * 整体 / 单服务 / 多选 发版(Harbor + ACK)。
+ *
+ * Jenkins Job 建议名:alien-cloud-k8s-whole
+ * Script Path:docs/jenkins/produ/whole/Jenkinsfile
+ *
+ * DEPLOY_MODE:whole=七个服务全发;single=选一个;multi=勾选 MULTI_*。
+ * 与 prod-promote-from-uat 的 whole/single/multi 语义一致,制品改为镜像而非 jar 目录。
+ */
+def k8s = load 'docs/jenkins/produ/_shared/k8s-produ-lib.groovy'
+def reg = load 'docs/jenkins/produ/_shared/service-registry.groovy'
+
+pipeline {
+    agent any
+    options {
+        buildDiscarder(logRotator(numToKeepStr: '15'))
+        timestamps()
+        timeout(time: 180, unit: 'MINUTES')
+    }
+    parameters {
+        choice(name: 'DEPLOY_MODE', choices: ['whole', 'single', 'multi'],
+            description: 'whole=全部七个 Java 服务;single=一个;multi=勾选下方复选框')
+        choice(name: 'SINGLE_SERVICE', choices: [
+            'gateway', 'store', 'second', 'store-platform', 'lawyer', 'job', 'dining',
+        ], description: '仅 DEPLOY_MODE=single 时生效')
+        booleanParam(name: 'MULTI_gateway', defaultValue: false)
+        booleanParam(name: 'MULTI_store', defaultValue: false)
+        booleanParam(name: 'MULTI_second', defaultValue: false)
+        booleanParam(name: 'MULTI_store_platform', defaultValue: false)
+        booleanParam(name: 'MULTI_lawyer', defaultValue: false)
+        booleanParam(name: 'MULTI_job', defaultValue: false)
+        booleanParam(name: 'MULTI_dining', defaultValue: false)
+        string(name: 'GIT_BRANCH', defaultValue: 'uat-20260202', trim: true)
+        string(name: 'IMAGE_TAG', defaultValue: '', trim: true,
+            description: '留空则各服务 tag 均为 build-${BUILD_NUMBER}')
+        choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
+        string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
+        string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
+        booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
+        booleanParam(name: 'DRY_RUN', defaultValue: false)
+    }
+    environment {
+        MAVEN_HOME = tool '3.6.3'
+        PATH = "${MAVEN_HOME}/bin:${env.PATH}"
+        GIT_URL = 'http://8.152.195.41:3000/alien/alien_cloud'
+        GIT_CREDENTIALS = 'zhanghaomimapingzheng'
+        HARBOR_CREDENTIALS = 'harbor-robot-alien'
+        KUBECONFIG_CREDENTIALS = 'ack-kubeconfig-alien'
+    }
+    stages {
+        stage('Checkout') {
+            steps {
+                script {
+                    def branch = (params.GIT_BRANCH ?: 'uat-20260202').trim()
+                    k8s.checkoutBranch(this, branch, env.GIT_URL, env.GIT_CREDENTIALS)
+                    env.SELECTED_SERVICES = reg.filterServices(reg.getServiceRegistry(), params)*.prodDir.join(',')
+                    echo ">>> 本次发版服务: ${env.SELECTED_SERVICES}"
+                }
+            }
+        }
+        stage('Maven Package (all modules)') {
+            when { expression { return !params.SKIP_MAVEN } }
+            steps {
+                script { k8s.mavenPackageAll(this) }
+            }
+        }
+        stage('Build Push & Deploy') {
+            steps {
+                script {
+                    def services = reg.filterServices(reg.getServiceRegistry(), params)
+                    def tag = (params.IMAGE_TAG ?: '').trim() ?: "build-${env.BUILD_NUMBER}"
+                    def common = [
+                        harborRegistry: params.HARBOR_REGISTRY,
+                        harborProject: params.HARBOR_PROJECT,
+                        baseImage: params.BASE_IMAGE,
+                        harborCredentialsId: env.HARBOR_CREDENTIALS,
+                        k8sNamespace: params.K8S_NAMESPACE,
+                        deployStrategy: params.DEPLOY_STRATEGY,
+                        canaryWeight: (params.CANARY_WEIGHT ?: '10').trim(),
+                        kubeCredentialsId: env.KUBECONFIG_CREDENTIALS,
+                    ]
+                    services.each { svc ->
+                        def imageRef = "${params.HARBOR_REGISTRY}/${params.HARBOR_PROJECT}/${svc.prodDir}:${tag}"
+                        echo ">>> === ${svc.prodDir} === ${imageRef}"
+                        if (!params.DRY_RUN) {
+                            k8s.dockerBuildAndPush(this, svc + common + [imageRef: imageRef])
+                            k8s.deployToAck(this, svc + common + [
+                                imageRef: imageRef,
+                                deploymentStable: svc.deployName,
+                                deploymentCanary: "${svc.deployName}-canary",
+                                ingressCanary: "${svc.deployName}-canary",
+                            ])
+                        }
+                    }
+                }
+            }
+        }
+    }
+    post {
+        success { echo ">>> 整体流水线完成: ${env.SELECTED_SERVICES}" }
+    }
+}