1. 概述
Jenkins 是当前广泛使用的 CI/CD 工具之一。它允许我们自动化软件生命周期的各个方面,从构建到部署。
在这篇教程中,我们将关注 Jenkins 的一个更强大的功能,参数化构建。
2. 定义构建参数
构建参数允许我们将数据传递到 Jenkins 工作中。通过使用构建参数,我们可以传递任何所需的数据:git 分支名称、机密凭据、主机名和端口等。
任何 Jenkins 工作或 管道都可以参数化。我们只需要在通用设置选项卡上勾选框,即“此项目是参数化的”:
然后点击“添加参数”按钮。从这里,我们必须指定一些信息:
- 类型:参数的数据类型(字符串、布尔值等)
- 名称:标识参数的名称
- 默认值:用户未指定时将使用的可选值
- 描述:描述参数用途的可选文本
单个 Jenkins 工作或管道可以有多个参数。唯一的限制是参数名称必须唯一。
2.1. 参数类型
Jenkins 支持多种参数类型。以下是常见的几种类型,但请记住,不同的插件可能会添加新的参数类型:
- 字符串:字符和数字的任意组合
- 选择:预定义的一组字符串,用户从中可以选择一个值
- 凭证:预定义的 Jenkins 凭证
- 文件:文件系统上的完整路径
- 多行字符串:与“字符串”相同,但允许换行符
- 密码:类似于“凭证”类型,允许我们传递特定于工作或管道的明文参数
- 运行:另一个作业的绝对 URL
3. 使用构建参数
一旦定义了一个或多个参数,下一步就是利用它们。下面,我们将查看访问参数值的不同方式。
3.1. 传统工作
对于传统的 Jenkins 工作,我们定义一个或多个构建步骤。最常见的构建步骤是执行 shell 脚本或 Windows 批处理命令。
假设我们有一个名为 packageType 的构建参数。在 shell 脚本中,我们可以像环境变量一样使用 shell 语法访问构建参数:
${packageType}
而在批处理命令中,我们使用原生的 Windows 语法:
%packageType%
我们还可以创建执行 Gradle 任务或 Maven 目标的构建步骤。这两种步骤类型可以像访问其他环境变量一样访问构建参数。
3.2. 管道
在 Jenkins 管道内部,我们可以以多种方式访问构建参数。
首先,所有构建参数都放置在一个 params 变量中。这意味着我们可以使用点符号语法访问参数值:
pipeline {
agent any
stages {
stage('Build') {
when {
expression { params.jdkVersion == "14" }
}
}
}
}
其次,构建参数添加到管道的环境中。这意味着在执行 shell 脚本的步骤中,我们可以使用较短的 shell 语法:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo "${packageType}"
}
}
}
}
4. 设置参数值
到目前为止,我们已经看到如何定义参数并使用它们在 Jenkins 工作中。最后一步是当我们执行工作时传递参数值。
4.1. Jenkins UI
通过 Jenkins UI 开始工作是传递构建参数的最简单方法。我们只需登录,导航到我们的工作,并点击“使用参数构建”链接:
这将带我们到一个请求每个参数输入的屏幕。根据参数类型,我们输入其值的方式会有所不同。
例如,字符串 参数将以普通文本字段显示,布尔值 参数以复选框显示,而 选择 参数以下拉列表显示:
一旦为每个参数提供了值,我们只需点击“构建”按钮,Jenkins 就会开始执行工作。
4.2. 远程执行
Jenkins 工作也可以通过 远程 API 调用 进行执行。我们通过调用 Jenkins 服务器上的特殊 URL 来执行这种情况:
http://<JENKINS_URL>/job/<JOB_NAME>/buildWithParameters/packageType=war&jdkVersion=11&debug=true
注意,我们需要发送这些请求作为 POST 命令。我们还必须使用 HTTP 基本认证提供凭据。
让我们看一个使用 curl 的完整示例:
curl -X POST --user user:apiToken \
http://<JENKINS_URL>/job/<JOB_NAME>/buildWithParameters/packageType=war&jdkVersion=11&debug=true
user 可以是任何 Jenkins 用户,而 apiToken 是与该用户关联的任何 API 密钥。
5. 总结
在这篇文章中,我们学习了如何使用 Jenkins 工作和管道中的构建参数。构建参数是一种使任何 Jenkins 工作动态化的强大方式,并且是构建现代 CI/CD 管道所必需的。