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"

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

PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)的更多相关文章

  1. jenkins结合ansible用shell实现自动化部署和回滚

    最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚.然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现. 环境: cent ...

  2. Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)

     转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...

  3. 使用Jenkins结合Gogs和SonarQube对项目代码进行测试、部署、回滚,以及使用keepalived+haproxy调度至后端tomcat

    0 环境说明 主tomcat:192.168.0.112 备tomcat:192.168.0.183 haproxy+keepalived-1:192.168.0.156 haproxy+keepal ...

  4. Jenkins使用FTP进行一键部署及回滚(Windows)

    前提条件: 1.必须有两台服务器,一个是生产环境,另一个是测试环境. 2.两台服务器上都必须安装了Jenkins. 3.其中,生产环境上的Jenkins已经开通的CLI的权限(Windows参考:ht ...

  5. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境

    写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...

  6. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署

    前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...

  7. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装

    2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...

  8. 原创|1分钟搞定 Nginx 版本的平滑升级与回滚

    Nginx无论是对于运维.开发.还是测试来说,都是日常工作需要掌握的一个知识点,之前也写过不少关于Nginx相关的文章: Nginx服务介绍与安装 Nginx服务配置文件介绍 Nginx配置虚拟主机 ...

  9. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

    写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...

随机推荐

  1. python内建模块发起HTTP(S)请求

    一.Python2 httplib 简介:httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. ...

  2. PAT甲级1007题解——贪心

    题目分析:对于每一个点来说,如果选择合并入包含前一个点的序列那么只有在前一个点的序列不为负数(这里指的是包含前一个位置的数的一个连续序列的和不为负数),当前点才会将自己也加入这个子序列,否则,当前点则 ...

  3. PAT甲级1003题解——Dijkstra

    解题步骤: 1.初始化:设置mat[][]存放点之间的距离,vis[]存放点的选取情况,people[]存放初始时每个城市的人数,man[]存放到达每个城市的救援队的最多的人数,num[]存放到达每个 ...

  4. python iter()函数迭代器

    迭代器为类序列对象提供了一个类序列的接口.python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象.迭代器用起来很灵巧,你可以迭代不是序列但表现处序列行为的对象,例如 ...

  5. hive中执行hql或建表语句时,抛出Display all 459 possibilities? (y or n)错误的解决方法

    我昨天在hive上建表,一直报Display all 459 possibilities? (y or n) ,之前我以为是建表语句有问题,一直在改语句,后来在网上搜这个错误,原来语句里混杂了Tab缩 ...

  6. 浏览器-同源政策(same-origin policy)

    浏览器安全的基石是“同源政策”(same-origin policy). 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策. 何为同源? 协议相同 域名相同 端 ...

  7. gulp-htmlmin 页面压缩插件 gulp插件 参数说明

    gulpfile.js var gulp = require('gulp'), htmlmin = require('gulp-htmlmin'); gulp.task('testHtmlmin', ...

  8. Centos 7 命令行版虚拟机安装

    使用VMware创建虚拟机 点击下一步 点击下一步 下一步 选择你要安装的虚拟机是哪种操作系统 选择虚拟机的安装位置 选择处理器 自定义内存 选择网络 下一步 下一步 下一步就可以 自定义磁盘容量 然 ...

  9. junit4的进一步探讨

    上次只是大概记录了下junit4几个常见标签的用法. 在这篇文章中,我们来进一步分析junit4的用法. 1.断言 junit4中一个很常见的用法就是断言.说到断言,大家再熟悉不过了.不过也许有的朋友 ...

  10. LeetCode 1102. Path With Maximum Minimum Value

    原题链接在这里:https://leetcode.com/problems/path-with-maximum-minimum-value/ 题目: Given a matrix of integer ...