基于jenkins的网站自动部署

基于jenkins的网站自动部署

1 网站部署现状

主要步骤如下:

  1. 开发人员完成开发将代码提交到git
  2. 由运维人员手动将代码pull下来,并复制到dev环境上进行构建
  3. 由测试人员进行测试
  4. 由运维人员将代码复制到几台ops网站服务器上进行构建

开发人员也有可能需要在dev环境上进行构建测试,整个流程基本上都是人工部署,效率较低也容易出错。

2 网站自动化部署介绍

使用jenkins-ansible自动化工具后,网站部署主要步骤如下:

  1. 开发人员完成开发将代码提交到git测试分支
  2. 由git触发jenkins自动化构建任务,在dev上自动构建部署网站
  3. 由测试人员进行测试
  4. 测试通过后git合并代码到主分支
  5. 由git触发jenkins自动化构建任务,在ops上自动构建部署网站

增加了自动化部署后简化了需要人工参与的dev与ops环境的网站构建操作,一定程度上提高了生产效率。

3 网站自动化部署的实现

3.1 配置git和jenkins联动

3.1.1 Jenkins配置Git源

Jenkins中新建项目 openlab-dev,并配置从Git拉取程序代码。具体如下:

avatar

3.1.2 Jenkins配置远程构建

Jenkins中配置token,以供git远程调用时使用

avatar

3.1.3 Git开启钩子

让Git在接收到用户更新的代码后,把消息和任务传递给Jenkins,需要使用Git的hook功能

avatar

其中JENKINS_URL为gitlab可以访问的内网或者公网上部署jenkins机器的地址

3.2 dev环境配置Jenkins自动构建代码

Jekins在接收到Git传递过来的消息后,执行预定义的shell脚本,将代码部署到dev环境上并进行构建

avatar

其中脚本如下:

#!/bin/bash -ilex

sourcefold=/opt/openlab
destfold=/var/www/openlab/current

#使用rsync工具将代码从jenkins目录复制dev目录
rsync -avzP $sourcefold/app/ $destfold/app
rsync -avzP $sourcefold/public/ $destfold/public
rsync -avzP $sourcefold/lib/ $destfold/lib
rsync -avzP $sourcefold/test/ $destfold/test
rsync -avzP $sourcefold/vendor/ $destfold/vendor
rsync -avzP $sourcefold/Gemfile $destfold
rsync -avzP $sourcefold/README.md $destfold
rsync -avzP $sourcefold/config/locales/ $destfold/config/locales
rsync -avzP $sourcefold/config/routes.rb $destfold/config
rsync -avzP $sourcefold/db/migrate/ $destfold/db/migrate

#使用rails bundle exec命令进行dev环境构建
cd /var/www/openlab/current
bundle exec rake assets:precompile db:migrate RAILS_ENV=production
/etc/init.d/unicorn_init upgrade

使用rsync可以做到增量同步复制。

3.3 ops环境配置Jenkins自动构建代码

对于ops环境来说,因其与jenkins不属于同台服务器,因此不能简单的使用rsync工具进行代码管理,而使用ansible自动化运维工具进行代码管理。

将代码合并到master主分支后,触发如下shell脚本:

#!/bin/bash -ilex

sourcefold=/opt/openlab
destfold=/opt/openlab

#使用ansible-synchronize模块进行代码同步,作用类似于rsync
#openlab-ops为ansible-hosts中定义的openlab,ops环境的IP地址

ansible openlab-ops -m synchronize -a "src=$sourcefold/app/ dest=$destfold/app"
ansible openlab-ops -m synchronize -a "src=$sourcefold/public/ dest=$destfold/public"
ansible openlab-ops -m synchronize -a "src=$sourcefold/lib/ dest=$destfold/lib"
ansible openlab-ops -m synchronize -a "src=$sourcefold/test/ dest=$destfold/test"
ansible openlab-ops -m synchronize -a "src=$sourcefold/vendor/ dest=$destfold/vendor"
ansible openlab-ops -m synchronize -a "src=$sourcefold/Gemfile dest=$destfold"
ansible openlab-ops -m synchronize -a "src=$sourcefold/README.md dest=$destfold"
ansible openlab-ops -m synchronize -a "src=$sourcefold/config/locales/ dest=$destfold/config/locales"
ansible openlab-ops -m synchronize -a "src=$sourcefold/config/routes.rb dest=$destfold/config"
ansible openlab-ops -m synchronize -a "src=$sourcefold/db/migrate/ dest=$destfold/db/migrate"

#使用ansible-shell模块,在目标服务器执行自动构建脚本
ansible openlab-ops -m shell -a "/var/www/openlab/restart.sh"

ops服务器上/var/www/openlab/restart.sh脚本内容如下:

#!/bin/bash -ile

cd /var/www/openlab/current
bundle exec rake assets:precompile db:migrate RAILS_ENV=production
/etc/init.d/unicorn_init upgrade

4 网站自动化部署展望

使用jenkins自动化部署后,极大的提高了部署的效率,减少了部署出错的概率。

更进一步来说,如果能够将测试人员进行测试这一步做成自动化,那么开发人员提交代码后,将能够直接得构建测试结果,进一步提高整个Devops流程的协同效率。

参考资料

  1. jenkins执行shell读不到环境变量问题,https://blog.csdn.net/zzusimon/article/details/57080337
  2. Docker持续部署图文详解,https://www.csdn.net/article/2015-07-21/2825266
  3. 以root用户运行jenkins中shell命令,https://blog.csdn.net/wzqnls/article/details/78506149
  4. Ansible常用模块介绍,https://blog.csdn.net/pushiqiang/article/details/78249665

如有疑问,欢迎交流

Table of Contents