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 · 12481 次点击
    这是一个创建于 4644 天前的主题,其中的信息可能已经有所发展或是发生改变。
    扇贝网平均每天有十几次代码提交以及两三次发布。为了最大程度保证质量,我们要求每次待发布代码都通过所有的单元测试。我们希望有一个自动化的环境能够帮助我们监督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 页面最新打卡记录有点小问题……
    fly2never
        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   ·   实用小工具   ·   2850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:08 · PVG 22:08 · LAX 06:08 · JFK 09:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.