任务参数化 #

参数化构建允许在触发构建时传入参数,使构建更加灵活和可配置。本节将详细介绍各种参数类型和使用方法。

参数类型概览 #

参数类型 说明 适用场景
String 字符串参数 版本号、分支名
Boolean 布尔参数 开关选项
Choice 选择参数 环境选择
Password 密码参数 敏感信息
File 文件参数 配置文件上传
Run 构建参数 引用其他构建
Text 多行文本 脚本内容

Freestyle项目参数化 #

配置参数 #

  1. 进入任务配置页面
  2. 勾选 This project is parameterized
  3. 点击 Add Parameter 添加参数

String参数 #

text
Add Parameter → String Parameter

Name: VERSION
Default Value: 1.0.0
Description: 应用版本号
Trim: ☑ (去除首尾空格)

Boolean参数 #

text
Add Parameter → Boolean Parameter

Name: DEPLOY
Default Value: true
Description: 是否部署到测试环境

Choice参数 #

text
Add Parameter → Choice Parameter

Name: ENVIRONMENT
Choices:
  dev
  test
  staging
  prod
Description: 部署环境

Password参数 #

text
Add Parameter → Password Parameter

Name: DB_PASSWORD
Default Value: 
Description: 数据库密码

File参数 #

text
Add Parameter → File Parameter

Name: CONFIG_FILE
File Location: config.yaml
Description: 配置文件

Run参数 #

text
Add Parameter → Run Parameter

Name: UPSTREAM_BUILD
Project Name: upstream-job
Description: 选择上游构建

Text参数 #

text
Add Parameter → Text Parameter

Name: SCRIPT_CONTENT
Default Value: |
  #!/bin/bash
  echo "Hello World"
Description: 脚本内容

使用参数 #

Shell脚本中使用 #

bash
#!/bin/bash

echo "=== 构建参数 ==="
echo "版本: ${VERSION}"
echo "环境: ${ENVIRONMENT}"
echo "部署: ${DEPLOY}"
echo "数据库密码: ${DB_PASSWORD}"

if [ "${DEPLOY}" = "true" ]; then
    echo "执行部署..."
    kubectl set image deployment/myapp myapp=myapp:${VERSION}
fi

Windows批处理中使用 #

batch
@echo off
echo === 构建参数 ===
echo 版本: %VERSION%
echo 环境: %ENVIRONMENT%
echo 部署: %DEPLOY%

if "%DEPLOY%"=="true" (
    echo 执行部署...
)

条件判断 #

bash
#!/bin/bash

case "${ENVIRONMENT}" in
    dev)
        echo "部署到开发环境"
        SERVER="dev.example.com"
        ;;
    test)
        echo "部署到测试环境"
        SERVER="test.example.com"
        ;;
    staging)
        echo "部署到预发布环境"
        SERVER="staging.example.com"
        ;;
    prod)
        echo "部署到生产环境"
        SERVER="prod.example.com"
        ;;
esac

echo "目标服务器: ${SERVER}"

Pipeline参数化 #

基本语法 #

groovy
pipeline {
    agent any
    
    parameters {
        string(name: 'VERSION', defaultValue: '1.0.0', description: '应用版本号')
        booleanParam(name: 'DEPLOY', defaultValue: true, description: '是否部署')
        choice(name: 'ENVIRONMENT', choices: ['dev', 'test', 'prod'], description: '部署环境')
        password(name: 'DB_PASSWORD', defaultValue: '', description: '数据库密码')
        text(name: 'NOTES', defaultValue: '', description: '构建说明')
    }
    
    stages {
        stage('Build') {
            steps {
                echo "版本: ${params.VERSION}"
                echo "环境: ${params.ENVIRONMENT}"
                echo "部署: ${params.DEPLOY}"
            }
        }
    }
}

完整示例 #

groovy
pipeline {
    agent any
    
    parameters {
        string(
            name: 'APP_NAME',
            defaultValue: 'myapp',
            description: '应用名称',
            trim: true
        )
        
        string(
            name: 'VERSION',
            defaultValue: '1.0.0',
            description: '应用版本号'
        )
        
        choice(
            name: 'ENVIRONMENT',
            choices: ['dev', 'test', 'staging', 'prod'],
            description: '部署环境'
        )
        
        booleanParam(
            name: 'SKIP_TESTS',
            defaultValue: false,
            description: '跳过测试'
        )
        
        booleanParam(
            name: 'DEPLOY',
            defaultValue: true,
            description: '是否部署'
        )
        
        password(
            name: 'DOCKER_PASSWORD',
            defaultValue: '',
            description: 'Docker仓库密码'
        )
        
        text(
            name: 'RELEASE_NOTES',
            defaultValue: '',
            description: '发布说明'
        )
    }
    
    environment {
        DOCKER_REGISTRY = 'registry.example.com'
    }
    
    stages {
        stage('Info') {
            steps {
                echo "=========================================="
                echo "构建参数"
                echo "=========================================="
                echo "应用名称: ${params.APP_NAME}"
                echo "版本号: ${params.VERSION}"
                echo "环境: ${params.ENVIRONMENT}"
                echo "跳过测试: ${params.SKIP_TESTS}"
                echo "部署: ${params.DEPLOY}"
                echo "=========================================="
            }
        }
        
        stage('Build') {
            steps {
                sh """
                    echo "构建应用 ${params.APP_NAME}:${params.VERSION}"
                    mvn clean package -DskipTests=${params.SKIP_TESTS}
                """
            }
        }
        
        stage('Test') {
            when {
                expression { return !params.SKIP_TESTS }
            }
            steps {
                sh 'mvn test'
            }
        }
        
        stage('Docker Build') {
            steps {
                sh """
                    docker build -t ${DOCKER_REGISTRY}/${params.APP_NAME}:${params.VERSION} .
                """
            }
        }
        
        stage('Docker Push') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'docker-credentials',
                    usernameVariable: 'DOCKER_USER',
                    passwordVariable: 'DOCKER_PASS'
                )]) {
                    sh """
                        docker login -u ${DOCKER_USER} -p ${DOCKER_PASS} ${DOCKER_REGISTRY}
                        docker push ${DOCKER_REGISTRY}/${params.APP_NAME}:${params.VERSION}
                    """
                }
            }
        }
        
        stage('Deploy') {
            when {
                expression { return params.DEPLOY }
            }
            steps {
                sh """
                    kubectl set image deployment/${params.APP_NAME} \
                        ${params.APP_NAME}=${DOCKER_REGISTRY}/${params.APP_NAME}:${params.VERSION} \
                        -n ${params.ENVIRONMENT}
                """
            }
        }
    }
    
    post {
        success {
            echo "构建成功!"
            echo "发布说明: ${params.RELEASE_NOTES}"
        }
    }
}

参数验证 #

使用when条件 #

groovy
stage('Deploy to Production') {
    when {
        expression { 
            return params.ENVIRONMENT == 'prod' && params.DEPLOY == true 
        }
    }
    steps {
        sh 'kubectl apply -f k8s/production/'
    }
}

使用input确认 #

groovy
stage('Deploy to Production') {
    when {
        expression { params.ENVIRONMENT == 'prod' }
    }
    steps {
        input {
            message "确认部署到生产环境?"
            ok "确认部署"
            parameters {
                string(name: 'CONFIRM', defaultValue: '', description: '输入 "CONFIRM" 确认')
            }
        }
        
        script {
            if (env.CONFIRM != 'CONFIRM') {
                error('部署未确认')
            }
        }
        
        sh 'kubectl apply -f k8s/production/'
    }
}

脚本验证 #

groovy
stage('Validate') {
    steps {
        script {
            if (!params.VERSION.matches('\\d+\\.\\d+\\.\\d+')) {
                error("版本号格式错误,应为 x.x.x")
            }
            
            if (params.ENVIRONMENT == 'prod' && !params.VERSION.endsWith('.0')) {
                error("生产环境只能部署正式版本 (x.x.0)")
            }
        }
    }
}

动态参数 #

Active Choices插件 #

安装 Active Choices Plugin 后可以创建动态参数:

groovy
properties([
    parameters([
        [
            $class: 'ChoiceParameter',
            name: 'PROJECT',
            choiceType: 'PT_SINGLE_SELECT',
            description: '选择项目',
            script: [
                $class: 'GroovyScript',
                script: [
                    classpath: [],
                    sandbox: true,
                    script: '''
                        return ['project-a', 'project-b', 'project-c']
                    '''
                ]
            ]
        ],
        [
            $class: 'CascadeChoiceParameter',
            name: 'BRANCH',
            referencedParameters: 'PROJECT',
            choiceType: 'PT_SINGLE_SELECT',
            description: '选择分支',
            script: [
                $class: 'GroovyScript',
                script: [
                    classpath: [],
                    sandbox: true,
                    script: '''
                        def project = PROJECT
                        if (project == 'project-a') {
                            return ['main', 'develop', 'feature-1']
                        } else if (project == 'project-b') {
                            return ['main', 'develop']
                        } else {
                            return ['main']
                        }
                    '''
                ]
            ]
        ]
    ])
])

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo "项目: ${params.PROJECT}"
                echo "分支: ${params.BRANCH}"
            }
        }
    }
}

远程触发带参数 #

curl方式 #

bash
curl -X POST \
  -u username:api-token \
  "http://JENKINS_URL/job/my-job/buildWithParameters?VERSION=2.0.0&ENVIRONMENT=prod&DEPLOY=true"

POST JSON方式 #

bash
curl -X POST \
  -H "Content-Type: application/json" \
  -u username:api-token \
  -d '{"VERSION": "2.0.0", "ENVIRONMENT": "prod", "DEPLOY": true}' \
  "http://JENKINS_URL/job/my-job/buildWithParameters"

Python方式 #

python
import requests
from requests.auth import HTTPBasicAuth

JENKINS_URL = 'http://jenkins.example.com'
JOB_NAME = 'my-job'

params = {
    'VERSION': '2.0.0',
    'ENVIRONMENT': 'prod',
    'DEPLOY': True
}

response = requests.post(
    f'{JENKINS_URL}/job/{JOB_NAME}/buildWithParameters',
    params=params,
    auth=HTTPBasicAuth('username', 'api-token')
)

print(f"Status: {response.status_code}")

参数最佳实践 #

1. 提供默认值 #

groovy
parameters {
    string(name: 'VERSION', defaultValue: '1.0.0', description: '版本号')
}

2. 添加描述 #

groovy
parameters {
    choice(
        name: 'ENVIRONMENT',
        choices: ['dev', 'test', 'prod'],
        description: '''部署环境:
dev - 开发环境
test - 测试环境
prod - 生产环境'''
    )
}

3. 验证参数 #

groovy
stage('Validate') {
    steps {
        script {
            assert params.VERSION =~ /^\d+\.\d+\.\d+$/
            assert params.ENVIRONMENT in ['dev', 'test', 'prod']
        }
    }
}

4. 敏感信息使用凭据 #

groovy
stage('Deploy') {
    steps {
        withCredentials([usernamePassword(
            credentialsId: 'db-credentials',
            usernameVariable: 'DB_USER',
            passwordVariable: 'DB_PASS'
        )]) {
            sh 'mysql -u ${DB_USER} -p${DB_PASS}'
        }
    }
}

5. 使用参数化构建矩阵 #

groovy
pipeline {
    agent any
    parameters {
        booleanParam(name: 'BUILD_LINUX', defaultValue: true)
        booleanParam(name: 'BUILD_WINDOWS', defaultValue: true)
        booleanParam(name: 'BUILD_MAC', defaultValue: true)
    }
    stages {
        stage('Build') {
            parallel {
                stage('Linux') {
                    when { expression { params.BUILD_LINUX } }
                    steps { echo 'Building on Linux' }
                }
                stage('Windows') {
                    when { expression { params.BUILD_WINDOWS } }
                    steps { echo 'Building on Windows' }
                }
                stage('Mac') {
                    when { expression { params.BUILD_MAC } }
                    steps { echo 'Building on Mac' }
                }
            }
        }
    }
}

下一步学习 #

小结 #

  • 参数化使构建更加灵活
  • 支持多种参数类型
  • Pipeline中使用params访问参数
  • 可以进行参数验证
  • 敏感信息应使用凭据管理
  • 支持动态参数和级联选择
最后更新:2026-03-28