jenkins打包、发布、部署python_jenkins完整实现代码自动发布和回滚至某版本的python脚本...

本文地址:http://www.04007.cn/article/629.html

今天因为服务器迁移变迁,又对发布脚本进行了一些优化改进。之前在公司的发布脚本上进行了一个主要的回滚改进,即在版本文件夹中引入了SVN版本号从而实现回滚时可回滚至确定的版本号,也有过一篇这文件,今天再在这上面进行了一些改善,所以在这笔记本里保存一下。本文地址:http://www.04007.cn/article/629.html,未经许可,不得转载.

在jenkins平台中的Comman命令配置如下:

#自动部署脚本

fab -f deploy/fabfile.py production deploy

#线上全量回滚至某个版本

fab -f deploy/fabfile.py production rollback --set rollToVersion=SVN版本号本文地址:http://www.04007.cn/article/629.html,未经许可,不得转载.

此代码的功能特点如下:

1,代码直接解压至目标版本文件夹。使用tar 的--strip-components 1选项。减少了有些发布先解压至tmp目录再进行处理的步骤。

2,发布时可通过修改exclude_list 设置哪些文件夹或文件不用发布至代码中

3,创建current软链时使用ln -sTf直接覆盖,减少一些发布中先删除current再创建的步骤。

4,发布脚本最后添加命令ls -tlr| head -n -8 | xargs sudo rm -rf 删除8个以外的代码版本。避免过多版本冗余

5,发布时提取SVN的版本号SVN_REVISION,存入版本文件夹名称中,从而实现回滚的时候可以实现所有服务器回滚至同一版本号。

6,服务器同时存在多个同一版本的代码,回滚至此版本也不会出错。本文地址:http://www.04007.cn/article/629.html,未经许可,不得转载.

以下是完整的fabfile.py中的完整代码:本文地址:http://www.04007.cn/article/629.html,未经许可,不得转载.

#! /usr/bin/python

#encoding=utf-8

#kermit@04007.com

#jenkins平台中的Comman命令如下:

#自动部署脚本

#fab -f deploy/fabfile_new2019.py production deploy

#线上全量回滚至某个版本

#fab -f deploy/fabfile_new2019.py production rollback --set rollToVersion=SVN版本号

from fabric.api import *

import time

import os

# fab production deploy

env.app = '04007_api'

#线上发布脚本

@task

def production():

env.user = "04007_jenkins"

env.hosts = [

'192.168.162.43',

'192.168.162.44',

'192.168.162.45',

'192.168.162.46',

]

env.password = '111111111111111'

env.base_dir = "/opt/04007_data"

#线上部署时使用线上环境

env.copyconfig = 2

#线上全量代码回滚

@task

def rollback():

if not env.has_key('rollToVersion'):

print('no must params:rollToVersion.')

else:

env.rollto = run("sudo ls -r %(base_dir)s/jenkins_revs | grep _%(toversion)s;" % { 'base_dir':env.base_dir ,'toversion':env.rollToVersion})

if len(env.rollto) < 10:

print('回滚失败,未找到版本号目录:' + env.rollToVersion)

else:

env.rollto = env.rollto.split()

with cd(env.base_dir):

run("ln -sTf jenkins_revs/%(rollto)s current;" % { 'rollto':env.rollto[0]})

print('成功回滚至版本目录:' + env.rollto[0])

#全量发布

@task

def deploy():

remote_floder = time.strftime('%Y%m%d%H%M%S') + '_' + os.getenv("SVN_REVISION");

remote_dir = env.base_dir + '/jenkins_revs/';

env.current_release = remote_dir + remote_floder;

exclude_list = "{.svn,static}"

upload_project(remote_dir=remote_dir, remote_floder = remote_floder, exclude=exclude_list)

with cd(env.current_release):

run("rm -rf static;ln -s /opt/wireless/static static;")

#测试环境/线上环境部署时的配置文件

if env.copyconfig==1:

run("cp -f config.test.php config.php;")

if env.copyconfig==2:

run("cp -f config.online.php config.php;")

with cd(env.base_dir):

run("ln -sTf %(current_release)s current;sudo /etc/init.d/php-fpm reload;cd jenkins_revs;ls -tlr| head -n -8 | xargs sudo rm -rf" % {'current_release':env.current_release})

#代码部署上服务器

def upload_project(remote_dir="", remote_floder="", exclude=""):

from tempfile import mkdtemp

local_dir = os.getcwd()

local_dir = local_dir.rstrip(os.sep)

local_path, local_name = os.path.split(local_dir)

tar_file = "%s.tar.gz" % local_name

target_tar = os.path.join(remote_dir, tar_file)

tmp_folder = mkdtemp()

try:

tar_path = os.path.join(tmp_folder, tar_file)

cmd = "tar -czf %s -C %s %s --exclude=%s" % (tar_path, local_path, local_name, exclude)

local(cmd)

put(tar_path, target_tar)

with cd(remote_dir):

try:

run("mkdir %s;tar -xzf %s -C %s --strip-components 1" % (remote_floder, tar_file, remote_floder))

finally:

run("rm -f %s" % tar_file)

finally:

local("rm -rf %s" % tmp_folder)

本文地址:http://www.04007.cn/article/629.html,未经许可,不得转载.

本文地址:http://www.04007.cn/article/629.html 未经许可,不得转载. 手机访问本页请扫描下方二维码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值