如何使用JobDSL自动化Jenkins作业配置
作为 Write for DOnations 计划的一部分,作者选择了 Internet Archive 来接收捐赠。
介绍
Jenkins 是一种流行的自动化服务器,通常用于编排 持续集成 (CI) 和持续部署 (CD) 工作流。 但是,传统上,设置 Jenkins 本身的过程对于系统管理员来说是一个手动的、孤立的过程。 该过程通常涉及安装依赖项、运行 Jenkins 服务器、配置服务器、定义管道和配置作业。
然后出现了 Everything as Code (EaC) 范式,它允许管理员将这些手动任务定义为可以进行版本控制和自动化的声明性代码。 在之前的教程中,我们介绍了如何使用 Jenkinsfiles how-to-set-up-continuous-integration-pipelines-in-jenkins-on-ubuntu-16-04 将 Jenkins 管道定义为代码,以及如何使用 Docker 和 JCasC how-to-automate-jenkins-setup-with-docker-and-jenkins-configuration-as-code 安装依赖项并将 Jenkins 服务器的配置定义为代码。 但是仅使用 Docker、JCasC 和管道来设置您的 Jenkins 实例只会让您到目前为止 - 这些服务器不会预加载任何作业,因此仍然需要有人手动配置它们。 Job DSL 插件提供了一个解决方案,并允许您将 Jenkins 作业配置为代码。
在本教程中,您将使用 Job DSL 配置两个演示作业:一个在控制台中打印 'Hello World'
消息,另一个从 Git 存储库运行管道。 如果您按照本教程进行到底,您将拥有一个最小的 Job DSL 脚本,您可以在此基础上构建您自己的用例。
先决条件
要完成本教程,您需要:
- 通过设置向导或使用 Jenkins 配置即代码 (JCasC) 设置 Jenkins 服务器。 如果您没有可以试验的 Jenkins 服务器,您可以按照我们的其他指南 在 Ubuntu、Kubernetes 或 上使用 Docker 和 JCasC [ X183X]。
第 1 步 — 安装 Job DSL 插件
Job DSL 插件提供了您将在本教程中用于演示作业的 Job DSL 功能。 在此步骤中,您将安装 Job DSL 插件。
首先,导航到 your_jenkins_url/pluginManager/available
。 在搜索框中,输入 Job DSL
。 接下来,在生成的插件列表中,选中 Job DSL 旁边的框,然后单击 Install without restart。
注意: 如果搜索 Job DSL
没有返回结果,则表示 Job DSL 插件已安装,或者您的 Jenkins 服务器的插件列表未更新。
您可以通过导航到 your_jenkins_url/pluginManager/installed
并搜索 Job DSL
来检查是否已经安装了 Job DSL 插件。
您可以通过导航到 your_jenkins_url/pluginManager/available
并单击(空)插件列表底部的 Check Now 按钮来更新 Jenkins 服务器的插件列表。
启动安装过程后,您将被重定向到显示安装进度的页面。 等到在 Job DSL 和 Loading plugin extensions 旁边看到 Success,然后继续下一步。
您已经安装了 Job DSL 插件。 您现在可以使用 Job DSL 将作业配置为代码。 在下一步中,您将在 Job DSL 脚本中定义一个演示作业。 然后,您将把脚本合并到一个种子作业中,该作业在执行时将创建已定义的作业。
第 2 步 — 创建种子作业
seed 作业 是运行 Job DSL 脚本的普通 Jenkins 作业; 反过来,该脚本包含创建额外工作的指令。 简而言之,种子工作是一项创造更多工作的工作。 在这一步中,您将构建一个 Job DSL 脚本并将其合并到一个种子作业中。 您将定义的 Job DSL 脚本将创建一个自由式作业,该作业在作业的控制台输出中打印 'Hello World!'
消息。
Job DSL 脚本由 Job DSL 插件提供的 API 方法组成; 您可以使用这些 API 方法来配置作业的不同方面,例如其类型(自由式作业与管道作业)、构建触发器、构建参数、构建后操作等。 您可以在 API 参考站点 上找到所有支持的方法。
默认情况下,该站点显示作为核心 Jenkins 安装的一部分可用的作业配置设置的 API 方法,以及由 184 个支持的插件启用的设置(准确到 v1.77
)。 要更清楚地了解 Job DSL 插件仅为核心 Jenkins 安装提供的 API 方法,请单击搜索框旁边的漏斗图标,然后选中并取消选中 Filter by Plugin 复选框以取消选择所有插件。
API 方法列表现在显着减少。 即使 Jenkins 安装除了 Job DSL 插件之外没有安装任何插件,剩下的也可以工作。
对于“Hello World”自由式作业,您需要 job
API 方法(freeStyleJob
是 job
的别名,也可以使用)。 让我们导航到作业方法 的 文档。
单击 job(String name) { … }
中的省略号图标 (…
) 以显示 job
块中可用的方法和块。
让我们回顾一下 job
块中一些最常用的方法和块:
parameters
:设置用户在新建作业时输入的参数。properties
:要在作业中使用的静态值。scm
:配置如何从 GitHub 等源代码控制管理提供商检索源代码。steps
:构建每个步骤的定义。triggers
:除了手动创建构建之外,还指定作业应该在什么情况下运行(例如,定期像 cron 作业,或者在一些事件之后,比如推送到 GitHub 存储库)。
您可以进一步展开子块以查看其中可用的方法和块。 单击 steps { … }
中的省略号图标 (…
) 以发现 shell(String command)
方法,您可以使用该方法运行 shell 脚本。
将这些部分放在一起,您可以编写如下所示的 Job DSL 脚本来创建一个自由式作业,该作业在运行时将在输出控制台中打印 'Hello World!'
。
job('demo') { steps { shell('echo Hello World!') } }
要运行 Job DSL 脚本,我们必须首先将其合并到种子作业中。
要创建种子作业,请转到 your_jenkins_url
,登录(如有必要),单击仪表板左侧的 New Item 链接。 在随后的屏幕上,输入 seed
,选择 Freestyle project,然后单击 OK。
在随后的屏幕中,向下滚动到 Build 部分,然后单击 Add build step 下拉菜单。 接下来选择 Process Job DSLs。
然后,单击使用提供的DSL脚本旁边的单选按钮,并将您编写的作业DSL脚本粘贴到DSL脚本文本区域。
单击保存以创建作业。 这将带您进入 seed
作业页面。
然后,导航到 your_jenkins_url
并确认 seed
作业在那里。
您已成功创建包含 Job DSL 脚本的种子作业。 在下一步中,您将运行种子作业,以便根据您的作业 DSL 脚本创建新作业。
第 3 步 — 运行种子作业
在此步骤中,您将运行种子作业并确认作业 DSL 脚本中定义的作业确实已创建。
首先,点击返回seed
作业页面,点击左侧的Build Now按钮运行seed
作业。
刷新页面,你会看到一个新的部分,上面写着 Generated Items; 它列出了您在 Job DSL 脚本中指定的 demo
作业。
导航到 your_server_ip
,您将找到您在 Job DSL 脚本中指定的 demo
作业。
点击demo链接进入demo
作业页面。 您将看到 Seed job: seed,表示此作业是由 seed
作业创建的。 现在,单击 Build Now 链接运行一次 demo
作业。
这会在 Build History 框中创建一个条目。 将鼠标悬停在条目的日期上以显示一个小箭头; 单击它以显示下拉菜单。 从下拉列表中选择 控制台输出 。
这将为您带来此构建的日志和控制台输出。 在其中,您将找到 + echo Hello World!
行,然后是 Hello World!
,它对应于 Job DSL 脚本中的 shell('echo Hello World!')
步骤。
您已运行 demo
作业并确认作业 DSL 脚本中指定的 echo
步骤已执行。 在下一步也是最后一步中,您将修改并重新应用 Job DSL 脚本以包含一个额外的管道作业。
第 4 步 - 定义管道作业
根据 Everything as Code 范例,越来越多的开发人员选择将他们的构建定义为 pipeline 作业——那些使用管道脚本(通常命名为 Jenkinsfile
)的作业——而不是自由式作业. 到目前为止,您定义的 demo
作业只是一个小型演示。 在此步骤中,您将定义一个更实际的作业,该作业从 GitHub 拉取 Git 存储库并运行在其管道脚本之一中定义的管道。
要让 Jenkins 拉取 Git 存储库并使用管道脚本进行构建,您需要安装其他插件。 因此,在对 Job DSL 脚本进行任何更改之前,请首先确保已安装所需的插件。
导航到 your_jenkins_url/pluginManager/installed
并检查插件列表中是否存在 Git、Pipeline: Job 和 Pipeline: Groovy 插件。 如果其中任何一个没有安装,请转到your_jenkins_url/pluginManager/available
并搜索并选择插件,然后单击无需重启即可安装。
现在已经安装了所需的插件,让我们将重点转移到修改 Job DSL 脚本以包含额外的管道作业。
我们将定义一个管道作业,从公共 jenkinsci/pipeline-examples Git 存储库中提取代码并运行其中找到的 environmentInStage.groovy 声明性管道脚本。
再次导航到 Jenkins Job DSL API Reference,单击漏斗图标以调出 Filter by Plugin 菜单,然后取消选择除 Git 之外的所有插件,管道:作业和管道:Groovy。
单击左侧菜单上的 pipelineJob 并展开 pipelineJob(String name) { … }
块,然后依次展开 definition { … }
、cpsScm { … }
和 [X135X ] 块。
每个 API 方法上方都有注释,解释了它们的作用。 对于我们的用例,您希望使用 GitHub 存储库中的管道脚本来定义管道作业。 因此,您需要修改 Job DSL 脚本,如下所示:
job('demo') { steps { shell('echo Hello World!') } } pipelineJob('github-demo') { definition { cpsScm { scm { git { remote { github('jenkinsci/pipeline-examples') } } } scriptPath('declarative-examples/simple-examples/environmentInStage.groovy') } } }
要进行更改,请转到 your_jenkins_url/job/seed/configure
并找到 DSL 脚本 文本区域,并将内容替换为新的 Job DSL 脚本。 然后按保存。 在下一个屏幕中,单击 Build Now 以重新运行种子作业。
然后,进入新构建的控制台输出页面,你会发现Added items: 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 配置即代码 (JCasC) 进行设置。 Docker、JCasC、Job DSL 和管道一起使开发人员和管理员可以完全自动地部署和配置 Jenkins,无需任何人工干预。