Jenkins Pipeline中参数化构建

在 Jenkins Pipeline 中,参数化构建(Parameterized Builds) 允许用户在触发任务时动态传入参数,从而实现更灵活的流程控制。以下是 声明式 Pipeline 和 脚本式 Pipeline 的参数化配置方法及示例:


1. 声明式 Pipeline 参数化设置

基本语法

在 pipeline 块外使用 parameters 指令定义参数:

groovy 复制代码
pipeline {
    agent any
    parameters {
        // 参数定义在这里
    }
    stages {
        stage('Example') {
            steps {
                // 使用参数
            }
        }
    }
}

常用参数类型及示例

(1) 字符串参数(String)
groovy 复制代码
parameters {
    string(name: 'DEPLOY_ENV', defaultValue: 'prod', description: '部署环境')
}

使用方式:

groovy 复制代码
echo "部署环境: ${params.DEPLOY_ENV}"
(2) 布尔参数(Boolean)
groovy 复制代码
parameters {
    booleanParam(name: 'DRY_RUN', defaultValue: true, description: '是否试运行')
}

使用方式:

groovy 复制代码
if (params.DRY_RUN) {
    echo "试运行模式"
}
(3) 选择参数(Choice)
groovy 复制代码
parameters {
    choice(
        name: 'ARCH',
        choices: ['x86', 'arm64', 'amd64'],
        description: 'CPU架构'
    )
}

使用方式:

groovy 复制代码
sh "build --arch=${params.ARCH}"
(4) 文件参数(File)
groovy 复制代码
parameters {
    file(name: 'CONFIG_FILE', description: '上传配置文件')
}

使用方式:

groovy 复制代码
sh "cat ${params.CONFIG_FILE}"
(5) 密码参数(Password)
groovy 复制代码
parameters {
    password(name: 'API_KEY', description: 'API密钥')
}

使用方式:

groovy 复制代码
withCredentials([string(credentialsId: 'API_KEY', variable: 'SECRET')]) {
    sh "echo ${SECRET}"
}

2. 脚本式 Pipeline 参数化设置

使用 properties 方法定义参数:

groovy 复制代码
properties([
    parameters([
        string(name: 'BRANCH', defaultValue: 'main', description: 'Git分支'),
        booleanParam(name: 'CLEAN_BUILD', defaultValue: false, description: '是否清理构建')
    ])
])

node {
    stage('Build') {
        echo "Building branch: ${params.BRANCH}"
        if (params.CLEAN_BUILD) {
            sh 'make clean'
        }
    }
}

3. 动态参数(Active Choices)

需要安装插件 "Active Choices",支持动态生成参数(如根据 Git 分支列表生成选项):

groovy 复制代码
parameters {
    activeChoiceParam(name: 'BRANCH', script: [
        $class: 'GroovyScript',
        script: [
            script: 'return ["main", "dev", "feature/*"].join("\\n")',
            sandbox: true
        ],
        description: '选择Git分支'
    ])
}

4. 参数化触发构建

(1) 通过 build 步骤传递参数

groovy 复制代码
build(
    job: 'downstream-job',
    parameters: [
        string(name: 'ENV', value: 'prod'),
        booleanParam(name: 'FORCE', value: true)
    ]
)

(2) 通过 input 步骤交互式输入

groovy 复制代码
stage('Approval') {
    steps {
        script {
            def userInput = input(
                id: 'confirm',
                message: '确认部署?',
                parameters: [
                    choice(name: 'ENV', choices: 'prod\ndev', description: '环境')
                ]
            )
            echo "已选择环境: ${userInput}"
        }
    }
}

5. 参数默认值与环境变量

从环境变量获取默认值

groovy 复制代码
parameters {
    string(name: 'BUILD_DIR', defaultValue: env.WORKSPACE, description: '构建目录')
}

参数组合使用

groovy 复制代码
pipeline {
    parameters {
        string(name: 'VERSION', defaultValue: '1.0.0')
        choice(name: 'REPO', choices: ['docker', 'npm'])
    }
    stages {
        stage('Deploy') {
            steps {
                script {
                    def image = "${params.REPO}:${params.VERSION}"
                    sh "docker push ${image}"
                }
            }
        }
    }
}

6. 注意事项

  1. 首次运行需手动触发:首次定义参数的 Pipeline 需要手动运行一次,参数才会生效。
  2. 修改参数需更新任务 :更改 parameters 后需通过 "Build with Parameters" 重新触发。
  3. 参数作用域 :params 是全局变量,可在所有 stage 中访问。
  4. 敏感参数 :密码类参数建议使用 Jenkins 的 Credentials Binding (withCredentials)。

完整示例

声明式 Pipeline

groovy 复制代码
pipeline {
    agent any
    parameters {
        string(name: 'TAG', defaultValue: 'latest', description: '镜像版本')
        choice(name: 'ENV', choices: ['dev', 'prod'], description: '环境')
        booleanParam(name: 'RUN_TESTS', defaultValue: true, description: '是否运行测试')
    }
    stages {
        stage('Build') {
            steps {
                sh "docker build -t myapp:${params.TAG} ."
            }
        }
        stage('Test') {
            when { expression { params.RUN_TESTS } }
            steps {
                sh 'make test'
            }
        }
        stage('Deploy') {
            steps {
                sh "kubectl apply -f deploy/${params.ENV}.yaml"
            }
        }
    }
}

脚本式 Pipeline

groovy 复制代码
properties([
    parameters([
        string(name: 'TAG', defaultValue: 'latest'),
        choice(name: 'ENV', choices: ['dev', 'prod']),
        booleanParam(name: 'RUN_TESTS', defaultValue: true)
    ])
])

node {
    stage('Build') {
        sh "docker build -t myapp:${params.TAG} ."
    }
    if (params.RUN_TESTS) {
        stage('Test') {
            sh 'make test'
        }
    }
    stage('Deploy') {
        sh "kubectl apply -f deploy/${params.ENV}.yaml"
    }
}

通过参数化设置,你可以轻松实现 动态构建策略,如:

  • 根据参数选择不同环境部署(dev/prod)。
  • 控制是否跳过测试或代码扫描。
  • 动态传入版本号、分支名等。
相关推荐
奶油话梅糖33 分钟前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang38 分钟前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路44 分钟前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
golang学习记1 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力1 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
敲代码的小小酥1 小时前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力1 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
apcipot_rain2 小时前
C++转Java日记(02)
java·开发语言·c++
nice_lcj5202 小时前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
码农小河6612 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库