用Jenkins构建Django持续集成环境 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cheka
V2EX    Python

用Jenkins构建Django持续集成环境

  •  
  •   cheka 2012-04-12 14:29:45 +08:00 12909 次点击
    这是一个创建于 4936 天前的主题,其中的信息可能已经有所发展或是发生改变。
    扇贝网平均每天有十几次代码提交以及两三次发布。为了最大程度保证质量,我们要求每次待发布代码都通过所有的单元测试。我们希望有一个自动化的环境能够帮助我们监督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/
    9 条回复    2016-07-28 09:10:49 +08:00
    kollinchu
        1
    kollinchu  
       2012-04-12 17:22:25 +08:00   1
    正准备上线集成环境。
    hankwh
        2
    hankwh  
       2012-07-11 19:48:10 +08:00
    楼主,请教一个问题,我用的jekins做持续集成,版本控制是git,为什么每次build,环境里的修改都被覆盖掉呢?
    ant_sz
        3
    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
        4
    kerie  
       2012-07-11 20:43:09 +08:00
    我没写过脚本语言,问下jenkins执行shell命令或bash脚本怎么以管理员账户执行?比如我要把一个文件拷贝到tomcat7的某个目录下?jenkins用户没有权限。
    vivia
        5
    vivia  
       2012-07-12 13:25:00 +08:00
    @cheka 网站真心不错
    测试了一下CET-6,结果是:
    3600

    你的单词量覆盖了 大学英语六级 词汇的: 37.0 %
    看来你大学的单词还没有都忘光,不过要想读懂英文文章,这个词汇量还不够,要加油!
    -----------------------------------------
    如果公司在上海我就求收留了,嘿嘿……
    vivia
        6
    vivia  
       2012-07-12 13:31:35 +08:00
    @cheka http://www.shanbay.com/rank/checkin 页面最新打卡记录有点小问题……
    fl2never
        7
    fly2never  
       2012-07-12 13:52:15 +08:00
    赞,我们使用jenkins来做iOS的每日构建
    imcj
        8
    imcj  
       2012-07-12 13:58:36 +08:00
    travis-ci免费得托管持续集成。如果是开源应用可以用这个。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1253 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 17:33 PVG 01:33 LAX 10:33 JFK 13:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86