如何使用 Docker 和 Jenkins "配置即代码 "自动设置 Jenkins

作者选择维基媒体基金会作为为国家写作计划的一部分接受捐赠。

简介

Jenkins是最流行的开源自动化服务器之一,通常用于协调持续集成(CI)和/或持续部署(CD)工作流。

配置 Jenkins 通常是通过基于 Web 的设置向导手动完成的;这可能是一个缓慢、容易出错且不可扩展的过程。你可以按照如何在 Ubuntu 18.04 上安装 Jenkins指南中的步骤 4 - 设置 Jenkins查看相关步骤。此外,配置无法在版本控制系统(VCS)(如Git)中进行跟踪,也不受任何代码审查流程的监督。

在本教程中,您将使用 DockerJenkins Configuration as Code (JCasC) 方法自动安装和配置 Jenkins。

Jenkins 使用可插拔架构来提供大部分功能。JCasC 利用Configuration as Code插件,可将 Jenkins 配置的理想状态定义为一个或多个YAML 文件,从而无需使用设置向导。初始化时,"配置为代码 "插件将根据配置文件配置 Jenkins,从而大大缩短配置时间并消除人为错误。

Docker是创建和运行容器的事实标准,它是一种_虚拟化_技术,允许你在不同的_操作系统_(OS)和硬件架构上一致地运行孤立的、自足的应用程序。您将使用 Docker 运行 Jenkins 实例,以利用这种一致性和跨平台能力。

本教程首先会指导你设置 JCasC。然后,您将逐步添加 JCasC 配置文件,以设置用户、配置身份验证和授权,最后确保 Jenkins 实例的安全。完成本教程后,您将创建一个自定义 Docker 镜像,该镜像已设置为在启动时使用 "配置即代码 "插件来自动配置和保护 Jenkins 实例。

先决条件

要完成本教程,您需要

  • 访问至少有 2GB 内存并安装了 Docker 的服务器。这可以是你的本地开发机、Droplet 或任何类型的服务器。按照如何安装和使用 Docker系列教程中的步骤 1 - 安装 Docker 来设置 Docker。

<$>[注] 注: 本教程在 Ubuntu 18.04 上进行了测试;不过,由于 Docker 镜像是独立的,因此此处概述的步骤适用于任何安装了 Docker 的操作系统。 <$>

步骤 1 - 禁用安装向导

使用 JCasC 无需显示设置向导;因此,在第一步中,你将创建一个禁用了设置向导的修改版官方 jenkins/jenkins镜像。为此,你将创建一个 Dockerfile 并据此构建一个自定义的 Jenkins 映像。

通过 JAVA_OPTS 环境变量传递名为 jenkins.install.runSetupWizard 的系统属性,jenkins/jenkins映像允许你启用或禁用设置向导。镜像的用户可以在运行时使用 --env 标志向 docker run 传递 JAVA_OPTS 环境变量。不过,这种方法会将禁用安装向导的责任推给映像的用户。相反,你应该在构建时禁用安装向导,这样安装向导就会被默认禁用。

为此,您可以创建一个 Dockerfile 并使用 ENV 指令设置 JAVA_OPTS 环境变量。

首先,在服务器中新建一个目录,用于存储本教程中要创建的文件:

1mkdir -p $HOME/playground/jcasc

然后,导航进入该目录:

1cd $HOME/playground/jcasc

接下来,使用编辑器创建一个名为 Dockerfile 的新文件:

1nano $HOME/playground/jcasc/Dockerfile

然后,将以下内容复制到 Dockerfile 中:

1[label ~/playground/jcasc/]
2FROM jenkins/jenkins:latest
3ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false

这里,我们使用 FROM 指令指定 jenkins/jenkins:latestbase image,并使用 ENV 指令设置 JAVA_OPTS 环境变量。

保存文件并按下 CTRL+X,然后按下 Y,退出编辑器。

完成这些修改后,构建一个新的自定义 Docker 镜像,并为其分配一个唯一的标签(这里我们将使用 jcasc):

1docker build -t jenkins:jcasc .

您将看到类似下面的输出:

1[secondary_label Output]
2Sending build context to Docker daemon 2.048kB
3Step 1/2 : FROM jenkins/jenkins:latest
4 ---> 1f4b0aaa986e
5Step 2/2 : ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false
6 ---> 7566b15547af
7Successfully built 7566b15547af
8Successfully tagged jenkins:jcasc

构建完成后,运行 docker run 运行自定义镜像:

1docker run --name jenkins --rm -p 8080:8080 jenkins:jcasc

你使用了 --name jenkins 选项给容器起了一个易记的名字,否则就会使用一个随机的十六进制 ID(如 f1d701324553)。你还指定了 --rm 标志,这样在停止容器进程后,容器就会自动移除。最后,你使用 -p 标志将服务器主机的端口 8080 配置为代理到容器的端口 80808080 是 Jenkins Web UI 的默认端口。

Jenkins 启动需要一小段时间。当 Jenkins 准备就绪时,你会在输出中看到以下一行:

1[secondary_label Output]
2... hudson.WebAppMain$3#run: Jenkins is fully up and running

现在,打开浏览器访问 server_ip:8080。您将立即看到仪表盘,而无需安装向导。

Jenkins仪表板](assets/jcasc_docker/step1a.png)

您刚刚确认设置向导已被禁用。要进行清理,请按 CTRL+C停止容器。如果之前指定了 --rm 标记,停止的容器会自动移除。

在此步骤中,您创建了一个禁用了设置向导的自定义 Jenkins 映像。不过,Web 界面右上方现在显示了一个红色通知图标,表明设置存在问题。点击图标查看详情。

显示问题的 Jenkins 面板](assets/jcasc_docker/step1b.png)

第一个警告告诉你,你还没有配置 Jenkins URL。第二个警告告诉你,你没有配置任何身份验证和授权方案,匿名用户拥有在 Jenkins 实例上执行所有操作的全部权限。在此之前,设置向导会指导你解决这些问题。现在你已经禁用了它,需要使用 JCasC 复制相同的功能。本教程的其余部分将涉及修改 "Dockerfile "和 JCasC 配置,直到不再出现问题(即红色通知图标消失为止)。

下一步,您将开始这一过程,在自定义 Jenkins 映像中预装一些 Jenkins 插件,包括 "配置即代码 "插件。

第 2 步 - 安装 Jenkins 插件

要使用 JCasC,您需要安装 "配置即代码 "插件。目前尚未安装任何插件。您可以通过导航到 http://server_ip:8080/pluginManager/installed来确认。

Jenkins仪表板显示未安装插件

在这一步中,你将修改你的 Dockerfile 以预装一些插件,包括 "配置即代码 "插件。

要自动执行插件安装过程,可以使用 jenkins/jenkins Docker 镜像自带的安装脚本。你可以在容器内的 /usr/local/bin/install-plugins.sh找到它。要使用它,你需要

  • 创建一个包含要安装的插件列表的文本文件
  • 复制到 Docker 映像中
  • 运行 install-plugins.sh 脚本安装插件

首先,使用编辑器新建一个名为 plugins.txt 的文件:

1nano $HOME/playground/jcasc/plugins.txt

然后,添加以下以换行分隔的插件名称和版本列表(使用格式 <id>:<version>):

 1[label ~/playground/jcasc/plugins.txt]
 2ant:latest
 3antisamy-markup-formatter:latest
 4build-timeout:latest
 5cloudbees-folder:latest
 6configuration-as-code:latest
 7credentials-binding:latest
 8email-ext:latest
 9git:latest
10github-branch-source:latest
11gradle:latest
12ldap:latest
13mailer:latest
14matrix-auth:latest
15pam-auth:latest
16pipeline-github-lib:latest
17pipeline-stage-view:latest
18ssh-slaves:latest
19timestamper:latest
20workflow-aggregator:latest
21ws-cleanup:latest

保存文件并退出编辑器。

该列表包含 "配置即代码"(Configuration as Code)插件,以及设置向导建议的所有插件(从 Jenkins v2.251 起正确)。例如,Git 插件允许 Jenkins 与 Git 仓库一起工作;Pipeline 插件实际上是一套插件,允许将 Jenkins 作业定义为代码。

<$>[注] 注: 最新的建议插件列表可从源代码中推断。您还可以在 plugins.jenkins.io 上找到最受欢迎的社区贡献插件列表。欢迎将任何其他插件加入该列表。 <$>

接下来,打开 Dockerfile 文件:

1nano $HOME/playground/jcasc/Dockerfile

在其中添加一条COPY指令,将plugins.txt文件复制到镜像内的/usr/share/jenkins/ref/目录中;Jenkins 通常在此查找插件。然后,加入额外的 RUN 指令,以运行 install-plugins.sh 脚本:

1[label ~/playground/jcasc/Dockerfile]
2FROM jenkins/jenkins
3ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false
4COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
5RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

保存文件并退出编辑器。然后,使用修改后的 "Dockerfile "创建一个新映像:

1docker build -t jenkins:jcasc .

这一步涉及下载许多插件并安装到镜像中,运行可能需要一些时间,这取决于你的网络连接。插件安装完成后,运行新的 Jenkins 映像:

1docker run --name jenkins --rm -p 8080:8080 jenkins:jcasc

stdout 上出现 "Jenkins 已完全启动并运行 "消息后,导航至 server_ip:8080/pluginManager/installed 查看已安装插件的列表。你会看到在 plugins.txt 中指定的所有插件旁边都有一个实心复选框,而作为这些插件依赖关系的插件旁边也有一个淡色复选框。

已安装插件列表](assets/jcasc_docker/step2b.png)

确认**"配置为代码 "** 插件已安装后,按 CTRL+C终止容器进程。

在此步骤中,您已安装了所有建议的 Jenkins 插件和 "配置即代码 "插件。现在你已准备好使用 JCasC 来解决通知框中列出的问题。在下一步中,你将修复第一个问题,它警告你Jenkins 根 URL 为空

第 3 步 - 指定 Jenkins URL

Jenkins URL 是 Jenkins 实例的 URL,可从需要访问它的设备路由。例如,如果你将 Jenkins 部署为专用网络内的一个节点,那么 Jenkins URL 可以是一个专用 IP 地址,或者是一个可通过专用 DNS 服务器解析的 DNS 名称。在本教程中,使用服务器的 IP 地址(或本地主机的 "127.0.0.1")组成 Jenkins URL 即可。

你可以在网页界面上设置 Jenkins URL,方法是导航至 "server_ip:8080/configure",然后在 "Jenkins Location "标题下的 "**Jenkins URL "字段中输入数值。以下是如何使用 "配置即代码 "插件实现同样功能:

1.在声明式配置文件(我们称之为 casc.yaml)中定义 Jenkins 实例所需的配置。 2.将配置文件复制到 Docker 映像中(就像复制 plugins.txt 文件一样)。 3.将 CASC_JENKINS_CONFIG 环境变量设置为配置文件的路径,以指示 "配置即代码 "插件读取该文件。

首先,创建一个名为 casc.yaml 的新文件:

1nano $HOME/playground/jcasc/casc.yaml

然后,添加以下几行:

1[label ~/playground/jcasc/casc.yaml]
2unclassified:
3  location:
4    url: http://server_ip:8080/

unclassified.location.url 是设置 Jenkins URL 的路径。它只是 JCasC 可设置的众多属性之一。有效属性由安装的插件决定。例如,只有安装了矩阵授权策略插件,jenkins.authorizationStrategy.globalMatrix.permissions属性才有效。要查看有哪些属性可用,请导航至 server_ip:8080/configuration-as-code/reference,你会发现一页根据你的特定 Jenkins 安装而定制的文档。

保存 casc.yaml 文件,退出编辑器,然后打开 Dockerfile 文件:

1nano $HOME/playground/jcasc/Dockerfile

在 "Dockerfile "末尾添加一条 "COPY "指令,将 "casc.yaml "文件复制到位于"/var/jenkins_home/casc.yaml "的镜像中。之所以选择 /var/jenkins_home/,是因为这是 Jenkins 存储所有数据的默认目录:

1[label ~/playground/jcasc/Dockerfile]
2FROM jenkins/jenkins:latest
3ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false
4COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
5RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
6COPY casc.yaml /var/jenkins_home/casc.yaml

然后,再添加一条 ENV 指令,设置 CASC_JENKINS_CONFIG 环境变量:

1[label ~/playground/jcasc/Dockerfile]
2FROM jenkins/jenkins:latest
3ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false
4ENV CASC_JENKINS_CONFIG /var/jenkins_home/casc.yaml
5COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
6RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
7COPY casc.yaml /var/jenkins_home/casc.yaml

<$>[注] 注: 您将 ENV 指令放在顶部,是因为它是您不太可能更改的内容。把它放在 COPYRUN 指令之前,可以避免在更新 casc.yamlplugins.txt 时使缓存层失效。 <$>

保存文件并退出编辑器。接下来,构建图像:

1docker build -t jenkins:jcasc .

然后运行更新后的 Jenkins 映像:

1docker run --name jenkins --rm -p 8080:8080 jenkins:jcasc

一旦出现 "Jenkins 已完全启动并运行 "的日志行,请导航至 "server_ip:8080 "查看仪表板。这时,你可能已经注意到,通知计数减少了一个,有关 Jenkins URL 的警告也消失了。

Jenkins 控制面板显示通知计数器的计数为 1

现在,导航至 server_ip:8080/configure 并向下滚动至 Jenkins URL 字段。确认 Jenkins URL 已设置为与 casc.yaml 文件中指定的相同值。

最后,按CTRL+C键停止容器进程。

在这一步中,你使用了 "配置即代码 "插件来设置 Jenkins URL。下一步,你将处理通知列表中的第二个问题(Jenkins 当前不安全 消息)。

第 4 步 - 创建用户

到目前为止,您的设置尚未实施任何身份验证和授权机制。在此步骤中,您将设置一个基于密码的基本身份验证方案,并创建一个名为 admin 的新用户。

首先打开 casc.yaml 文件:

1nano $HOME/playground/jcasc/casc.yaml

然后,添加高亮显示的片段:

 1[label ~/playground/jcasc/casc.yaml]
 2jenkins:
 3  securityRealm:
 4    local:
 5      allowsSignup: false
 6      users:
 7       - id: ${JENKINS_ADMIN_ID}
 8         password: ${JENKINS_ADMIN_PASSWORD}
 9unclassified:
10  ...

在 Jenkins 中,安全域只是一种身份验证机制;本地安全域意味着使用基本身份验证,用户必须指定自己的 ID/用户名和密码。其他安全域由插件提供。例如,LDAP 插件允许使用现有的 LDAP 目录服务作为身份验证机制。GitHub Authentication](https://plugins.jenkins.io/github-oauth) 插件允许你使用 GitHub 凭据通过 OAuth 进行身份验证。

请注意,您还指定了 "allowsSignup: false"(允许注册:false),这将阻止匿名用户通过网络界面创建账户。

最后,你使用的不是硬编码用户 ID 和密码,而是可在运行时填入其值的变量。这一点很重要,因为使用 JCasC 的好处之一就是可以将 casc.yaml 文件提交到源代码控制中;如果在配置文件中以明文形式存储用户密码,就会有效地泄露凭据。相反,变量是用 ${VARIABLE_NAME} 语法定义的,其值可通过同名环境变量或容器映像中 /run/secrets/ 目录内的同名文件来填写。

接下来,构建一个新的映像,以纳入对 casc.yaml 文件所做的更改:

1docker build -t jenkins:jcasc .

然后,运行更新后的 Jenkins 映像,同时通过 --env 选项输入 JENKINS_ADMIN_IDJENKINS_ADMIN_PASSWORD 环境变量(用自己选择的密码替换 <password>):

1docker run --name jenkins --rm -p 8080:8080 --env JENKINS_ADMIN_ID=admin --env JENKINS_ADMIN_PASSWORD=password jenkins:jcasc

现在您可以访问 "server_ip:8080/login",并使用指定的凭据登录。

已输入用户名和密码的 Jenkins 登录屏幕](assets/jcasc_docker/step4a.png)

登录成功后,您将被重定向到仪表板。

已验证用户的 Jenkins 控制面板,显示用户 ID 和页面右上角的 "注销 "链接](assets/jcasc_docker/step4b.png)

CTRL+C 键停止容器,完成此步骤。

在这一步中,您使用 JCasC 创建了一个名为 admin 的新用户。您还学会了如何在 VCS 跟踪的文件中保留密码等敏感数据。不过,到目前为止,您只配置了用户身份验证,还没有实施任何授权机制。下一步,您将使用 JCasC 授予 admin 用户管理权限。

第 5 步 - 设置授权

设置安全域后,现在必须配置_授权策略_。在这一步中,您将使用 Matrix Authorization Strategy 插件来配置 admin 用户的权限。

默认情况下,Jenkins 核心安装为我们提供了三种授权策略:

  • 不安全":每个用户(包括匿名用户)都拥有做任何事情的全部权限
  • legacy: 模拟传统的 Jenkins(v1.164 之前),其中任何角色为 admin 的用户都有全部权限,而其他用户,包括匿名用户,只有读取权限。

<$>[注] 注意: Jenkins 中的 role 可以是一个用户(例如,daniel)或一个组(例如,developers)。 <$>

  • loggedInUsersCanDoAnything`:匿名用户没有访问权限或只有只读权限。已通过身份验证的用户拥有做任何事的全部权限。只允许已通过身份验证的用户执行操作,这样就能对哪些用户执行了哪些操作进行审计跟踪。

<$>[注] 注: 您可以在 documentation 中探索其他授权策略及其相关插件;其中包括同时处理身份验证和授权的插件。 <$>

所有这些授权策略都非常粗糙,无法对不同用户的权限设置进行细粒度控制。相反,您可以使用已包含在plugins.txt列表中的矩阵授权策略插件。该插件提供了更细粒度的授权策略,允许你在全局以及每个项目/任务中设置用户权限。

矩阵授权策略插件允许你使用 jenkins.authorizationStrategy.globalMatrix.permissions JCasC 属性来设置全局权限。要使用它,请打开casc.yaml文件:

1nano $HOME/playground/jcasc/casc.yaml

并添加突出显示的片段:

 1[label ~/playground/jcasc/casc.yaml]
 2...
 3       - id: ${JENKINS_ADMIN_ID}
 4         password: ${JENKINS_ADMIN_PASSWORD}
 5  authorizationStrategy:
 6    globalMatrix:
 7      permissions:
 8        - "Overall/Administer:admin"
 9        - "Overall/Read:authenticated"
10unclassified:
11...

globalMatrix "属性设置全局权限(相对于每个项目的权限)。权限 "属性是一个字符串列表,格式为"<权限组>/<权限名称>:<角色>"。在此,您将向 admin用户授予Overall/Administer权限。你还授予了authenticated 用户Overall/Read`权限,这是一个代表所有通过身份验证的用户的特殊角色。还有一个特殊角色叫 "匿名",它将所有未通过身份验证的用户集中在一起。但由于默认情况下拒绝给予权限,因此如果不想给匿名用户任何权限,就不需要为其明确添加一个条目。

保存 "casc.yaml "文件,退出编辑器,并创建新镜像:

1docker build -t jenkins:jcasc .

然后,运行更新后的 Jenkins 映像:

1docker run --name jenkins --rm -p 8080:8080 --env JENKINS_ADMIN_ID=admin --env JENKINS_ADMIN_PASSWORD=password jenkins:jcasc

等待 "Jenkins 已完全启动并运行 "日志行,然后导航至 "server_ip:8080"。你将被重定向到登录页面。填写凭据后,你将被重定向到主控制面板。

在此步骤中,您已为 admin 用户设置了全局权限。但是,解决授权问题时发现了其他问题,这些问题现在显示在通知菜单中。

Jenkins 控制面板显示带有两个问题的通知菜单

因此,在下一步中,您将继续修改您的 Docker 映像,逐一解决每个问题,直到一个问题都不剩。

继续之前,请按 CTRL+C停止容器。

第 6 步 - 设置构建授权

通知列表中的第一个问题与构建身份验证有关。默认情况下,所有作业都以系统用户身份运行,而系统用户拥有大量系统权限。因此,Jenkins 用户只需定义并运行一个恶意作业或管道,就能实现权限升级;这是不安全的。

相反,作业应使用配置或触发作业的同一 Jenkins 用户运行。要做到这一点,你需要安装一个名为 Authorize Project 的附加插件。

打开 plugins.txt

1nano $HOME/playground/jcasc/plugins.txt

并添加突出显示的一行:

1[label ~/playground/jcasc/plugins.txt]
2ant:latest
3antisamy-markup-formatter:latest
4authorize-project:latest
5build-timeout:latest
6...

该插件提供了一种新的构建授权策略,您需要在 JCasC 配置中指定该策略。退出 plugins.txt 文件并打开 casc.yaml 文件:

1nano $HOME/playground/jcasc/casc.yaml

将高亮显示的代码块添加到 casc.yaml 文件中:

 1[label ~/playground/jcasc/casc.yaml]
 2...
 3        - "Overall/Administer:admin"
 4        - "Overall/Read:authenticated"
 5security:
 6  queueItemAuthenticator:
 7    authenticators:
 8    - global:
 9        strategy: triggeringUsersAuthorizationStrategy
10unclassified:
11...

保存文件并退出编辑器。然后,使用修改后的 plugins.txtcasc.yaml 文件构建新镜像:

1docker build -t jenkins:jcasc .

然后,运行更新后的 Jenkins 映像:

1docker run --name jenkins --rm -p 8080:8080 --env JENKINS_ADMIN_ID=admin --env JENKINS_ADMIN_PASSWORD=password jenkins:jcasc

等待 "Jenkins 已完全启动并运行 "日志行,然后导航至 "server_ip:8080/login",填写你的凭据,并到达主控制面板。打开通知菜单,您将看到与构建身份验证相关的问题不再出现。

Jenkins仪表板的通知菜单显示与代理到主站安全子系统被关闭有关的单个问题

运行 CTRL+C 停止容器,然后再继续。

在这一步中,你将 Jenkins 配置为使用触发构建的用户而不是系统用户运行构建。这消除了通知列表中的一个问题。在下一步中,你将解决与代理到控制器安全子系统有关的下一个问题。

第 7 步 - 启用代理到控制器的访问控制

在本教程中,您只部署了一个运行所有构建的 Jenkins 实例。不过,Jenkins 支持使用代理/控制器配置进行分布式构建。控制器负责提供 Web UI、为客户端发送请求提供 API 以及协调构建。代理是执行作业的实例。

这种配置的好处是更具可扩展性和容错性。如果运行 Jenkins 的一台服务器宕机,其他实例可以承担额外的负载。

不过,在某些情况下,控制器可能无法信任代理。例如,OPS 团队可能管理 Jenkins 控制器,而外部承包商则管理他们自己定制配置的 Jenkins 代理。如果没有 "代理到控制器安全子系统",代理就能指示控制器执行它所要求的任何操作,这可能是不可取的。通过启用 "代理到控制器访问控制",你可以控制代理可以访问哪些命令和文件。

要启用 "代理到控制器访问控制",请打开 "casc.yaml "文件:

1nano $HOME/playground/jcasc/casc.yaml

然后,添加以下突出显示的行:

1[label ~/playground/jcasc/casc.yaml]
2...
3        - "Overall/Administer:admin"
4        - "Overall/Read:authenticated"
5  remotingSecurity:
6    enabled: true
7security:
8  queueItemAuthenticator:
9...

保存文件并创建新图像:

1docker build -t jenkins:jcasc .

运行更新后的 Jenkins 映像:

1docker run --name jenkins --rm -p 8080:8080 --env JENKINS_ADMIN_ID=admin --env JENKINS_ADMIN_PASSWORD=password jenkins:jcasc

导航至 server_ip:8080/login 并像之前一样进行身份验证。登陆主仪表板后,通知菜单将不再显示任何问题。

Jenkins仪表板显示无问题

结论

现在,您已使用 JCasC 成功配置了一个简单的 Jenkins 服务器。正如管道插件能让开发人员在 "Jenkinsfile "中定义他们的工作一样,"配置即代码 "插件能让管理员在YAML文件中定义Jenkins配置。这两个插件使 Jenkins 更接近于 "一切皆代码"(EaC)范式。

不过,正确使用 JCasC 语法可能比较困难,文档也很难解读。如果您遇到困难并需要帮助,可以在插件的 Gitter 聊天 中找到帮助。

虽然您已使用 JCasC 配置了 Jenkins 的基本设置,但新实例中并不包含任何项目或作业。要想更进一步,请探索Job DSL插件,它允许我们将项目和作业定义为代码。此外,您还可以在 JCasC 配置文件中包含 Job DSL 代码,并在配置过程中创建项目和作业。

Published At
Categories with 技术
comments powered by Disqus