PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)
PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)
先看流程图:
大概介绍一下:
- 版本选择使用jenkins 中的
git parameter
插件实现 - 回滚方式比较low,直接使用代码库目录方式实现
其中gitlab、ansible、jenkins安装不在本文讨论范围之内。
效果
先看下效果图:
jenkins 发布配置
PHP 代码不需要 Ant 或者 meaven 编译,所以可以直接使用。
新建一个项目,比较重要的是:选择参数化构建
- 选择git parameter,需要给参数定义个变量名称。部署发布作用区
- 选择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 动态选择版本进行自动化部署与回滚(第二版)的更多相关文章
- jenkins结合ansible用shell实现自动化部署和回滚
最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚.然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现. 环境: cent ...
- Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)
转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...
- 使用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 ...
- Jenkins使用FTP进行一键部署及回滚(Windows)
前提条件: 1.必须有两台服务器,一个是生产环境,另一个是测试环境. 2.两台服务器上都必须安装了Jenkins. 3.其中,生产环境上的Jenkins已经开通的CLI的权限(Windows参考:ht ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装
2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...
- 原创|1分钟搞定 Nginx 版本的平滑升级与回滚
Nginx无论是对于运维.开发.还是测试来说,都是日常工作需要掌握的一个知识点,之前也写过不少关于Nginx相关的文章: Nginx服务介绍与安装 Nginx服务配置文件介绍 Nginx配置虚拟主机 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚
写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...
随机推荐
- PCB Layout设计规范——PCB布线与布局
1.PCB布线与布局隔离准则:强弱电流隔离.大小电压隔离,高低频率隔离.输入输出隔离,分界标准为相差一个数量级.隔离方法包括:空间远离.地线隔开. 2. 晶振要尽量靠近IC,且布线要较粗 ...
- 使用Apollo做配置中心
https://blog.51cto.com/12980017/2158490?source=dra 由于Apollo支持的图形化界面相对于我们更加的友好,所以此次我们使用Apollo来做配置中心 本 ...
- 动态域名作为dga的做法
https://wenku.baidu.com/view/54b1df373968011ca3009183.html dga算法 import time from ctypes import c_in ...
- 再来一个tensorflow的测试性能的代码
感觉这个比前一套,容易理解些~~ 关于数据提前下载的问题: https://www.jianshu.com/p/5116046733fe 如果使用keras的cifar10.load_data()函数 ...
- git上传者姓名修改
只需要两个指令 git config user.name 和 git config –global user.name 在控制台中输入git config user.name获取当前的操作名称 修改名 ...
- Tomcat项目内存参数调优
一.常见的Java内存溢出有以下三种: 1. Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:JVM在启动的时候会自动设置JV ...
- Zabbix4.0国内下载源
国内zabbix源总结 目前发现的有以下几个站点: 1.阿里巴巴开源镜像站(推荐使用) 地址:https://mirrors.aliyun.com/zabbix/ 2.华为开源镜像站(推荐使用) 地址 ...
- maven 使用dependencyManagement统一管理依赖版本
今日思语:人生方方长长,努力把她磨成方圆,所以 加油咯~ 使用maven可以很方便的进行项目依赖的管理,即可以管理我们显示引入具体版本的依赖,也可以管理某些第三方引入的一些依赖的版本,从而能更好的实现 ...
- (2)ESP8266 矩阵的逆求解
#include "math.h" int N=4; int M=4; float a[4][4]={ {1,0,0,0}, {1,0.5,0,0}, {1,0,1,0}, {1, ...
- Python 03 pip 的安装和使用
原文:https://www.runoob.com/w3cnote/python-pip-install-usage.html 原文:https://www.jianshu.com/p/2be68ef ...