PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)

先看流程图:

大概介绍一下:

  • 版本选择使用jenkins 中的 git parameter 插件实现
  • 回滚方式比较low,直接使用代码库目录方式实现

其中gitlab、ansible、jenkins安装不在本文讨论范围之内。

效果

先看下效果图:

jenkins 发布配置

PHP 代码不需要 Ant 或者 meaven 编译,所以可以直接使用。

新建一个项目,比较重要的是:选择参数化构建

  1. 选择git parameter,需要给参数定义个变量名称。部署发布作用区
  2. 选择dynamic chocie parameter , 选择回滚版本号,默认 none 的话就是部署发布

下图为配置详情:

dynamic 参数配置代码:

def ver_keys = ['bash', '-c','cd /home/www/Repositories/HaifaxOnline/rollback  ;  echo none; ls | sort -rn ' ]
ver_keys.execute().text.tokenize('\n')

git 库配置

然后选择git仓库的配置,网上很多。

回滚和发布配置

然后在构建时选择插件:excute shell,执行shell 命令:

具体代码在这:

echo $branch_and_tags
echo "build_id:"$BUILD_NUMBER
echo "项目名称:" $JOB_NAME
echo "work_sapce" $JENKINS_HOME
echo "choice:" $choice
id echo "==============================="
if [ $choice = "none" ];then
echo "choice:部署" python3 /home/www/deploy.py -build_id=$BUILD_NUMBER -jenkins_home=$JENKINS_HOME -job_name=$JOB_NAME -repo_path=/home/www/Repositories sudo ansible-playbook /etc/ansible/$JOB_NAME.yml -e "job_name=$JOB_NAME code_src=/home/www/Repositories/$JOB_NAME/code/ code_dest=/alidata/www/" else
echo "choice:回滚"
HIS_ID=$choice
echo "回滚版本:$HIS_ID"
sudo ansible-playbook /etc/ansible/$JOB_NAME.yml -e "job_name=$JOB_NAME code_src=/home/www/Repositories/$JOB_NAME/rollback/$HIS_ID/ code_dest=/alidata/www/"
fi

需要注意的是,如果ansible需要使用root用户执行时,需要对jenkins的帐号授权sodu权限处理。

一些参数的解释:

  • code_dest: 线上服务器的代码目录位置,需要手动配置
  • code_src: jenkins本地服务器的代码存储位置,需手动配置
  • job_name: 这个参数为了好套用,所以设计成job_name的方式,传递给ansible,ansible的yml文件一定要使用job_name.yml命名,否则会报错

代码库存储目录处理:

deploy.py中代码如下,主要是对jenkins服务器中的本地代码库,进行目录处理:

#!/usr/bin/env python
# -*-coding=utf-8-*-
# __author__ = 'ccorz' import argparse, os, shutil class Deploye:
def __init__(self):
parse = argparse.ArgumentParser()
parse.add_argument('-job_name', type=str, required=True)
parse.add_argument('-build_id', type=str)
parse.add_argument('-repo_path', type=str)
parse.add_argument('-jenkins_home', type=str)
self.args = parse.parse_args()
self.job_repo = '%s/%s' % (self.args.repo_path, self.args.job_name)
self.job_git = '%s/workspace/%s/' % (self.args.jenkins_home, self.args.job_name)
self.job_code = '%s/code' % self.job_repo
self.job_rollback = '%s/rollback' % self.job_repo def path_handler(self):
"""判断代码库目录是否存在,不存在则创建"""
# print(self.args.repo_path)
if not os.path.exists(self.args.repo_path):
os.mkdir(self.args.repo_path)
if not os.path.exists(self.job_repo):
os.makedirs(self.job_rollback,exist_ok=True)
else:
shutil.rmtree(self.job_code) def copy_code(self):
shutil.copytree(self.job_git, self.job_code,symlinks=False,ignore=shutil.ignore_patterns('.git'))
os.system('find %s -ctime +2 -exec rm -rf {} \;' % self.job_rollback)
shutil.copytree(self.job_git, "%s/%s"%(self.job_rollback,self.args.build_id),
symlinks=False,ignore=shutil.ignore_patterns('.git')) if __name__ == '__main__':
obj = Deploye()
obj.path_handler()
obj.copy_code()

ansbile中的设置

这一部分其实实现方式很多,为了方便套用,基本实现了参数化方式,先看下目录结构:

chengchendeiMac:ansible shane$ tree
.
|____.DS_Store
|____ansible.cfg
|____google.yml
|____XXXXXnline.yml
|____hosts
|____mysqlbak.yml
|____roles
| |____google
| | |____tasks
| | | |____main.yml
| | |____templates
| | | |____common.inc.php.j2
| | | |____config.common.inc.php.j2
| | |____vars
| | | |____main.yml
| |____XXXXXnline
| | |____tasks
| | | |____main.yml
| | |____templates
| | | |____common.inc.php.j2
| | | |____config.common.inc.php.j2
| | |____vars
| | | |____main.yml
| |____test_job
| | |____tasks
| | | |____main.yml
| | |____templates
| | | |____common.inc.php.j2
| | | |____config.common.inc.php.j2
| | |____vars
| | | |____main.yml

再看下ansible的入口yml文件:

chengchendeiMac:ansible shane$ cat google.yml
--- - hosts: google
user: root
gather_facts: no
roles:
- "{{job_name}}"

然后在看下角色配置:

chengchendeiMac:ansible shane$ cat roles/google/tasks/main.yml
--- - name: sync "{{job_name}}" statics code
synchronize:
src: "{{code_src}}/statics/"
dest: "{{code_dest}}/statics/"
delete: yes
rsync_opts: --exclude=upload - name: sync "{{job_name}}" web code
synchronize:
src: "{{code_src}}/web/"
dest: "{{code_dest}}/p2p/"
delete: yes
rsync_opts: '--exclude=data/pay_cache/* --exclude=data/*' - name: "configure conf files: common.inc.php"
template:
src: common.inc.php.j2
dest: "{{code_dest}}/xxx/common.inc.php" - name: "configure conf files: config.common.inc.php"
template:
src: config.common.inc.php.j2
dest: "{{code_dest}}/xxx/config.common.inc.php"

因为我这边的代码中有两个目录,做了动静分离,写了两个,这一块自由发挥吧。然后使用模板的方式,将固定的配置文件覆盖即可。

最新文章

  1. JS Util1(basic)
  2. Vue.js多重组件嵌套
  3. android界面横屏和竖屏的切换
  4. Ubuntu系统启动过程详解
  5. shell脚本判断文件类型
  6. TCP同步传送数据示例以及可能出现问题分析
  7. php表单数据验证类
  8. 第1部分: 游戏引擎介绍, 渲染和构造3D世界
  9. RxJava开发精要4 – Observables过滤
  10. SQL Server 两种判断表名是否存在且删除的方式
  11. JS随机数不重复
  12. 【BZOJ 3569】 DZY Loves Chinese II
  13. __x__(17)0906第三天__块元素block_内联元素inline_行内块元素inline-block
  14. 机器学习笔记(6):多类逻辑回归-使用gluon
  15. JS基础---->javascript的基础(一)
  16. BASE_DIR 拼接文件路径
  17. 一张图教会CSS3倒影
  18. C# 打开钱箱支持北洋、佳博、爱普生
  19. 关键业务系统的JVM参数推荐(2018仲夏版) (强烈推荐 唯品会)
  20. vue视频插件VLC

热门文章

  1. C++——STL(算法)
  2. python测试开发django-rest-framework-59.restful接口开发
  3. Maven之setting.xml 配置详解
  4. 压缩及解压命令gzip、bzip2、tar
  5. C#操作域用户ADHelper
  6. 从url中下载资源(目前测试只有照片,文件类的没有进行测试)
  7. python开发总结
  8. zabbix-agent主动模式和proxy
  9. Java 15周作业
  10. ssh配置基础