扇贝网平均每天有十几次代码提交以及两三次发布。为了最大程度保证质量,我们要求每次待发布代码都通过所有的单元测试。我们希望有一个自动化的环境能够帮助我们监督master分支,因此就使用了jenkins搭建了一个持续集成环境,能够每隔5分钟下载最新的master分支代码,更新必要的依赖,并且运行单元测试。
本文档详细记载了扇贝网的jenkins配置,以供参考(我们的操作系统是 Ubuntu 11.10,开发环境使用 virtualenv, Django1.3.1,代码管理为 git)
1. 安装jenkins
按照官方文档中在Ubuntu中的安装方法 (
http://pkg.jenkins-ci.org/debian/ ) ,添加源,然后apt-get install即可
2. 启动
安装好后jenkin即自动启动,端口8080,直接访问 127.0.0.1:8080 即可访问
3. 源码访问准备
因为jenkins 需要访问代码的git库,因此需要确保 jenkins所用的linux帐号(默认就是jenkins)可以正常访问源码库。特别是如果通过ssh方式访问git时,要保证能通过证书来无口令访问。
sudo su jenkins #切换到jenkins用户
ssh-keygen 生成密钥
ssh-copy-id git_user@git_host #将本地公钥拷贝至git所在机器,git_host和git_user分别是git所在机器以及对git代码库有读权限的用户名
可以通过 ssh git_user@git_host来检验是否可以无口令访问了
4. 安装插件
如果available 里什么都没有,进入Advanced页面,点”Check now”,下载插件信息
选择下载 Git Plugin, Python Plugin, EnvInject Plugin (用于配置环境变量)
5. 添加任务 New Job
起适合的名字,譬如my_project,然后选择 Build a free-style software project
Source Code Management 里选择Git,repository里填写相应的地址,如果不清楚是什么,可以到本地clone过的代码库根目录下查看.git/config 文件,一般类似这样的形式 ssh://git_user@git_host/var/git/my_project
完成这一步,可以先点页面最下方的save或者apply,然后点左边菜单里的Build Now,便能看到Build History里有一条新的build记录,点击进去可以查看相关log。此时正常情况下可以正常clone git 库,但是会报tag错误,原因是必须为jenkins配置git 用户,我没有找到在界面上的配置方法,因此直接到文件目录 /var/lib/jenkins/jobs/my_project/workspace 下,执行
git config --global user.email "jenkins-ci@my_domain.com" #具体email按实际情况
git config --global
user.name "jenkins-ci"
然后再次build 就可以了。
6. 目前的build 仅仅可以是下载更和更新代码,如果需要执行譬如其他脚本,就需要Add build step,
#!/bin/bash
if [ -d ".env" ]; then
echo "**> virtualenv exists"
else
echo "**> creating virtualenv"
virtualenv .env
fi
source .env/bin/activate # 切换到对应的virtual environment
pip install -r requirements/dev.req # 如果用pip来管理项目的依赖,就需要先安装所有依赖
python
manage.py test # 执行测试脚本
当然我们同时要确保环境中的路径变量正确,因此在Build Enviroment下选Inject environment variables to the build process
PATH=.env/bin:$PATH
另外,我们希望Jenkins能够自动每5分钟检查一次源代码库,如果发现master分支里有代码变更,即立刻下载并执行单元测试,因此需要配置触发器,在Build Triggers 下选择Poll SCM,schedule里按照crontab的方式填
*/5 * * * *
这样,一个基础的jenkins环境就算配置好了。
7 通过Nginx访问 jenkins
如果希望通过Nginx来访问jenkins,参照官方wiki上的Nginx配置文件(
https://wiki.jenkins-ci.org/display/JENKINS/Running+Hudson+behind+Nginx )即可
但是注意两点:
1)在 location @
jenkins 里加上
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd/htpasswd;
这样就需要通过口令才能访问,当然同时要用htpasswd 命令生成口令文件 /etc/nginx/passwd/htpasswd
2)因为jenkins 默认绑定ip是0.0.0.0,因此即便通过nginx设置了口令,依然可以访问http://host:8080,因此要改变jenkins配置,使其仅绑定127.0.0.1
编辑/etc/default/jenkins 文件,删除原先的JENKINS_ARGS这一行(一般为最后一行),添加
BIND_ADDRESS=127.0.0.1
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=$BIND_ADDRESS --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"
重启 jenkins 即可。
参考资料
本文博客原文
http://blog.shanbay.com/archives/1089Setting up virtualenv in Jenkins/Hudson
http://www.xairon.net/2011/09/setting-up-virtualenv-in-jenkinshudson/
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/32054
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.