每次手动修改Jenkins配置的日子,就像每天吃同一碗白米饭,没味道还不得不咽。现在,是时候给Jenkins加点料了。
1 什么是参数化构建?从“固定套餐”到“自助点单”
简单来说,参数化构建就是在Jenkins任务中添加一系列可配置的参数,这些参数可以在构建开始时由用户输入或通过API传递,从而影响构建的过程和行为。
没有参数化构建前:每次构建项目时都需要去修改配置,然后保存,再去立即构建。这样修改容易出错,操作也比较麻烦。
使用参数化构建后:就像我们去咖啡店点单,可以自由选择咖啡种类、糖度、冰量等参数,最终得到符合个人口味的咖啡。
在企业中,要实现敏捷开发,必须结合Jenkins的众多插件来实现更强大的特性。通过参数化构建,我们可以取到构建人员究竟是想根据参数做什么操作,提前在shell脚本中做好对应的判断。
1.1 为什么你的Jenkins需要参数化构建?
在日常开发中,这种场景屡见不鲜:
- 开发需要部署到测试环境,而测试人员需要部署到预发环境
- 同一个项目需要根据不同参数构建不同模块
- 生产环境部署需要人工确认才能进行
参数化构建的四大优势:
- 提高灵活性:通过参数化构建,我们可以根据不同的需求提供可配置的参数,动态调整构建的配置和行为。
- 减少重复Job:在没有使用参数化构建之前,可能需要为每个环境(开发、测试、生产)创建单独的Job。
- 降低出错风险:每次构建项目时如果都需要修改配置,不仅麻烦,还容易出错。
- 实现更复杂的流程控制:结合条件判断和参数,可以实现根据不同的参数值执行不同的构建步骤。
2 参数化构建进化史:从“青铜”到“王者”
回顾Jenkins参数化构建的发展历程,它经历了一段有趣的进化:
2.1 远古时期:硬编码配置
在参数化构建出现之前,每个小改动都意味着需要修改Job配置并保存。正如一个开发者在2017年所描述:"由于每次构建的时候指定的SVN路径都不同,如果不使用参数化构建则每次都需要修改配置中的SVN路径,不但不安全也容易出现错误"。
这就像每次换电视频道都需要重新焊接电视机内部电路一样笨拙。
2.2 青铜时代:基础参数类型
早期的参数化构建支持基本的参数类型,主要是字符串参数和选项参数。这些基础参数虽然简单,但已经解决了大部分常见问题。
字符串参数的应用场景:将SVN地址设置为字符串参数,当开始构建的时候将会提示用户输入参数值(即:SVN地址)。
选项参数的价值:通过一个Tomcat_check的Job替代每个模块都需要一个对应Job的冗余情况,大大减少了Job数量。
2.3 白银时代:Pipeline集成
随着Jenkins Pipeline的普及,参数化构建进入了代码化时代。现在,我们可以在Jenkinsfile中直接定义参数,这让配置更加灵活且易于版本管理。
Pipeline中的parameters指令支持多种参数类型:
pipeline {
agent any
parameters {
booleanParam(defaultValue: true, description: '', name: 'p_userFlag')
choice(
choices: 'dev\nprod',
description: 'choose deploy environment',
name: 'p_deploy_env'
)
string (name: 'p_version', defaultValue: '1.0.0', description: 'build version')
text (name: 'p_deploy_text', defaultValue: 'One\nTwo\nThree', description: '')
password (name: 'p_password', defaultValue: '', description: '')
}
}
被传入的参数会放到名为params的对象中,在pipeline中可以直接使用,比如params.userFlag就是引用parameters指令中定义的userFlag参数。
2.4 黄金时代:动态参数
现代的参数化构建支持动态参数,这标志着参数化构建进入了成熟阶段。Active Choices插件允许我们创建动态更新的参数。
比如,我们可以创建一个根据所选环境动态显示不同服务器列表的参数:
if (DEPLOY_ENV == "dev") {
return ["dev-server-1", "dev-server-2"]
} else if (DEPLOY_ENV == "test") {
return ["test-server-1", "test-server-2"]
} else if (DEPLOY_ENV == "staging") {
return ["staging-server-1"]
} else if (DEPLOY_ENV == "production") {
return ["prod-server-1", "prod-server-2", "prod-server-3"]
} else {
return ["default-server"]
}
3 参数化构建实战:打造多环境部署流水线
3.1 常用参数类型一览
Jenkins提供了多种参数类型,像是一个专业厨房的各种调味区:
| 参数类型 |
用途描述 |
示例定义 |
| string |
文本输入(分支名、版本号) |
string(name: 'BRANCH', defaultValue: 'main', description: 'Git分支名') |
| b |

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



