用Jenkins构建Django持续集成环境

2012-04-12 14:29:45 +08:00
 cheka
扇贝网平均每天有十几次代码提交以及两三次发布。为了最大程度保证质量,我们要求每次待发布代码都通过所有的单元测试。我们希望有一个自动化的环境能够帮助我们监督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/1089
Setting up virtualenv in Jenkins/Hudson http://www.xairon.net/2011/09/setting-up-virtualenv-in-jenkinshudson/
12305 次点击
所在节点    Python
9 条回复
kollinchu
2012-04-12 17:22:25 +08:00
正准备上线集成环境。
hankwh
2012-07-11 19:48:10 +08:00
楼主,请教一个问题,我用的jekins做持续集成,版本控制是git,为什么每次build,环境里的修改都被覆盖掉呢?
ant_sz
2012-07-11 20:35:00 +08:00
git支持在每次提交之后或之前执行代码,也就是hooks

用这个不需要cron每隔五分钟执行代码了,而是每次提交之后执行,可以参考
http://www.githooks.com/
http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-automation-with-git-hooks/

建议采用这种方法
kerie
2012-07-11 20:43:09 +08:00
我没写过脚本语言,问下jenkins执行shell命令或bash脚本怎么以管理员账户执行?比如我要把一个文件拷贝到tomcat7的某个目录下?jenkins用户没有权限。
vivia
2012-07-12 13:25:00 +08:00
@cheka 网站真心不错
测试了一下CET-6,结果是:
3600

你的单词量覆盖了 大学英语六级 词汇的: 37.0 %
看来你大学的单词还没有都忘光,不过要想读懂英文文章,这个词汇量还不够,要加油!
-----------------------------------------
如果公司在上海我就求收留了,嘿嘿……
vivia
2012-07-12 13:31:35 +08:00
@cheka http://www.shanbay.com/rank/checkin 页面最新打卡记录有点小问题……
fly2never
2012-07-12 13:52:15 +08:00
赞,我们使用jenkins来做iOS的每日构建
imcj
2012-07-12 13:58:36 +08:00
travis-ci免费得托管持续集成。如果是开源应用可以用这个。
zgzhaobo
2016-07-28 09:10:49 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/32054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX