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
CicadaMan
V2EX  ›  Python

Jenkins+ Python 完整版

  •  1
     
  •   CicadaMan · 2017-08-12 15:32:55 +08:00 · 4660 次点击
    这是一个创建于 2652 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一、简介

    一般网站部署的流程 这边是完整流程而不是简化的流程 需求分析—原型设计—开发代码—内网部署-提交测试—确认上线—备份数据—外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚 一般是运维来做 功能测试 上线的时间 jenkins 运维 功能测试

    部署流程

    我们可以通过 jenkins 工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins 非常易于安装和配置,简单易用 简单来说方便如下人员:

    1. 开发人员:写好代码,不需要自己进行源码编译、打包等工作,直接将代码分支存放在 SVN、GIT 仓库即可。 war 源码多 自动把代码放到服务器上面
    2. 运维人员:减轻人工干预的错误率,ansible 一键完成了 同时解放运维人员繁杂的上传代码、手动备份、更新
    3. 测试人员:可以通过 jenkins 进行简单的代码及网站测试
    • 持续集成的意义(总结 提升工作效率)
    1. 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量
    2. 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能
    3. 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心

    持续集成的组件

    1. 一个自动构建过程,包括自动编译、分发、部署和测试
    2. 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,例如 SVN、GIT 代码库
    3. 一个 jenkins 持续集成服务器就是一个配置简单和使用方便的持续集成服务器

    二、jenkins 安装

    由于 jenkins 是使用 java 代码开发的,所以我们需要安装 java 容器才能运行 jenkins,又因为 java 的 web 服务器用的是 tomcat,所以我们要安装 JDK+Tomcat

    • 安装 jenkins+tomcat
    [root@vagrant-centos65 ~]# yum -y install java-1.8.0-openjdk.x86_64
    
    [root@vagrant-centos65 ~]# cd /opt/
    
    [root@vagrant-centos65 opt]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.79/bin/apache-tomcat-7.0.79.tar.gz
    
    [root@vagrant-centos65 opt]# tar zxvf apache-tomcat-7.0.79.tar.gz
    
    [root@vagrant-centos65 opt]# mkdir -p /usr/local/tomcat
    
    [root@vagrant-centos65 opt]# mv apache-tomcat-7.0.79/* /usr/local/tomcat
    
    • 安装 jenkins
    [root@vagrant-centos65 ~]# cd /opt/
    
    [root@vagrant-centos65 opt]# wget http://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.60-1.1.noarch.rpm
    
    [root@vagrant-centos65 opt]# rpm -ivh jenkins-2.60-1.1.noarch.rpm
    
    [root@vagrant-centos65 opt]# /etc/init.d/jenkins start
    Starting Jenkins                                           [  OK  ]
    
    [root@vagrant-centos65 opt]# netstat -tnlp | grep 8080
    
    [root@vagrant-centos65 opt]# /etc/init.d/jenkins start
    Starting Jenkins                                           [  OK  ]
    
    [root@vagrant-centos65 opt]# netstat -tnlp | grep 8080
    tcp        0      0 :::8080                     :::*                        LISTEN     7599/java 
    

    三、升级 python2.6 到 python2.7

    由于 django1.7 之后的版本就不支持 python2.6 了 所有需要我们升级 python2.6--python2.7

    [root@vagrant-centos65 ~]# yum -y install  zlib zlib-devel openssl openssl-devel  sqlite-devel
    [root@vagrant-centos65 ~]# wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
    [root@vagrant-centos65 ~]# tar -jxvf Python-2.7.3.tar.bz2
    [root@vagrant-centos65 ~]# cd Python-2.7.3
    [root@vagrant-centos65 Python-2.7.3]# ./configure    --prefix=/usr/local/python2.7
    [root@vagrant-centos65 Python-2.7.3]# make && make install
    [root@vagrant-centos65 Python-2.7.3]# cd /usr/bin/
    [root@vagrant-centos65 bin]# ll | grep python
    -rwxr-xr-x.   2 root root      4864 Nov 22  2013 python
    lrwxrwxrwx.   1 root root         6 Jan 16  2014 python2 -> python
    -rwxr-xr-x.   2 root root      4864 Nov 22  2013 python2.6
    [root@vagrant-centos65 bin]# mv python python2.6.bak
    [root@vagrant-centos65 bin]# ln -s /usr/local/python2.7/bin/python /usr/bin/python
    [root@vagrant-centos65 bin]# vi /usr/bin/yum
    #!/usr/bin/python2.6
    

    五、安装 django

    • 安装 setuptools

      pip 的安装需要依赖 setuptools,所有需要先安装 setuptools

    [root@vagrant-centos65 bin]# cd /opt/
    
    [root@vagrant-centos65 opt]# wget https://pypi.python.org/packages/61/3c/8d680267eda244ad6391fb8b211bd39d8b527f3b66207976ef9f2f106230/setuptools-1.4.2.tar.gz
    
    [root@vagrant-centos65 opt]# tar zxvf setuptools-1.4.2.tar.gz
    
    [root@vagrant-centos65 opt]# cd setuptools-1.4.2
    
    [root@vagrant-centos65 setuptools-1.4.2]# python setup.py install
    
    
    • 安装 pip
    [root@vagrant-centos65 ~]# cd /opt/
    
    [root@vagrant-centos65 opt]# wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificate
    
    [root@vagrant-centos65 opt]# tar zxvf pip-1.5.4.tar.gz
    
    [root@vagrant-centos65 opt]# cd pip-1.5.4
    
    [root@vagrant-centos65 pip-1.5.4]# python setup.py install
    
    [root@vagrant-centos65 pip-1.5.4]# pip
    -bash: pip: command not found
    
    [root@vagrant-centos65 pip-1.5.4]# find / -name pip
    /usr/local/python2.7/bin/pip
    /usr/local/python2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip
    
    [root@vagrant-centos65 pip-1.5.4]# ln -s /usr/local/python2.7/bin/pip /usr/bin/pip
    
    • 安装 django
    [root@vagrant-centos65 pip-1.5.4]# pip install django
    [root@vagrant-centos65 pip-1.5.4]# pip list
    Django (1.11.3)
    pip (1.5.4)
    pytz (2017.2)
    setuptools (1.4.2)
    wsgiref (0.1.2)
    

    六、安装插件

    插件管理 如果插件下载失败 更换源 http://mirror.xmission.com/jenkins/updates/current/update-center.json 因为我们只需要构建 python 项目 所以我们这边只需要 2 个插件

    1. git plugin
    2. python plugin
    3. pipeline

    七、创建项目

    • 总结
    第一步 创建项目
    
    创建任务  名字 master-build   自由代码风格
    
    1. 丢弃旧的构建 (保留 7 天,最大构建的最大数 100)
    2. 源码管理  选择 git  如果我们需要从码云拉取代码那么我们需要把私钥放到 jenkins 公钥放到码云上面去 这样我们就可以拉取我们的代码了
    
    • 构建触发器
    • poll SCM(日常表 可以根据时间来判断)

    H/2 * * * * (2 分钟检查一下版本库 如果有更新就不触发 如果没有更新就不触发) 注:Schedule 的配置规则是有 5 个空格隔开的字符组成,从左到右分别代表:分 时 天 月 年。*代表所有,0 20 * * * 表示“在任何年任何月任何天 20 点 0 分”进行构建

    • 构建

    execute shell

    cd django    项目目录
    python mange.py test 测试代码
    

    • 构建后的操作

    选择 email notifications

    输入你的邮箱 选中每次不稳定的构建都发送邮件

    八、创建部署项目

    创建一个新的 job itemname : master deploy copyfrom : master-build 点击 ok

    • 修改触发器

    Build after other projects are built (勾选这一项) projects to watch (master_build) 当前一个动作构建成功后我才触发

    • 构建

      cd testdjango  
      BUILD_ID=DONTKILLME nohup python manage.py runserver 0.0.0.0:8000 &
      

      BUILD_ID=DONTKILLME : 在 jenkins 里面在后台运行的程序都会被 jenkins 自动杀死 所以需要加上 BUILDID 这个参数 加了这个参数你的程序就不会被杀死

    最后提交并构建!

    一旦用 pycharm 修改项目,并 push 上去,jenkins 就会每两分钟检查一次是否改变,如果改变就会触发构建!

    创建一个 job webhook 钩子 只要收到一个 push 请求 就会发送一个 post 的请求给 jenkins

    第一步 创建项目 创建任务 名字 master-build 自由代码风格

    1. 丢弃旧的构建 (保留 7 天,最大构建的最大数 100)
    2. 源码管理 选择 git 如果我们需要从码云拉取代码那么我们需要把私钥放到 jenkins 公钥放到码云上面去 这样我们就可以拉取我们的代码了
    ssh-keygen -t rsa -C "[email protected]"
    生成公钥和私钥
    cat ~/.ssh/id_rsa.pub    发送给码云
    cat ~/.ssh/id_rsa        写入到 jenkins
    
    1. 构建触发器 poll SCM(日常表 可以根据时间来判断) H/2 * * * * (2 分钟检查一下版本库 如果有更新就不触发 如果没有更新就不触发) 注:Schedule 的配置规则是有 5 个空格隔开的字符组成,从左到右分别代表:分 时 天 月 年。*代表所有,0 20 * * * 表示“在任何年任何月任何天 20 点 0 分”进行构建
    2. 构建 execute shell
    cd testdjango  #进入项目所在的目录
    python mange.py test
    
    1. 构建后操作 选择 email notifications 输入你的邮箱 选中每次不稳定的构建都发送邮件

    创建一个构建 job

    创建一个新的 job itemname : master deploy copyfrom : master-build 点击 ok

    其他都不需要改 只需要改 2 个地方

    第一个地方

    • 构建触发器 Build after other projects are built (勾选这一项) projects to watch (master_build) 当前一个动作构建成功后我才触发

    第二个地方

    • 构建
    cd testdjango  
    BUILD_ID=DONTKILLME nohup python manage.py runserver 0.0.0.0:8000 &
    

    BUILD_ID=DONTKILLME : 在 jenkins 里面在后台运行的程序都会被 jenkins 自动杀死 所以需要加上 BUILDID 这个参数 加了这个参数你的程序就不会被杀死

    linux 升级 python 由于 django1.7 之后的版本就不支持 python2.6 了 所有需要我们升级 python2.6--python2.7

    yum -y install  zlib zlib-devel openssl openssl-devel  sqlite-devel
    #wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2  
    #tar -jxvf Python-2.7.3.tar.bz2 
    #cd Python-2.7.3  
    #./configure    --prefix=/usr/local/python2.7
    #make           
    #make install  
    cd /usr/bin/
    mv python  python2.6.bak
    ln -s /usr/local/python2.7/bin/python /usr/bin/python
    ---
    install setuptools 
    wget https://pypi.python.org/packages/61/3c/8d680267eda244ad6391fb8b211bd39d8b527f3b66207976ef9f2f106230/setuptools-1.4.2.tar.gz
    tar xvf  setuptools-1.4.2.tar.gz  
    cd setuptools
    python setup.py install 
    install pip 
    wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificate
    tar xvf   pip-1.5.4.tar.gz
    cd pip-1.5.4
    python setup.py install 
    ln -s /usr/local/python2.7/bin/pip /usr/bin/pip
    
    pip install django
    

    免密码登录

    $ scp ~/.ssh/id_rsa.pub root@<remote_ip>:pub_key //将文件拷贝至远程服务器
    $ cat ~/pub_key >>~/.ssh/authorized_keys //将内容追加到 authorized_keys 文件中, 不过要登录远程服务器来执行这条命令
    

    cd /data/django11/testdjango git pull BUILD_ID=DONTKILLME nohup python manage.py runserver 0.0.0.0:8000 & exit

    ssh [email protected] 'bash -x -s' < /data/sh/startdj.sh

    另外,如果是对自动化运维感兴趣的朋友,可以加入群:526929231,一起学习和讨论哦~~

    7 条回复    2017-08-13 22:23:18 +08:00
    louzhumuyou
        1
    louzhumuyou  
       2017-08-12 15:45:15 +08:00   ❤️ 1
    其实不需要这么复杂,Jenkins 有一个 github 或者 gerrit 触发的钩子,只要你的 django 实现一个 api,每次代码更新到 github 或者 gerrit 触发,由 Jenkins 捕获以后,发一个请求告诉 django,然后 django 自动执行 git pull,代码就自动更新了,最后 django 通过 supervisord 启动服务,里面可以设置代码更新,服务重启。这样就 OK 了。
    plantparknet
        2
    plantparknet  
       2017-08-12 18:25:39 +08:00
    @louzhumuyou supervisord 针对 python3 的版本呢?貌似正式版还没出来。搜到一种方案 https://github.com/olipo186/Git-Auto-Deploy。不知你所述方式大概的当机时间会有多长?此外,针对某个 Test Case 无法测试通过时,或出现错误,如何回滚到上一版本呢
    janxin
        3
    janxin  
       2017-08-12 20:09:34 +08:00
    我只想问问你们 Jenkins 装的时候怎么翻墙的啊,我插件就是装不好
    ycz0926
        4
    ycz0926  
       2017-08-12 22:48:06 +08:00
    借帖分享下我的博客代码:
    第一个博客,博客端使用的 flask 框架,没有使用 sqlalchemy,使用的是一个 ActiveRecord 模式的 orm [orator]( https://github.com/sdispater/orator),目前所知道的,这应当是 python 语言中对 ActiveRecord 模式实现的比较好的一个 orm。博客的管理后台则是基于 AdminLTE,提供了博客列表,发布博客等功能。
    github 地址:[flask-blog]( https://github.com/ycz0926/flask-blog)

    第二个博客,是目前使用的([blog.ycz0926.site]( http://blog.ycz0926.site)),后端基于 django,前端使用的是 bootstrap 主题。
    github 地址:[mysite]( https://github.com/ycz0926/mysite)

    两个博客都使用的 nginx+uwsgi+python 架构,欢迎吐槽 bug 和 star。
    rashawn
        5
    rashawn  
       2017-08-13 05:53:11 +08:00 via iPhone
    不能自动需求分析也好意思说完整流程?
    louzhumuyou
        6
    louzhumuyou  
       2017-08-13 18:56:55 +08:00
    @plantparknet 回滚版本,这个我还真没考虑过,我只是支撑 30 人左右的研发队伍的小服务。这个我考虑不完善,抱歉。
    plantparknet
        7
    plantparknet  
       2017-08-13 22:23:18 +08:00
    @louzhumuyou 我了解到的可以通过 soft link 实现,仅当 Test Case 完整通过或达到某一设定比利时,将最新版的所在地址 soft link 到 www,具体细节也在找资料学习中。

    其实你评论中提到的的方法,应该不需要用到 Jenkins 吧,只需要 Django 做个 hook 接收来自 Git 的消息。此外不知这个过程是否有自动测试呢?使用到的库或者相关细节可有文章介绍呢,多谢~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.