使用Jenkins搭建持续集成服务
1. 什么是持续集成
持续集成 (Continuous Integration, 简称 CI) 是软件工程中的一种实践, 用于将开发人员不同阶段的工作成果集成起来, 通常一天之中会进行多次. 持续集成最初在 极限编程 (Extreme Programming) 中提出, 主要用于执行自动化测试. 目前持续集成的概念已经逐渐独立出来, 并扩展为 构建服务器 (Build Server), 质量控制 (Quality Control) 和 持续交付 (Continuous Delivery) 等多种形式和实践. 详细可以参见 Wikipedia.
下面我们就看一下如何搭建 Jenkins (一个基于Java的持续集成工具) 并用于执行自动化测试. 我们要达到这样的效果: 在向位于 BitBucket 的项目 push 代码时, Jenkins 自动获取最新的代码并执行测试, 并将测试结果通过Email或其他方式通知我们.
另外, 本文也会介绍几个持续集成服务商, 可以免去自己安装和维护的工作. 详见 持续集成服务商.
2. 安装和配置Jenkins
下面介绍如何在Ubuntu系统上安装和配置Jenkins. 如果你对Ubuntu系统不熟悉, 可以参考 Linux服务器的初步配置流程, 那里有如何配置 sudo 等信息.
2.1 安装Jenkins
详细的安装步骤可以参考官方文档, 主要步骤如下:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
这样就会自动安装Jenkins和它的依赖(如OpenJDK), 并自动在 8080 端口启动Jenkins. 如果8080端口已被占用则会启动失败, 可以关闭占用8080端口的程序, 或者更改Jenkins的配置使用其他端口(见后文).
为了执行项目自动化测试而需要的软件和工具可以在这里一并安装和配置, 例如我的项目需要 Rvm, Ruby 和 PostgreSQL.
2.2 Jenkins命令
以下是用于管理Jenkins服务的常用命令:
- 查看Jenkins是否正在运行:
sudo service jenkins status
- 运行Jenkins:
sudo service jenkins start
- 停止Jenkins:
sudo service jenkins stop
- 重启Jenkins:
sudo service jenkins restart
2.3 Jenkins运行选项
Jenkins默认使用的配置文件位于 /etc/default/jenkins, 在这里可以更改Jenkins的运行选项. 例如, 如果要修改内存大小和运行端口, 可以使用 sudo vi /etc/default/jenkins
打开这个文件然后修改这两个选项:
JAVA_ARGS="-Xmx512m"
HTTP_PORT=9080
修改配置文件后记得重启Jenkins: sudo service jenkins restart
2.4 Jenkins安全配置
接下来在浏览器打开 host:port (例如 http://localhost:8080) 就可以访问到Jenkins的页面了, 其中 host 是你的服务器IP或域名, port 是Jenkins的运行端口(默认是8080). 你也可以配合Nignx或Apache来使用80端口, 以及设置SSL等.
第一次运行Jenkins时要做的特别重要的一件事就是配置安全选项, 也就是访问和修改Jenkins的权限. 默认的设置是所有人拥有所有的权限. 我们来改成需要使用用户名和密码登录.
首先创建一个用户. 从左边的菜单区依次进入 Manage Jenkins, Manage Users, Create User, 然后填入自己的登录信息.
之后回到首页, 依次进入 Manage Jenkins, Configure Global Security, 勾上 Enable security 和 Jenkins’ own user database, 去掉 Allow users to sign up 前面的勾.
接下来, 如果你的Jenkins是内部使用, 不想公开给大众, 可以使用 Matrix-based security, 在 User/group to add: 后面输入刚才创建的用户名并点 Add, 然后在出现的那一行勾上 Administer (Anonymous那一行都不要勾上).
而如果你想允许没登录的人查看Jenkins(只读权限), 可以使用 Logged-in users can do anything.
以上是典型的安全配置, 你也可以根据自己的情况决定如何配置.
3. Jenkins Job 示例: 自动化测试
由于我们的示例需要使用 Git 和 Bitbucket, 先做一些必要的安装和配置.
3.1 安装和配置 Git 及 ssh key
首先安装Git: sudo apt-get install git
然后切换到 jenkins
用户, 下面的命令都要以这个用户的身份执行:
sudo su jenkins
为 jenkins
用户配置 Git 用户名和email (根据你的情况进行修改):
git config --global user.name "Jenkins"
git config --global user.email "jenkins@example.org"
然后用 ssh-keygen
命名生成 ssh key. 可以一路回车, 默认生成的 ssh public key 位于 ~/.ssh/id_rsa.pub. 详细可以参见 SSH原理与运用(一):远程登录.
然后运行一次 ssh git@bitbucket.org
并输入 yes
, 这样BitBucket就会被自动加到 known_hosts 里了.
然后需要把 ssh public key 加到BitBucket项目的 Deployment keys, 这样 jenkins
用户才有权限 clone 项目代码. 执行 cat ~/.ssh/id_rsa.pub
并复制输出的 public key 内容 (注意不要复制多余的空行), 然后打开BitBucket项目管理页面的 Deployment keys 页面, 粘贴到 Key 文本框里, Label 建议填写 jenkins ci
, 然后点击 Add key.
最后, 需要给Jenkins安装Git插件. 在Jenkins页面依次选择 Manage Jenkins, Manage Plugins, Available, 找到并勾上 GIT plugin. 由于我的项目是使用了Rvm, 所以我也会勾上 Rvm. 然后点击页面最下方的 Install without restart.
3.2 创建Job
下面我们就来创建用于执行自动化测试的Jenkins Job.
在Jenkins页面点击 New Item, 在 Item name 输入Job名称, 例如 my-project-rspec, 点击 OK.
在 Source Code Management 区域勾选 Git, Repository URL 填写项目在BitBucket的地址, 例如 git@bitbucket.org:user/repo.git
. 在 Branches to build 后面填写想要对哪个分支持续集成, 我们留空来针对所有分支.
在 Build Triggers 区域勾选 Poll SCM (Schedule 和 Ignore post-commit hooks 留空).
如果要使用 Rvm 插件, 在 Build Environment 区域勾选 Run the build in a RVM-managed environment, 并在 Implementation 后面填写你在 Rvm 中使用的 Ruby 版本, 例如 2.0.0-p451
.
在 Build 区域依次选择 Add build step, Execute shell, 然后在 Command 右边的文本框输入执行持续集成的脚本, 例如为我的项目执行自动化测试:
bundle install
export RAILS_ENV=test
bundle exec rake db:schema:load
bundle exec rspec spec
最后, 点击 Save, 回到刚创建好的Job的页面, 点击 Build Now, 查看Build的 Console Output, 如果遇到错误就做相应的修改, 之后再 Build Now 直到成功.
3.3 配置自动触发
现在我们已经可以手动触发持续集成来运行测试了, 下面配置在 push 代码时自动触发.
进入BitBucket项目管理页面的 Hooks 页面, 在 Select a hook… 选择 POST 并点击 Add hook, 然后在 URL 填写 JENKINS_URL/git/notifyCommit?url=GIT_REPO, 其中 JENKINS_URL 是你的Jenkins地址,GIT_REPO 是在上一步填写的Git仓库地址. 例如:
http://localhost:8080/git/notifyCommit?url=git@bitbucket.org:user/repo.git
然后点 Save. 以后当有代码push到BitBucket项目时, Jenkins就会自动触发执行测试.
3.4 配置通知
最后, 我们需要配置通知以便在集成失败时得到通知. 如果你使用 HipChat 或 Slack 那么建议你直接使用他们接收通知, 只需安装对应的插件和简单的配置即可.
下面我们介绍如何让Jenkins发送Email通知. 首先需要配置SMTP. 依次进入 Manage Jenkins, Configure System, 在 E-mail Notification 区域进行设置. 以Gmail为例: SMTP server 输入smtp.gmail.com
, 点击 Advanced…, 勾选 Use SMTP Authentication, User Name 和 Password 输入 Gmail 邮箱地址和密码, 勾选 Use SSL, SMTP Port 填写 465
. 然后可以勾选 Test configuration by sending test e-mail 并填写自己的Email地址再点 Test configuraton 进行测试, 如果可以收到测试邮件则说明配置成功. 然后点击页面底部的 Save.
接下来进入Job页面, 点击 Configure 进入Job的配置页面, 在最下面的 Add post-build action 选择 E-mail Notification, 然后在 Recipients 输入接收通知邮件的邮箱地址, 多个地址之间用英文空格隔开 (建议使用邮件列表地址).
4. 持续集成服务商
以上就是Jenkins持续集成服务器的基本配置和使用. 除了某些情况下必须像这样自己搭建持续集成服务器外, 其实可以考虑一些 SaaS 类型的持续集成服务, 例如 Travis CI, CircleCI, Codeship 和 Drone. 此类的服务对于开源项目基本都是免费的. 对于私有项目的收费可能也会比自己搭建和维护持续集成服务器的成本更低, 值得考虑.
以下是我对这几个持续集成服务的初步印象:
- Travis CI: 在GitHub项目中非常流行, 收费版的起步价($129)比较高.
- CircleCI: 只支持GitHub项目. 听说速度很快.
- Codeship: 网站界面很漂亮. 我在使用中遇到两个不常见的问题: 在用
git push -f
覆盖了之前失败的一次commit时, Codeship会由于找不到之前的commit而无法继续执行; 另外那个触发自动执行的hook URL只在刚开始创建项目时可以看到, 之后在设置页面找不到, 这样如果在BitBucket/GitHub临时删除了hook就找不回来了. 这两个问题貌似只能通过删除并重建项目来解决. - Drone: 基于 Docker. 我在使用中发现的一个问题是, 每次执行都会从零开始构建环境, 例如我的Ruby项目, 每次执行
bundle install
都重新安装所有依赖导致用时太长, 暂时没有研究有无解决方法.
最后, 关于自己搭建持续集成服务, 除了Jenkins还有其他类似的工具, 例如 GitLab CI, ThoughtWorks Go, Drone(开源版) 等, 可以参考 Wikipedia 和 开源中国社区 上的列表.
转载自:http://xhh.me/2014/03/16/continuous-integration-with-jenkins/
使用Jenkins搭建持续集成服务的更多相关文章
- 用MSBuild和Jenkins搭建持续集成环境(2)
http://www.infoq.com/cn/articles/MSBuild-2 作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意: ...
- SonarQube+Jenkins,搭建持续交付平台
前言 Kurt Bittner曾说过,如果敏捷仅仅只是开始,那持续交付就是头条! "If Agile Was the Opening Act, Continuous Delivery is ...
- 一.Jmeter+Ant+Jenkins搭建持续集成接口性能自动化测试
微创新作品信息 1)微创新作品描述 A.为什么诞生: 1. 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换, ...
- 用MSBuild和Jenkins搭建持续集成环境(1)
http://www.infoq.com/cn/articles/MSBuild-1 你或其他人刚刚写完了一段代码,提交到项目的版本仓库里面.但等一下,如果新提交的代码把构建搞坏了怎么办?万一出现编 ...
- 采用Jenkins搭建持续集成环境
Jenkins介绍 Jenkins是一个CI工具.它可以根据设定持续定期编译,运行相应代码:运行UT或集成测试:将运行结果发送至邮件,或展示成报告... 这样做的最终目的是: 让项目保持健康的状态.如 ...
- 用MSBuild和Jenkins搭建持续集成环境(1)[收集]
你或其他人刚刚写完了一段代码,提交到项目的版本仓库里面.但等一下,如果新提交的代码把构建搞坏了怎么办?万一出现编译错误,或者有的测试失败了,或者代码不符合质量标准所要求的底限,你该怎么办? 最不靠谱的 ...
- Jmeter+Ant+Jenkins搭建持续集成的接口测试框架
https://my.oschina.net/hellotest/blog/516079 摘要: 一个系统通常有多个接口,软件的生命周期中,我们会不断的去优化老的接口和开发新的接口,那么在这个过程中, ...
- [转]使用Jenkins搭建持续集成(CI)环境
转自:魔のkyo的工作室 首先从官网http://jenkins-ci.org/下载 Java Web Archive (.war) 例如我保存到 D:\jenkins\jenkins.war 运行J ...
- Jenkins: 使用Jenkins搭建持续集成(CI)环境
http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java We ...
随机推荐
- 关于HTTP协议
一.HTTP协议概念 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的 ...
- 下载word文档
来源:http://www.cnblogs.com/damonlan/archive/2012/04/28/2473525.html 作者:浪迹天涯 protected void GridView1_ ...
- 转 关于ruby gem无法连接到rubygems.org的解决方案
为什么有这个? 由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败.所以你会与遇到 gem install rack 或 bundle ...
- python3倒叙字符串
google测试工程师的一道题: 设计一个函数,使用任意语言,完成以下功能: 一个句子,将句子中的单词全部倒排过来,但单词的字母顺序不变.比如,This is a real world,输出结果为 w ...
- 阿里云centos增加swap(虚拟内存)
我的阿里云服务器默认是没有配swap交换文件. 创建swap根目录 mkdir /swap 创建swap dd if=/dev/zero of=/swap/swap bs=1024 count=102 ...
- ASP.NET 4.0的ClientIDMode属性
时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的Cl ...
- 修改mysql root 密码
C:\Program Files\MySQL\MySQL Server 5.6\bin mysqld --skip-grant-tables 开启一新窗口:然后输入mysql -uroot -p up ...
- Http状态码301和302概念简单区别
1.什么是301重定向? 301重定向/跳转一般,表示本网页永久性转移到另一个地址. 301是永久性转移(Permanently Moved),SEO常用的招式,会把旧页面的PR等信息转移到新页面: ...
- mysql中一对一,一对多,多对多关系
打个比方吧一个班级有很多学生,他们分别有不同的学号.一个学生对应一个学号,一个学号对应一个学生:这里学生和学号的关系就是一对一.一个班级有很多学生,这个班级只有一个班主任.一个班主任对应多个学生,多个 ...
- Struts 1.3(第一例) - Login
本想跳过直接学Struts 2的,想想,还是先学Struts 1,万一到时去那个公司,人家用的是1,那还是要学,以及了解下1与2的区别在哪里. 上例子,很简单的一个网上login例子,再思考下Stru ...