1. 概述

Jenkins 是当前广泛使用的 CI/CD 工具之一。它允许我们自动化软件生命周期的各个方面,从构建到部署。

在这篇教程中,我们将关注 Jenkins 的一个更强大的功能,参数化构建。

2. 定义构建参数

构建参数允许我们将数据传递到 Jenkins 工作中。通过使用构建参数,我们可以传递任何所需的数据:git 分支名称、机密凭据、主机名和端口等。

任何 Jenkins 工作或 管道都可以参数化。我们只需要在通用设置选项卡上勾选框,即“此项目是参数化的”:

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 使用参数构建

这将带我们到一个请求每个参数输入的屏幕。根据参数类型,我们输入其值的方式会有所不同

例如,字符串 参数将以普通文本字段显示,布尔值 参数以复选框显示,而 选择 参数以下拉列表显示:

jenkins 使用参数构建示例

一旦为每个参数提供了值,我们只需点击“构建”按钮,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 管道所必需的。