简介
Jenkins是一种流行的自动化服务器,通常用于协调持续集成(CI)和持续部署(CD)工作流。然而,Jenkins 本身的设置过程历来都是系统管理员手动操作的孤岛式过程。这一过程通常包括安装依赖项、运行 Jenkins 服务器、配置服务器、定义管道和配置作业。
后来,"一切皆代码(EaC)"范式出现了,它允许管理员将这些手动任务定义为可进行版本控制和自动化的声明式代码。在之前的教程中,我们介绍了如何使用 "Jenkinsfile "将 Jenkins 管道定义为代码,以及如何使用 Docker 和 JCasC 将 Jenkins 服务器的依赖关系安装和配置定义为代码。但是,仅使用 Docker、JCasC 和管道来设置 Jenkins 实例只能到此为止--这些服务器不会预先加载任何作业,因此仍需手动配置。Job DSL](https://plugins.jenkins.io/job-dsl)插件提供了一种解决方案,它允许你以代码的形式配置 Jenkins 作业。
在本教程中,您将使用 Job DSL 配置两个演示作业:一个是在控制台中打印"'Hello World'"消息,另一个是从 Git 仓库运行管道。如果您按照本教程学习到最后,您将拥有一个最小的 Job DSL 脚本,您可以在此基础上开发自己的用例。
先决条件
要完成本教程,您需要
- 通过设置向导或使用 Jenkins Configuration as Code (JCasC) 设置 Jenkins 服务器。如果你没有 Jenkins 服务器可以试用,可以按照我们的其他指南在 Ubuntu 上安装 Jenkins、在 Kubernetes 上安装 Jenkins或使用 Docker 和 JCasC。
步骤 1 - 安装作业 DSL 插件
Job DSL](https://plugins.jenkins.io/job-dsl)插件提供了本教程中您将用于演示作业的 Job DSL 功能。在本步骤中,您将安装 Job DSL 插件。
首先,导航至 your_jenkins_url/pluginManager/available
。在搜索框中输入 "Job DSL"。然后,在生成的插件列表中,选中Job DSL 旁边的复选框,并单击** 无需重启即可安装** 。
<$>[注意] 注意: 如果搜索 "Job DSL "没有返回结果,要么说明 Job DSL 插件已经安装,要么说明您的 Jenkin 服务器的插件列表没有更新。
您可以通过导航到 your_jenkins_url/pluginManager/installed
并搜索 Job DSL
来检查 Job DSL 插件是否已安装。
您可以通过导航至 your_jenkins_url/pluginManager/available
更新 Jenkins 服务器的插件列表,并单击(空)插件列表底部的 Check Now 按钮。
<$>
启动安装程序后,您将被重定向到一个显示安装进度的页面。请等待Job DSL 和** Loading plugin extensions** 旁边的** Success** ,然后再继续下一步。
您已经安装了 Job DSL 插件。现在,您已准备好使用 Job DSL 将作业配置为代码。在下一步中,您将在 Job DSL 脚本中定义一个演示作业。然后,您将把脚本合并到种子作业中,种子作业执行后将创建所定义的作业。
第 2 步 - 创建种子任务
种子作业是运行作业 DSL 脚本的普通 Jenkins 作业;反过来,该脚本包含创建其他作业的指令。简而言之,种子作业就是创建更多作业的作业。在本步骤中,你将构建一个 Job DSL 脚本,并将其纳入种子作业。您将定义的作业 DSL 脚本将创建一个单一的自由式作业,在作业的控制台输出中打印一条"'Hello World!'"消息。
作业 DSL 脚本由作业 DSL 插件提供的 API 方法组成;您可以使用这些 API 方法配置作业的不同方面,如作业类型(自由式作业与管道作业)、构建触发器、构建参数、构建后操作等。您可以在 API 参考站点 上找到所有支持的方法。
Jenkins Job DSL API 参考网页](assets/jenkins_dsl/step2a.png)
默认情况下,该网站会显示作为核心 Jenkins 安装一部分的作业配置设置 API 方法,以及由 184 个支持的插件启用的设置(精确至v1.77
)。要更清楚地了解 Job DSL 插件仅为核心 Jenkins 安装提供哪些 API 方法,请单击搜索框旁边的漏斗图标,然后选中或取消选中 Filter by Plugin 复选框,以取消选择所有插件。
仅显示核心 API 的 Jenkins Job DSL API 参考网页](assets/jenkins_dsl/step2b.png)
API 方法列表现在已大幅减少。即使 Jenkins 安装中除了 Job DSL 插件外没有安装其他插件,剩余的 API 方法也能正常工作。
对于 "Hello World "自由式作业,您需要使用 job
API 方法("freeStyleJob "是 job
的别名,也可以使用)。让我们浏览一下 job
方法的文档。
工作 API 方法参考](assets/jenkins_dsl/step2c.png)
单击 job(String name) { ... }
中的省略号图标(...
),显示 job
块中可用的方法和块。
工作 API 方法参考的扩展视图](assets/jenkins_dsl/step2d.png)
让我们来看看 job
块中一些最常用的方法和块:
parameters
: 设置参数,供用户在创建新作业时输入。properties
: 在作业中使用的静态值。scm
: 配置如何从 GitHub 等源代码控制管理提供商获取源代码。steps
: 每一步构建的定义。triggers
: 除了手动创建构建外,还指定在什么情况下运行该作业(例如,像 cron job 一样定期运行,或在某些事件(如推送到 GitHub 仓库)后运行)。
您可以进一步展开子块,查看其中有哪些方法和块。点击 steps { ...}
中的省略号图标(...
),可以找到 shell(String command)
方法,使用该方法可以运行 shell 脚本。
工作 DSL 步骤模块参考](assets/jenkins_dsl/step2e.png)
将这些部分组合在一起,就可以编写类似下面的 Job DSL 脚本来创建一个自由式作业,运行时将在输出控制台中打印"'Hello World!
1job('demo') {
2 steps {
3 shell('echo Hello World!')
4 }
5}
要运行作业 DSL 脚本,我们必须先将其纳入种子作业。
要创建种子作业,请访问 your_jenkins_url
,登录(如有必要),点击仪表板左侧的新项目 链接。在随后出现的屏幕上,输入 seed
,选择 ** Freestyle项目** ,然后点击 ** OK** 。
在接下来的屏幕中,向下滚动到构建 部分,然后单击** 添加构建步骤** 下拉菜单。接下来选择 ** 处理作业 DSL** 。
然后,单击使用提供的 DSL 脚本 旁边的单选按钮,并将您编写的任务 DSL 脚本粘贴到** DSL 脚本** 文本区域。
单击保存 创建任务。这将带您进入 "种子 "任务页面。
然后,导航到 your_jenkins_url
并确认 seed
作业在那里。
您已经成功创建了一个包含作业 DSL 脚本的种子作业。下一步,您将运行种子作业,以便根据作业 DSL 脚本创建新作业。
第 3 步 - 运行种子任务
在此步骤中,您将运行种子作业,并确认作业 DSL 脚本中定义的作业确实已创建。
首先,点击返回 "种子 "任务页面,然后点击左侧的 "立即构建 "按钮运行 "种子 "任务。
刷新页面后,你会看到一个新的部分,上面写着 "生成项目 ";它列出了你在作业 DSL 脚本中指定的 "演示 "作业。
种子作业页面显示运行种子作业后生成的项目列表](assets/jenkins_dsl/step3a.png)
导航至 your_server_ip
并找到在作业 DSL 脚本中指定的 demo
作业。
单击演示 链接,进入 "演示 "作业页面。你会看到** 种子作业:seed** ,表明该作业是由 "种子 "作业创建的。现在,点击** 立即构建** 链接,运行一次 "演示 "作业。
这将在创建历史 框内创建一个条目。将鼠标悬停在条目的日期上,会显示一个小箭头;点击它,会显示下拉菜单。从下拉菜单中选择** 控制台输出** 。
这将带来此次构建的日志和控制台输出。在这一行中,你会发现 + echo Hello World!
后面跟着 Hello World!
,这与你的 Job DSL 脚本中的 shell('echo Hello World!')
步骤相对应。
您已运行了 demo
作业,并确认作业 DSL 脚本中指定的 echo
步骤已执行。在下一步,也是最后一步,您将修改并重新应用 Job DSL 脚本,以包含一个额外的管道作业。
步骤 4 - 确定管道工作
为了与 "一切皆代码 "范式保持一致,越来越多的开发人员选择将构建定义为 pipeline 作业,即那些使用管道脚本(通常命名为 Jenkinsfile
)的作业,而不是自由式作业。到目前为止,你定义的 demo
作业只是一个小型演示。在这一步,你将定义一个更实际的作业,从 GitHub 上拉取一个 Git 仓库,并运行其中一个管道脚本中定义的管道。
要让 Jenkins 拉取 Git 仓库并使用管道脚本进行构建,你需要安装额外的插件。因此,在对 Job DSL 脚本做任何修改之前,首先要确保安装了所需的插件。
导航至 your_jenkins_url/pluginManager/installed
并检查插件列表中是否存在 Git、Pipeline: Job 和 Pipeline: Groovy 插件。如果其中任何一个未安装,请转到 your_jenkins_url/pluginManager/available
搜索并选择插件,然后点击 无需重启即可安装 。
现在,所需的插件已安装完毕,让我们把重点转移到修改作业 DSL 脚本上,以包含一个额外的管道作业。
我们将定义一个管道作业,从公开的 jenkinsci/pipeline-examples
Git 代码库中提取代码,并运行其中的 environmentInStage.groovy
声明式管道脚本。
再次导航到 Jenkins Job DSL API Reference,点击漏斗图标调出Filter by Plugin 菜单,然后取消选择除** Git** 、** Pipeline:Job** 、** Pipeline:Groovy** 。
点击左侧菜单中的pipelineJob ,展开 "pipelineJob(String name) { ... }"块,然后依次展开 "definition { ... }"、"cpsScm { ... }"和 "scm { ... }"块。
pipelineJob API 方法块的扩展视图](assets/jenkins_dsl/step4b.png)
每个 API 方法上方都有注释,解释了它们的作用。在我们的用例中,您希望使用 GitHub 仓库中的管道脚本来定义管道作业。因此,您需要对作业 DSL 脚本进行如下修改:
1job('demo') {
2 steps {
3 shell('echo Hello World!')
4 }
5}
6
7pipelineJob('github-demo') {
8 definition {
9 cpsScm {
10 scm {
11 git {
12 remote {
13 github('jenkinsci/pipeline-examples')
14 }
15 }
16 }
17 scriptPath('declarative-examples/simple-examples/environmentInStage.groovy')
18 }
19 }
20}
要进行更改,请转到your_jenkins_url/job/seed/configure
并找到DSL 脚本 文本区域,然后用新的 Job DSL 脚本替换其中的内容。然后按** 保存** 。在下一个屏幕中,单击** 立即构建** 重新运行种子作业。
然后,进入新构建的控制台输出页面,你会发现 "已添加项目:GeneratedJob{name='github-demo'}",这意味着你已经成功添加了新的管道作业,而现有作业保持不变。
你可以访问 your_jenkins_url
确认这一点;你会发现 github-demo
作业出现在作业列表中。
最后,通过导航至 your_jenkins_url/job/github-demo/
并单击 Build Now 确认作业已按预期运行。构建完成后,导航至 your_jenkins_url/job/github-demo/1/console
,你会发现控制台输出页面显示 Jenkins 已成功克隆了版本库并执行了管道脚本。
结论
在本教程中,您使用了 Job DSL 插件,以一致且可重复的方式配置 Jenkins 服务器上的作业。
但是,Job DSL 并不是 Jenkins 生态系统中唯一遵循 "一切皆代码"(EaC)范式的工具。您还可以将 Jenkins 部署为 Docker 容器,并使用 Jenkins Configuration as Code(JCasC)进行设置。Docker、JCasC、Job DSL 和管道共同允许开发人员和管理员完全自动地部署和配置 Jenkins,无需任何人工参与。