后端java pipeline脚本

// 做下拉框联动
// 需要用到scriptler插件
// 下面是scriptler中的样例脚本
/**
List devList  = ["None"]
List testList  = ["itmg-ariot-abs-iot-manager"]
List stageList = ["Select:selected", "stage1"]
List prodList  = ["itmg-ariot-abs-iot-manager"]

List default_item = ["None"]

if (Environment == 'DEV') {
  return devList
} else if (Environment == 'TEST') {
  return testList
} else if (Environment == 'STAGE') {
  return stageList
} else if (Environment == 'PROD') {
  return prodList
} else {
  return default_item
}
*/

properties([
  // 管道速度/耐久性覆盖
  durabilityHint('PERFORMANCE_OPTIMIZED'), 
  // 保留已完成构建的储藏
  preserveStashes(), 
  // 配置联动选框
  parameters([
    activeChoice(choiceType: 'PT_SINGLE_SELECT', description: '选类型', filterLength: 1, filterable: false, name: 'Environment', randomName: 'choice-parameter-779608790271869', script: scriptlerScript(isSandboxed: true, scriptlerBuilder: [builderId: '1726884996564_17', parameters: [], propagateParams: false, scriptId: 'Environments.groovy'])), 
    reactiveChoice(choiceType: 'PT_CHECKBOX', description: '应用列表', filterLength: 1, filterable: true, name: 'Servers', randomName: 'choice-parameter-779608792418725', referencedParameters: 'Environment', script: scriptlerScript(isSandboxed: true, scriptlerBuilder: [builderId: '1726884996566_18', parameters: [], propagateParams: false, scriptId: 'BackendAriot.groovy']))
    ])
  ])

pipeline {
    agent any
    
    tools {
      maven 'local-mvn'
      jdk 'jdk-11'
    }

    options {
        buildDiscarder(logRotator(numToKeepStr: '3')) //保留三个历史构建版本
    }

    parameters {
        // 代码地址
        string(defaultValue: 'http://114.255.128.176:88/syb-dev/root/h-itmg/service/bcl/ariot.git', description: '代码仓库地址', name: 'Gitlab_Registry_URL')
        // 版本分支
        gitParameter(branch: '', branchFilter: '.*', defaultValue: 'sz_dev', description: '代码分支', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition')
    }

    environment {
        commitLog = ''
        commit_author = ''
        SonarQube_URL='http://192.168.3.30:9100'
        SonarQube_Secret='sqa_cdfa9063791ff2b619703c6ed3d55cad84ea7407'
        ProjectName="${env.JOB_NAME}"
        scannerHome = tool 'SonarQube_Scanner_4.8'
        DOCKER_REPOSITORY='registry.cn-gdgz1.ctyun.cn/h-vpp'
        build_time = ''
        build_dir = 'itmg-bcl-ariot-abs'
        multiple_platform = "--platform=linux/arm64,linux/amd64"
    }
    

    stages {
        stage('代码拉取') {
            steps {
                echo '拉取Git代码'
                checkout scmGit(branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '53773151-da42-4355-8504-45bcb0abb1eb', url: '${Gitlab_Registry_URL}']])
                
                script{
                  // 获取最近一次代码提交信息
                  commitLog = sh(script: 'git log --oneline -n 1',returnStdout: true).trim()
                  echo "Git Commit Log:\n${commitLog}"
                  
                  commit_author = sh(script: 'git log -n 1 --pretty=format:"%an"',returnStdout: true).trim()
                  echo "Git Commit Author:\n${commit_author}"
        
                  commit_counters = sh(script: 'git log --oneline | wc -l',returnStdout: true).trim()
                  echo "Git Commit Counters:\n${commit_counters}"

                  build_time = sh (script: 'date +%Y%m%d%H%M', returnStdout: true).trim()
                  echo "build time:\n${build_time}"
                } 
            }
        }

        stage('SonarQube Analysis') {
            when {
              expression { 
                  // 检查复选框的值,如果包含'DEV',则执行步骤
                  return params.Environment.contains('DEV') 
              }
            }
            steps{
                echo '代码质量检查'
                script{
                    def SonarQube_URL=env.SonarQube_URL
                    def SonarQube_Secret=env.SonarQube_Secret

                    echo "${ProjectName}"
                    echo "${SonarQube_URL}"
                    echo "${SonarQube_Secret}"
                    def sonarProperties = [
                            "sonar.projectKey=${ProjectName}",
                            "sonar.host.url=${SonarQube_URL}",
                            "sonar.login=${SonarQube_Secret}"
                            ]
                    withSonarQubeEnv('SonarQube') {
                        sh "mvn sonar:sonar -D${sonarProperties.join(' -D')}"
                    }
                    
                    // 代码检测失败,将不再继续执行后面的任务,直接退出,报告返回的超时时长设为5分钟
                    timeout(time: 3,unit: 'MINUTES') {
                        waitForQualityGate abortPipeline: true
                    }
                }
            }
        }
       // 引用其他的包
        stage('构建基础依赖') {
          when {
            anyOf {
              expression { return params.Environment.contains('TEST') }
              expression { return params.Environment.contains('PROD') } 
            }
          }  
          steps {
            echo '构建基础依赖'
            script {

              // 使用build调度前端job,并传参,将结果赋值给dtkBuild
            //   def dtkBuild=build(job: "backend-dtk", parameters: [gitParameter(name: "branch", value: params.branch)])       
            //   println dtkBuild.getProjectName()
            //   println dtkBuild.getNumber()
            //   println dtkBuild.getBuildVariables() 
              // println dtkBuild.buildVariables.image_tag
              // 使用build调度前端job,并传参,将结果赋值给dtkBuild
              def iotBuild=build(job: 'backend-iot', parameters: [gitParameter(name: 'branch', value: params.branch)])       
              println iotBuild.getProjectName()
              println iotBuild.getNumber()
              println iotBuild.getBuildVariables() 
            }

          }
        }
        
        
        stage('编译') {
          when {
            anyOf {
              expression { return params.Environment.contains('TEST') }
              expression { return params.Environment.contains('PROD') } 
            }
          }  
          steps {
            echo '编译打包'
            script {
              sh "mvn clean install -Dmaven.test.skip=true -Ddockerfile.skip=true"
            }

          }
        }

         stage('打包镜像') {
           when {
               anyOf {
                 expression { return params.Environment.contains('TEST') }
                 expression { return params.Environment.contains('PROD') } 
               }
           }  
           steps {
             echo '打包镜像'
             script {
               for (server in params.Servers.tokenize(',')) {
                 sh "docker build -t ${DOCKER_REPOSITORY}/${server}:${build_time}_${commit_counters} ${build_dir}/${server} --no-cache"
                 sh "docker push ${DOCKER_REPOSITORY}/${server}:${build_time}_${commit_counters}"
                 sh "docker rmi ${DOCKER_REPOSITORY}/${server}:${build_time}_${commit_counters}"
               }
             }

           }
         }
        
        stage('部署') {
          when {
            expression { return params.Environment.contains('TEST') }
          }  
          steps {
            echo '部署到测试环境'
            
            script {
              for (server in params.Servers.tokenize(',')) {
                def substr = server.split('-')[-1]
                def deploy = "ariot-${substr}"
                echo "${deploy}"
                def command = "kubectl set image deployment/${deploy} ${deploy}=${DOCKER_REPOSITORY}/${server}:${build_time}_${commit_counters} -n hvpp"
                echo "${command}"
                sh "ssh root@192.168.3.57 ${command}"
              }
            }
          }
        }

        stage('构建多架构镜像,自动更新演示环境') {
          when {
            expression { return params.Environment.contains('PROD') }
          }  

          steps {
            echo '构建多架构镜像,并更新演示环境'
            script {
              // 登录华为云镜像镜仓库, 天翼云镜像仓库无法打多版本镜像
              sh "docker login -u cn-north-1@IY2FYXRHUQVKV5DAA1A2 -p 6d094a81650d98fdd2e476d3a6a5132ed2d63f5e1a48221ab4ea7a1f4fc18ee4 swr.cn-north-1.myhuaweicloud.com"
              for (server in params.Servers.tokenize(',')) {

                // docker buildx build -t registry.cn-gdgz1.ctyun.cn/h-vpp/hvpp-base:multiple --build-context name=/home/docker-test/aif-auth  --no-cache   --push --provenance=false .
                sh "cd ${build_dir}/${server} && docker buildx build -t swr.cn-north-1.myhuaweicloud.com/h-vpp/${server}:${build_time}_${commit_counters} ${multiple_platform} --no-cache --push --provenance=false ."
 
                
                // 更新演示环境(192.168.3.30)里docker-compose里的image值
                def image="swr.cn-north-1.myhuaweicloud.com/h-vpp/${server}:${build_time}_${commit_counters}"
                sh """
                    ssh 192.168.3.30 "yq -i '.services.${server}.image=\\"${image}\\"' /home/hvpp-demo/backend/ariot.yaml"
                    """
                // 执行更新动作
                sh """
                    ssh 192.168.3.30 "cd /home/hvpp-demo/backend && docker-compose -f ariot.yaml up -d ${server}"
                """
                // 更新一个镜像停止1s
                sleep(1)
              }
            }

          }

        }
    }
}

前端 pipeline脚本

pipeline {
    agent any

    options {
        buildDiscarder(logRotator(numToKeepStr: '3')) //保留三个历史构建版本
    }
    
    tools {
       jdk 'jdk-11'
       nodejs 'nodejs-14.17.6'
    }
    
    

    parameters {
        // 代码地址
        string(defaultValue: 'http://114.255.128.176:88/syb-dev/root/h-itmg/web/bcl/iot.git', description: '代码仓库地址', name: 'Gitlab_Registry_URL')
        // 版本分支
        gitParameter(branch: '', branchFilter: '.*', defaultValue: 'release-dev', description: '代码分支', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition')
        
        choice(name: 'Environment',choices: ['DEV','TEST','PROD'],description: "选类型")

    }

    environment {
        commitLog = ''
        commit_author = ''
        ProjectName="${env.JOB_NAME}"
        scannerHome = tool 'SonarQube_Scanner_4.8'
    }

    stages {
        stage('代码拉取') {
            steps {
                echo '拉取Git代码'
                checkout scmGit(branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '53773151-da42-4355-8504-45bcb0abb1eb', url: '${Gitlab_Registry_URL}']])
                
                script{
                  // 获取最近一次代码提交信息
                  commitLog = sh(script: 'git log --oneline -n 1',returnStdout: true).trim()
                  echo "Git Commit Log:\n${commitLog}"
                  
                  commit_author = sh(script: 'git log -n 1 --pretty=format:"%an"',returnStdout: true).trim()
                  echo "Git Commit Author:\n${commit_author}"
        
                  commit_counters = sh(script: 'git log --oneline | wc -l',returnStdout: true).trim()
                  echo "Git Commit Counters:\n${commit_counters}"
                } 
            }
        }

        stage('SonarQube Analysis') {
            when {
              expression { 
                  // 检查复选框的值,如果包含'DEV',则执行步骤
                  return params.Environment.contains('DEV') 
              }
            }
            steps{
                echo '代码质量检查'
                script{
                    def SonarQube_URL=env.SonarQube_URL
                    def SonarQube_Secret=env.SonarQube_Secret

                    echo "${ProjectName}"
                    echo "${SonarQube_URL}"
                    echo "${SonarQube_Secret}"
                    
                    echo "${JAVA_HOME}"

                    withSonarQubeEnv('SonarQube') {
                        sh '''
                        ${scannerHome}/bin/sonar-scanner \
                        -Dsonar.projectKey=${ProjectName} \
                        -Dsonar.sources=. \
                        -Dsonar.host.url=${SonarQube_URL} \
                        -Dsonar.login=${SonarQube_Secret}
                        '''
                    }

                    // 代码检测失败,将不再继续执行后面的任务,直接退出,报告返回的超时时长设为5分钟
                    timeout(time: 3,unit: 'MINUTES') {
                        waitForQualityGate abortPipeline: true
                    }
                }
            }
        }

        stage('编译'){
            when {
                anyOf {
                  expression { return params.Environment.contains('TEST') }
                  expression { return params.Environment.contains('PROD') } 
                }
            }
            steps{
                script{
                    sh """
                    npm install
                    npm run build
                    """
                }
            }
        }
        
        stage('测试环境更新'){
            when {
                expression { return params.Environment.contains('TEST') }
            }
            steps{
                script{
                    sh """
                    rm -rf ariot
                    mv dist ariot
                    ssh root@192.168.3.55 "mv /usr/local/nginx/html/front/ariot  /usr/local/nginx/html/front/ariot-`date +%Y%m%d%H%M`"
                    scp -r ariot root@192.168.3.55:/usr/local/nginx/html/front
                    """
                }
            }
        }

        stage('演示环境更新'){
            when {
                expression { return params.Environment.contains('PORD') }
            }
            steps{
                script{
                    sh """
                    rm -rf ariot
                    mv dist ariot
                    ssh root@192.168.3.30 "mv /home/hvpp-demo/front/ariot  /home/hvpp-demo/front/ariot-`date +%Y%m%d%H%M`"
                    scp -r ariot root@192.168.3.30:/home/hvpp-demo/front
                    """
                }
            }
        }

        
    }
}