目 录CONTENT

文章目录

jenkinsfile环境构建参数--实现多分支分布

JamKing
2025-12-02 / 0 评论 / 0 点赞 / 7 阅读 / 0 字

1、定义构建参数

// 1. 定义构建参数
properties([
    parameters([
        choice(
            name: 'ENVIRONMENT',
            description: '请选择要构建的环境',
            choices: ['dev', 'test', 'prod']
        )
    ])
])

2、定义的存储分支名

def selectedBranch = ''

3、switch语句灵活映射

使用 switch 语句进行灵活映射(推荐)

在实际项目中,分支名往往与环境名不完全一致。例如,dev 环境可能对应 develop 分支,prod 环境对应 mainmaster 分支。这时,使用 switch 语句进行映射会更加清晰和灵活。

    //第一阶段
    stage('选择代码分支') {
        echo "1.环境选择"
        //使用switch语句将环境名映射到实际的分支名
        switch(params.ENVIRONMENT) {
            case 'dev':
                //开发环境分支名
                selectedBranch = 'dev'
                break
            case 'test':
                //测试环境分支名
                selectedBranch = 'test'
                break
            case 'prod':
                //生产环境分支名,通常是main或master,这里我单独分出的prod分支
                selectedBranch = 'prod'
                break
            default:
                error("不支持的环境: ${params.ENVIRONMENT}")
                break
        }

        //根据环境变量生成不同的镜像端点和最终镜像名
        env.imageEndpoint = "java-${params.ENVIRONMENT}/demo"
        env.image = "${registryUrl}/${imageEndpoint}:${imageTag}"

        echo "已选择环境: ${params.ENVIRONMENT},即将拉取${params.ENVIRONMENT}代码并构建"
    }

    //第二阶段
    stage('拉取对应分支代码') {
        echo "2.拉取代码"
        //使用映射后的分支名进行拉取
        git branch: "${params.ENVIRONMENT}",
            url: "${codeUrl}",   //仓库地址变量
            credentialsId: 'root_gitlab'  //gitlab的token访问凭证
        
    }

4、Jenkinsfile预览

//定义构建参数
properties([
    parameters([
        choice(
            name: 'ENVIRONMENT',
            description: '请选择要构建的环境',
            choices: ['dev', 'test', 'prod']
        )
    ])
])

//定义空变量用于传参分支名
def selectedBranch = ''

def label = "jenkins-agent"

podTemplate(label: label, containers: [
  //设置mvn、buildkit、kubectl三个容器模板
  containerTemplate(name: 'maven', image: 'harbor.test.com/devops/maven:3.8.5-openjdk-11', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'buildkit', image: 'harbor.test.com/devops/buildkit:v0.23.2', command: 'cat', ttyEnabled: true, privileged: true),
  containerTemplate(name: 'kubectl', image: 'harbor.test.com/devops/kubectl', command: 'cat', ttyEnabled: true)], 
  //sa权限
  serviceAccount: 'jenkins-master',
  volumes: [
  hostPathVolume(mountPath: '/root/.m2', hostPath: '/data/nfs-data/mvn'),
  //挂载harbor证书目录
  hostPathVolume(mountPath: '/tmp/certs.d', hostPath: '/data/nfs-data/certs.d')])

{
  node(label) {
    // 仓库地址和标签
    def imageTag = "v1.0"
    def registryUrl = "harbor.test.com"
    def codeUrl = "http://172.16.10.130/dev_team/java-demo.git"

    //第一阶段
    stage('选择代码分支') {
        echo "1.环境选择"
        //使用switch语句将环境名映射到实际的分支名
        switch(params.ENVIRONMENT) {
            case 'dev':
                //开发环境分支名
                selectedBranch = 'dev'
                break
            case 'test':
                //测试环境分支名
                selectedBranch = 'test'
                break
            case 'prod':
                //生产环境分支名,通常是main或master,这里我单独分出的prod分支
                selectedBranch = 'prod'
                break
            default:
                error("不支持的环境: ${params.ENVIRONMENT}")
                break
        }

        //根据环境变量生成不同的镜像端点和最终镜像名
        env.imageEndpoint = "java-${params.ENVIRONMENT}/demo"
        env.image = "${registryUrl}/${imageEndpoint}:${imageTag}"

        echo "已选择环境: ${params.ENVIRONMENT},即将拉取${params.ENVIRONMENT}代码并构建"
    }

    //第二阶段
    stage('拉取对应分支代码') {
        echo "2.拉取代码"
        //使用映射后的分支名进行拉取
        git branch: "${params.ENVIRONMENT}",
            url: "${codeUrl}",   //仓库地址变量
            credentialsId: 'root_gitlab'  //gitlab的token访问凭证
  
    }

    //第三阶段
    stage('mvn构建jar包') {
      container('maven') {
        echo "3.mvn构建"
        sh """
          export JAVA_HOME=/usr/local/openjdk-11
          mvn -B -q clean install -DskipTests
        """
      }
    }

    //第四阶段
    stage('buildkit构建镜像') {
      //引入harbor仓库认证
      withCredentials([usernamePassword(
        //凭据id以实际为准
        credentialsId: 'harbor_auth',
        passwordVariable: 'HARBOR_PASSWORD', 
        usernameVariable: 'HARBOR_USER')]) {
      container('buildkit') {
        echo "4.构建镜像"
        sh """
          #创建harbor认证文件
          mkdir -p /root/.docker
          cat > /root/.docker/config.json << EOF
{
    "auths": {
        "${registryUrl}": {
        "auth": "\$(echo -n "${HARBOR_USER}:${HARBOR_PASSWORD}" | base64)"
        }
    }
}
EOF
          #需创建配置文件,否则无法进行证书忽略或校验
          mkdir -p /etc/buildkit
          cat > /etc/buildkit/buildkitd.toml << EOF
[registry."${registryUrl}"]
  insecure = true
  mirrors = ["${registryUrl}"]
EOF
          #启动buildkitd守护进程
          buildkitd &
          sleep 5
          buildctl build \
            --frontend dockerfile.v0 \
            --local context=. \
            --local dockerfile=.\
            --export-cache type=inline \
            --import-cache type=registry,ref=${env.image}:buildcache \
            --output type=image,name=${env.image},push=true \
            --registry-auth-tlscontext host=${registryUrl},insecure=false,ca=/tmp/certs.d/ca.pem,cert=/tmp/certs.d/cert.pem,key=/tmp/certs.d/key.pem 
        """
        }
      }
    }

    //第五阶段
    stage('kubectl一键部署') {
      withCredentials([file(
        credentialsId: 'kubeconfig', 
        variable: 'KUBECONFIG')]) {
      container('kubectl') {
        echo "5.kubectl更新镜像"
        sh """
          kubectl --kubeconfig=$KUBECONFIG set image deployment/${params.ENVIRONMENT}-demo ${params.ENVIRONMENT}-demo=${env.image} -n devops
          sleep 10
          kubectl --kubeconfig=$KUBECONFIG get pod -n devops |grep ${params.ENVIRONMENT}-demo|grep Running
        """
        }
      }
    }
  }
}

5、Pipeline配置

5.1 Jenkinsfile放置代码仓库

优点:安全、隐私性更好,jenkins的核心思想之一就是Jenkinsfile,它只关注代码仓库里面的Jenkinsfile

缺点:需要独立维护Jenkinsfile

5.1.1 步骤

scm配置

image-TPsC.png

gitlab的jenkinsfile

image-qvuN.png

5.2 直接放置jenkins的pipeline scripts

5.2.1 步骤

贴上jenkinsfile的脚本内容即可,无需额外操作

image-SzTX.png

6、运行多分支流水线

进入到流水线,就有了可选的参数,dev,test,prod

image-WRce.png

6.1 dev运行情况

Build

image-THda.png

pipeline运行日志

image-Egwl.png

访问demo

image-YAwd.png

6.2 test运行情况

Build

image-JEaY.png

pipeline运行日志

image-eZSt.png

访问demo

image-bySz.png

6.3 prod运行情况

Build

image-iZJj.png

pipeline运行日志

image-rHIl.png

访问demo

image-XFUD.png

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区