如何在Ubuntu16.04上的Jenkins中设置持续集成管道
介绍
Jenkins 是一个开源自动化服务器,旨在自动化软件持续集成和交付中涉及的重复性技术任务。 凭借强大的插件生态系统和广泛的支持,Jenkins 可以处理各种工作负载来构建、测试和部署应用程序。
在之前的指南中,我们 在 Ubuntu 16.04 服务器 上安装了 Jenkins,并且 使用 Nginx 反向代理 为 Jenkins 配置了 SSL。 在本指南中,我们将演示如何设置 Jenkins 以在将更改推送到存储库时自动测试应用程序。
在本教程中,我们将 Jenkins 与 GitHub 集成,以便在将新代码推送到存储库时通知 Jenkins。 当 Jenkins 收到通知时,它将签出代码,然后在 Docker 容器中对其进行测试,以将测试环境与 Jenkins 主机隔离。 我们将使用一个示例 Node.js 应用程序来展示如何为项目定义 CI/CD 流程。
先决条件
要按照本指南进行操作,您需要一个 Ubuntu 16.04 服务器,至少 1G 的 RAM 配置了安全的 Jenkins 安装。 要正确保护 Web 界面,您需要为 Jenkins 服务器分配一个域名。 按照这些指南了解如何以预期的格式设置 Jenkins:
- 如何在 Ubuntu 16.04 上安装 Jenkins
- 如何在 Ubuntu 16.04 上安装 Nginx
- 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx
- 如何使用 Nginx 反向代理为 Jenkins 配置 SSL
为了最好地控制我们的测试环境,我们将在 Docker 容器中运行应用程序的测试。 Jenkins 启动并运行后,按照本指南的步骤 1 和 2 在服务器上安装 Docker:
完成上述指南后,您可以继续阅读本文。
将 Jenkins 用户添加到 Docker 组
在满足先决条件之后,Jenkins 和 Docker 都安装在您的服务器上。 但是,默认情况下,负责运行 Jenkins 进程的 Linux 用户无法访问 Docker。
要解决这个问题,我们需要使用 usermod
命令将 jenkins
用户添加到 docker
组:
sudo usermod -aG docker jenkins
可以列出docker
组的成员,确认jenkins
用户添加成功:
grep docker /etc/group
Outputdocker:x:999:sammy,jenkins
为了让 Jenkins 使用其新成员资格,您需要重新启动该过程:
sudo systemctl restart jenkins
借助我们在安装过程中启用的一些默认插件,Jenkins 现在可以使用 Docker 运行构建和测试任务。
在 GitHub 中创建个人访问令牌
为了让 Jenkins 观看您的 GitHub 项目,您需要在我们的 GitHub 帐户中创建个人访问令牌。
首先访问 GitHub 并登录您的帐户(如果您尚未这样做)。 然后,单击右上角的用户图标,然后从下拉菜单中选择 Settings:
在随后的页面中,找到左侧菜单的 开发者设置 部分,然后单击 个人访问令牌:
点击下一页的生成新令牌按钮:
您将被带到一个页面,您可以在其中定义新令牌的范围。
在 Token description 框中,添加一个描述,以便您以后识别它:
在 Select scopes 部分中,选中 repo:status、repo:public_repo 和 admin:org_hook 框。 这些将允许 Jenkins 更新提交状态并为项目创建 webhook。 如果您使用的是私有存储库,则需要选择通用 repo 权限而不是 repo 子项:
完成后,点击底部的生成令牌。
您将被重定向回个人访问令牌索引页面,并且您的新令牌将显示:
现在复制令牌,以便我们以后可以引用它。 如消息所示,一旦您离开此页面,就无法检索令牌。
注意:如上图所示,出于安全原因,离开此页面后无法重新显示令牌。 如果您丢失了令牌,请从您的 GitHub 帐户中删除当前令牌,然后创建一个新令牌。
现在您已经拥有 GitHub 帐户的个人访问令牌,我们可以配置 Jenkins 以监视您项目的存储库。
将 GitHub 个人访问令牌添加到 Jenkins
现在我们有了一个令牌,我们需要将它添加到我们的 Jenkins 服务器,以便它可以自动设置 webhook。 使用您在安装期间配置的管理帐户登录到您的 Jenkins Web 界面。
在主仪表板中,单击左侧菜单中的 Credentials:
在下一页上,单击 Jenkins 范围内 (global) 旁边的箭头。 在出现的框中,单击添加凭据:
您将被带到一个表单以添加新凭据。
在种类下拉菜单下,选择密文。 在 Secret 字段中,粘贴您的 GitHub 个人访问令牌。 填写 Description 字段,以便您以后能够识别此条目。 您可以将 Scope 保留为 Global 并将 ID 字段留空:
完成后单击 OK 按钮。
您现在可以从 Jenkins 的其他部分引用这些凭据来帮助进行配置。
设置 Jenkins 访问 GitHub
返回主 Jenkins 仪表板,单击左侧菜单中的 Manage Jenkins:
在下一页的链接列表中,单击配置系统:
滚动浏览下一页上的选项,直到找到 GitHub 部分。 点击添加GitHub服务器按钮,然后选择GitHub服务器:
该部分将展开以提示输入一些附加信息。 在 Credentials 下拉菜单中,选择您在上一部分中添加的 GitHub 个人访问令牌:
单击测试连接按钮。 Jenkins 将对您的帐户进行测试 API 调用并验证连接性:
完成后,单击 Save 按钮以实施您的更改。
在您的 GitHub 帐户中设置演示应用程序
为了演示如何使用 Jenkins 测试应用程序,我们将使用由 Hapi.js 创建的简单 “hello world”程序 。 因为我们正在设置 Jenkins 以响应对存储库的推送,所以您需要拥有自己的演示代码副本。
访问项目仓库,点击右上角的Fork按钮,在你的账户中复制仓库:
存储库的副本将添加到您的帐户中。
该存储库包含一个 package.json
文件,该文件定义了运行时和开发依赖项,以及如何运行包含的测试套件。 可以通过运行 npm install
来安装依赖项,并且可以使用 npm test
运行测试。
我们还在 repo 中添加了 Jenkinsfile
。 Jenkins 读取此文件以确定对存储库运行的操作以构建、测试或部署。 它是使用 Jenkins Pipeline DSL 的声明性版本编写的。
hello-hapi
存储库中包含的 Jenkinsfile
如下所示:
詹金斯文件
#!/usr/bin/env groovy pipeline { agent { docker { image 'node' args '-u root' } } stages { stage('Build') { steps { echo 'Building...' sh 'npm install' } } stage('Test') { steps { echo 'Testing...' sh 'npm test' } } } }
pipeline
包含 Jenkins 将评估的整个定义。 在内部,我们有一个 agent
部分,它指定管道中的操作将在何处执行。 为了将我们的环境与主机系统隔离,我们将在 docker
代理指定的 Docker 容器中进行测试。
由于 Hapi.js 是 Node.js 的框架,我们将使用 node
Docker 镜像作为我们的基础。 我们在容器中指定 root
用户,以便用户可以同时写入包含签出代码的附加卷和脚本将其输出写入的卷。
接下来,该文件定义了两个阶段,它们只是工作的逻辑划分。 我们将第一个命名为“Build”,第二个命名为“Test”。 构建步骤打印一条诊断消息,然后运行 npm install
以获取所需的依赖项。 测试步骤打印另一条消息,然后运行 package.json
文件中定义的测试。
现在您有了一个包含有效 Jenkinsfile
的存储库,我们可以设置 Jenkins 来监视此存储库并在引入更改时运行该文件。
在 Jenkins 中创建新管道
接下来,我们可以设置 Jenkins 以使用 GitHub 个人访问令牌来监视我们的存储库。
返回主 Jenkins 仪表板,单击左侧菜单中的 New Item:
在 输入项目名称 字段中输入新管道的名称。 然后,选择 Pipeline 作为项目类型:
单击底部的 OK 按钮继续。
在下一个屏幕上,选中 GitHub 项目 框。 在出现的 Project url 字段中,输入项目的 GitHub 存储库 URL。
注意:确保指向您的 Hello Hapi 应用程序的分支,以便 Jenkins 有权配置 webhook。
接下来,在 Build Triggers 部分中,选中 GitHub hook trigger for GITScm polling 框:
在 Pipeline 部分,我们需要告诉 Jenkins 运行我们存储库中 Jenkinsfile
中定义的管道。 将 SCM 中的 Definition 类型更改为 Pipeline 脚本。
在出现的新部分中,在 SCM 菜单中选择 Git。 在出现的 Repository URL 字段中,再次输入您的存储库分支的 URL:
注意:同样,请确保指向您的 Hello Hapi 应用程序的分支。
注意:我们的示例引用了公共存储库中可用的 Jenkinsfile
。 如果您的项目不可公开访问,您将需要使用 添加凭据 按钮来添加对存储库的其他访问权限。 您可以像我们之前对钩子配置所做的那样添加个人访问令牌。
完成后,单击页面底部的保存按钮。
执行初始构建和配置 Webhook
在撰写本文时(2017 年 6 月),当您在界面中为存储库定义管道时,Jenkins 不会自动配置 webhook。
为了触发 Jenkins 设置适当的钩子,我们需要在第一次执行手动构建。
在管道的主页中,单击左侧菜单中的 Build Now:
将安排新的构建。 在左下角的 Build History 框中,很快就会出现一个新的构建。 此外,一个Stage View 将开始在界面的主要区域绘制。 随着不同阶段的完成,这将跟踪您的测试运行的进度:
在 Build History 框中,单击与构建关联的编号以转到构建详细信息页面。 从这里,您可以单击左侧菜单中的 Console Output 按钮以查看运行步骤的详细信息:
完成后单击左侧菜单中的 Back to Project 项以返回主管道视图。
现在我们已经构建了一次项目,我们可以让 Jenkins 为我们的项目创建 webhook。 点击管道左侧菜单中的配置:
此屏幕无需更改,只需单击底部的保存按钮即可。 现在 Jenkins 已经从初始构建过程中获得了有关该项目的信息,它会在您保存页面时向我们的 GitHub 项目注册一个 webhook。
您可以通过转到您的 GitHub 存储库并单击 Settings 按钮来验证这一点。 在下一页上,单击侧面菜单中的 Webhooks。 您应该在主界面中看到您的 Jenkins 服务器 webhook:
现在,当您将新更改推送到存储库时,Jenkins 将收到通知。 然后它将提取新代码并使用相同的过程重新测试它。
为了近似这一点,在我们在 GitHub 上的存储库页面中,您可以单击绿色 克隆或下载 按钮左侧的 创建新文件 按钮:
在下一页上,选择一个文件名和一些虚拟内容:
完成后点击底部的提交新文件按钮。
如果您返回 Jenkins 界面,您将看到一个新的构建自动启动:
您可以通过提交到存储库的本地副本并将其推回 GitHub 来启动其他构建。
结论
在本指南中,我们将 Jenkins 配置为监视 GitHub 项目并自动测试已提交的任何新更改。 Jenkins 从存储库中提取代码,然后在隔离的 Docker 容器中运行构建和测试过程。 可以通过向相同的 Jenkinsfile
添加额外的指令来部署或存储生成的代码。