Jenkins是一个开源的自动化服务器,目的是能够自动执行持续集成和交付软件所涉及的重复性技术任务。凭借强大的插件生态系统,Jenkins可以处理各种工作负载,构建,测试和部署应用程序。
在本教程中,我们将演示如何设置Jenkins以便在将更改推送到存储库时自动测试应用程序。
我们将Jenkins与GitHub集成,以便在将新代码推送到存储库时通知Jenkins。当Jenkins收到通知时,它将检查代码,然后在Docker容器中对其进行测试,以将测试环境与Jenkins主机隔离。我们将使用示例Node.js应用程序来展示如何为项目定义CI/ CD进程。
您需要一台Ubuntu 16.04服务器和至少1G的RAM。正确安装Jenkins,安装教程详见腾讯云实验室Jenkins 环境搭建,并为Jenkins服务器分配域名。
为了最好地控制我们的测试环境,我们将在Docker容器中运行测试我们的应用程序。在Jenkins启动并运行后,在服务器上安装Docker。
在做好所有的准备后,Jenkins和Docker都已经安装在您的服务器上了。但是,默认情况下,负责运行Jenkins进程的Linux用户无法访问Docker。
要解决此问题,我们需要使用usermod
命令将jenkins
用户添加到docker
组:
$ sudo usermod -aG docker jenkins
您可以列出该docker组的成员以确认jenkins已成功添加该用户:
$ grep docker /etc/group
docker:x:999:sammy,jenkins
为了让Jenkins使用其新成员的资格,您需要重新启动该进程:
$ sudo systemctl restart jenkins
借助我们在安装期间启用的一些默认插件,Jenkins现在可以使用Docker来运行构建和测试任务。
为了让Jenkins能够浏览您的GitHub项目,您需要在GitHub帐户中创建个人访问令牌。
首先访问GitHub并登录您的帐户。然后,单击右上角的用户图标,然后从下拉菜单中选择“设置”:
在随后的页面上,找到左侧菜单的Developer settings部分,然后单击Personal access tokens:
单击下一页上的Generate new token按钮:
您将进入一个页面,您可以在其中定义新令牌的范围。
在令牌描述框中,添加一个描述:
在Select scopes部分中,选中repo:status,repo:public_repo和admin:org_hook框。这些将允许Jenkins更新提交状态并为项目创建webhook。如果您使用的是私人存储库,你需要选择一般的repo权限,而不是repo子项:
完成后,单击底部的生成令牌。
您将被重定向回Personal Access tokens索引页面,并显示您的新令牌:
立即复制令牌,以便我们以后可以引用它。因为离开此页面后我们就无法检索令牌了。
注意:如上面的屏幕截图所示,出于安全原因,离开此页面后无法重新显示令牌。如果您丢失了令牌,请从GitHub帐户中删除当前令牌,然后创建一个新令牌。
现在您已拥有GitHub帐户的个人访问令牌,我们可以配置Jenkins来监视您项目的存储库。
现在我们有一个令牌,我们需要将它添加到我们的Jenkins服务器,以便它可以自动设置webhooks。使用您在安装期间配置的管理帐户登录Jenkins Web界面。
在主界面中,单击左侧菜单中的凭据:
在下一页上,单击Jenkins范围内(全局)旁边的箭头。在显示的框中,单击“添加凭据”:
您将被带到表单以添加新凭据。在Kind下拉菜单下,选择Secret text。在“密码”字段中,粘贴您的GitHub个人访问令牌。填写“说明”字段,以便您以后可以识别此条目。您可以将范围设置为全局,将ID字段留空:
完成后单击“ 确定”按钮。您现在可以从Jenkins的其他部分引用这些凭据以帮助进行配置。
返回主Jenkins仪表板,单击左侧菜单中的Manage Jenkins:
在下一页的链接列表中,单击“ 配置系统”:
滚动下一页找到GitHub部分。单击Add GitHub Server按钮,然后选择GitHub Server:
该部分将扩展为提示输入一些其他信息。在“凭据”下拉菜单中,选择您在上一部分中添加的GitHub个人访问令牌:
单击“ 测试连接”按钮。Jenkins将对您的帐户进行测试API调用并验证连接:
完成后,单击“ 保存”按钮以实现更改。
为了演示如何使用Jenkins测试应用程序,我们将使用一个用Hapi.js创建的“hello world”程序。因为我们正在设置Jenkins以推送到存储库,所以您需要拥有自己的演示代码副本。
访问项目存储库,然后单击右上角的Fork按钮,在您的帐户中制作存储库的副本:
存储库的副本将添加到您的帐户中。
存储库包含一个package.json
文件,用于定义运行时间和开发依赖项,以及如何运行测试套件。可以通过运行npm install
来安装依赖项,并且可以使用运行npm test
来进行测试。
我们也在repo中添加了一个Jenkinsfile
。Jenkins读取此文件以确定要对存储库运行构建,测试或部署的操作。它是使用Jenkins Pipeline DSL的声明版本编写的。
包括在hello-hapi
存储库中的Jenkinsfile
看起来是这样的:
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的框架,我们将使用nodeDocker
镜像作为基础。我们在容器中指定root用户,以便用户可以同时写入包含已签出代码的附加卷以及写入脚本输出的卷。
接下来,该文件定义了两个阶段,这两个阶段只是工作的逻辑划分。我们将第一个命名为“Build”,第二个命名为“Test”。Build步骤打印诊断消息,然后运行npm install
以获取所需的依赖项。Test步骤打印另一条消息,然后按package.json
文件中的定义运行测试。
我们可以设置Jenkins来监视Jenkinsfile
存储库并在引入更改时运行该文件。
接下来,我们可以设置Jenkins使用GitHub个人访问令牌来查看我们的存储库。
返回主Jenkins仪表板,单击左侧菜单中的New Item:
在“输入项目名称”字段中输入新管道的名称。然后,选择Pipeline作为项类型:
单击底部的“ 确定”按钮继续。
在下一个屏幕上,检查GitHub项目框。在出现的Project url字段中,输入项目的GitHub的存储库URL。
注意:确保指向Hello Hapi应用程序的fork,以便Jenkins具有配置webhooks的权限。
接下来,在Build Triggers部分中,检查GITScm轮询框的GitHub钩子触发器:
在Pipeline部分中,我们需要告诉Jenkins运行我们的存储库中Jenkinsfile定义的管道。从SCM将“定义”类型更改为“ 管道”脚本。
在SCM菜单中选择Git。在显示的Repository URL字段中,再次输入存储库fork的URL:
注意:再次确保指向Hello Hapi应用程序的fork。
注意:我们的示例引用了公共存储库中Jenkinsfile的可用内容。如果您的项目不可公开访问,则需要使用“添加凭据”按钮添加对存储库的其他访问权限。您可以像之前一样使用hook配置添加个人访问令牌。
完成后,单击页面底部的“ 保存”按钮。
在撰写本文时,当您在界面中为存储库定义管道时,Jenkins不会自动配置webhook。
为了触发Jenkins设置适当的hook,我们需要在第一次执行手动构建。
在管道的主页面中,单击左侧菜单中的“ 立即构建”:
这将开始新的构建。在左下角的“构建历史记录”框中,应该会显示新构建。此外,Stage视图将开始在界面的主区域中进行绘制。这将跟踪不同阶段完成后测试的运行进度:
在“构建历史记录”框中,单击与构建关联的数字以转到构建的详细信息页面。在此处,您可以单击左侧菜单中的“控制台输出”按钮以查看已运行步骤的详细信息:
完成后单击左侧菜单中的“ 返回项目”以返回主管道视图。
现在我们已经构建了一次项目,我们可以让Jenkins为我们的项目创建webhook。单击管道左侧菜单中的Configure:
只需单击底部的“保存”按钮即可。因为Jenkins从初始构建过程中获得了有关项目的信息,那么当您保存页面时,它将在我们的GitHub项目中注册webhook。
您可以通过转到GitHub存储库并单击“设置”按钮来验证这一点。在下一页上,单击侧面菜单中的Webhooks。您应该在主界面中看到您Jenkins服务器的webhook:
现在,当您将新更改推送到存储库时,它将通知Jenkins。然后它将调取新代码并重新测试它。
为了验证这一点,在我们的GitHub上的存储库页面中,您可以单击克隆或下载按钮左侧的创建新文件按钮:
在下一页上,选择文件名和一些虚拟内容:
完成后,单击底部的“ 提交新文件”按钮。
如果返回到Jenkins界面,您将看到自动启动的新版本:
您可以通过提交存储库的本地副本并将其推回到GitHub来启动其他构建。
本教程,我们将Jenkins与GitHub集成,新代码推送到存储库时通知Jenkins。当Jenkins收到通知时,它将检查代码,然后在Docker容器中对其进行测试,以将测试环境与Jenkins主机隔离。欢迎访问腾讯云社区查看关于更多Jenkins的相关内容。
参考文献:《How To Set Up Continuous Integration Pipelines in Jenkins on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。