介绍
Jenkins是一款开源自动化服务器,旨在自动化连续集成和交付软件所涉及的重复技术任务。 凭借强大的插件生态系统和广泛的支持,Jenkins可以处理各种各样的工作负载来构建,测试和部署应用程序。
在以前的指南中,我们将Jenkins安装在Ubuntu 16.04服务器上 ,并使用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加密Nginx
- 如何使用Nginx反向代理使用SSL配置Jenkins
为了最好地控制我们的测试环境,我们将在Docker容器中运行我们应用程序的测试。 Jenkins启动并运行后,请按照本指南中的第1步和第2步在服务器上安装Docker:
完成上述指南后,可以继续阅读本文。
将Jenkins用户添加到Docker组
遵循先决条件后,Jenkins和Docker都安装在您的服务器上。 但是,默认情况下,负责运行Jenkins进程的Linux用户无法访问Docker。
要解决这个问题,我们需要使用usermod
命令将jenkins
用户添加到jenkins
组:
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并登录您的帐户,如果您还没有这样做。 然后,点击右上角的用户图标,然后从下拉菜单中选择设置 :
在下面的页面上,找到左侧菜单的开发人员设置部分,然后单击个人访问令牌 :
点击下一页生成新的令牌按钮:
您将被带到一个页面,您可以在其中定义新令牌的范围。
在令牌描述框中,添加一个可以让您稍后识别的说明:
在“ 选择范围”部分中,查看repo:status , repo:public_repo和admin:org_hook框。 这些将允许Jenkins更新提交状态并为项目创建webhook。 如果您使用的是私有存储库,则需要选择一般的repo权限而不是repo子项:
完成后,单击底部的生成令牌 。
您将被重定向回个人访问令牌索引页面,并显示您的新令牌:
现在复制令牌,以便我们稍后参考。 如消息所示,离开此页面后无法检索令牌。
注意 :如上面的截图所述,出于安全考虑,离开此页面后无法重新显示令牌。 如果丢失了令牌,请从GitHub帐户中删除当前的令牌,然后创建一个新的令牌。
现在,您已经有了GitHub帐户的个人访问令牌,我们可以配置Jenkins来查看项目的存储库。
将GitHub个人访问令牌添加到Jenkins
现在我们有一个令牌,我们需要将其添加到我们的Jenkins服务器,以便它可以自动设置webhooks。 使用您在安装过程中配置的管理帐户登录您的Jenkins Web界面。
在主仪表板上,单击左侧菜单中的凭据 :
在下一页上,单击Jenkins范围内的(全局)旁边的箭头。 在出现的框中,单击添加凭证 :
您将被带到表单以添加新凭据。
在“ 种类”下拉菜单中,选择“ 秘密”文本 。 在“ 秘密”字段中,粘贴您的GitHub个人访问令牌。 填写“ 说明”字段,以便以后能够识别此条目。 您可以将“范围”作为“全局”并将“ID”字段留空:
完成后单击确定按钮。
您现在可以从Jenkins的其他部分引用这些凭据来帮助配置。
设置Jenkins访问GitHub
返回主要的Jenkins仪表板,点击左侧菜单中的管理Jenkins :
在以下页面的链接列表中,单击配置系统 :
滚动下一页中的选项,直到找到GitHub部分。 单击添加GitHub服务器按钮,然后选择GitHub服务器 :
该部分将展开以提示一些其他信息。 在“ 凭据”下拉菜单中,选择您在上一节中添加的GitHub个人访问令牌:
单击测试连接按钮。 Jenkins将对您的帐户进行测试API调用,并验证连接性:
完成后,单击保存按钮实现您的更改。
在您的GitHub帐户中设置演示应用程序
为了演示如何使用Jenkins来测试应用程序,我们将使用一个使用Hapi.js创建的简单的“hello world”程序 。 因为我们正在设置Jenkins来反应以推送到存储库,所以您需要拥有自己的演示代码副本。
访问项目存储库 ,然后单击右上角的“ Fork ”按钮在您的帐户中创建存储库的副本:
存储库的副本将添加到您的帐户中。
存储库包含一个定义运行时和开发依赖关系的package.json
文件,以及如何运行附带的测试套件。 可以通过运行npm install
依赖项,并且可以使用npm test
运行npm test
。
我们也添加了一个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的框架,因此我们将使用Docker图像作为基础。 我们在容器中指定root
用户,以便用户可以同时写入包含检出的代码的附加卷以及脚本将其输出写入的卷。
接下来,文件定义了两个阶段,它们只是逻辑分工。 我们命名了第一个“构建”和第二个“测试”。 构建步骤打印诊断消息,然后运行npm install
以获取所需的依赖关系。 测试步骤打印另一个消息,然后运行package.json
文件中定义的测试。
现在,您有一个有效的Jenkins文件的Jenkinsfile
,我们可以设置Jenkins来监视该存储库,并在引入更改时运行该文件。
在Jenkins创建一条新的管道
接下来,我们可以设置Jenkins来使用GitHub个人访问令牌来观看我们的存储库。
返回主要的Jenkins仪表板,单击左侧菜单中的“ 新建项目 ”:
在输入项名称字段中输入新管道的名称 。 之后,选择管道作为项目类型:
点击底部的确定按钮继续。
在下一个屏幕上,查看GitHub项目框。 在出现的“ 项目”url字段中,输入项目的GitHub存储库URL。
注意 :确保指向您的Hope应用程序的分支,以便Jenkins有权配置webhooks。
接下来,在构建触发器部分中,检查GITScm轮询框的GitHub钩子触发器 :
在管道部分,我们需要告诉Jenkins在我们的存储Jenkinsfile
中运行Jenkinsfile
中定义的管道。 将定义类型从SCM更改为管道脚本 。
在出现的新部分中,在SCM菜单中选择Git 。 在出现的“ 存储库URL”字段中,再次输入存储库中的URL的URL:
注意 :同样,请确保指向您的Hello Hapi应用程序的分支。
注意 :我们的示例引用了公共存储库中可用的Jenkinsfile。 如果您的项目不可公开访问,则需要使用添加凭据按钮来添加对存储库的其他访问。 您可以像之前使用的钩子配置添加个人访问令牌。
完成后,点击页面底部的保存按钮。
执行初始构建和配置Webhooks
在撰写本文时(2017年6月),Jenkins在界面中为存储库定义管道时,不会自动配置Webhook。
为了触发Jenkins设置适当的钩子,我们需要首次执行手动构建。
在管道的主页面中,单击左侧菜单中的“ 立即生成 ”:
将安排一个新的建设。 在左下角的构建历史记录框中,会出现一个新的构建。 此外, Stage View将开始在界面的主要区域绘制。 这将跟踪您的测试运行的进度,因为不同的阶段已经完成:
在构建历史记录框中,单击与构建相关联的编号以转到构建详细信息页面。 从这里,您可以单击左侧菜单中的“ 控制台输出 ”按钮,以查看运行步骤的详细信息:
完成操作后,单击左侧菜单中的“ 返回项目”项目返回主管道视图。
现在我们已经建立了这个项目,我们可以让Jenkins为我们的项目创建webhook。 点击管道左侧菜单中的配置:
在此屏幕上不需要更改,只需单击底部的保存按钮即可。 现在,Jenkins从初始构建过程中获得有关该项目的信息,当您保存该页面时,它将使用我们的GitHub项目注册一个webhook。
您可以通过访问您的GitHub信息库并单击“ 设置”按钮来验证此信息。 在下一页,从侧面菜单中单击Webhooks 。 您应该在主界面中看到您的Jenkins服务器webhook:
现在,当您将新的更改推送到您的存储库时,Jenkins将被通知。 然后它将拉新的代码,并使用相同的过程进行重新测试。
为了近似这个,在我们在GitHub的存储库页面中,您可以单击绿色克隆或下载按钮左侧的创建新文件按钮:
在下一页,选择一个文件名和一些虚拟内容:
完成后,点击底部的提交新文件按钮。
如果您返回到Jenkins界面,您将看到一个新的构建自动启动:
您可以通过提交存储库的本地副本并将其推回到GitHub来启动其他构建。
结论
在本指南中,我们配置了Jenkins来观看GitHub项目,并自动测试任何所提交的新更改。 Jenkins从存储库中提取代码,然后从隔离的Docker容器内运行构建和测试过程。 可以通过向相同的Jenkinsfile
添加附加指令来部署或存储生成的代码。