Fabric实现生产环境代码包发布管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/88076984

一 点睛

程序生产环境的发布是业务上线最后一个环节,要求具备源码打包、发布、切换、回滚、版本管理等功能,本实战实现了这一整套流程功能,其中版本切换与回滚使用了Linux下的软链接实现。

二 代码

#coding=utf-8
#!/usr/bin/env python
from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
import time

env.user='root'
env.hosts=['192.168.0.101']
env.password='123456'

env.project_dev_source = '/data/dev/Lwebadmin/'     # 开发机项目主目录
env.project_tar_source = '/data/dev/releases/'      # 开发机项目压缩包存储目录
env.project_pack_name = 'release'                   # 项目压缩包名前缀,文件名为release.tar.gz

env.deploy_project_root = '/data/www/Lwebadmin/'    # 项目生产环境主目录
env.deploy_release_dir = 'releases'                 # 项目发布目录,位于主目录下面
env.deploy_current_dir = 'current'                  # 对外服务的当前版本软链接

env.deploy_version=time.strftime("%Y%m%d")+"v2"     # 版本号

@runs_once
def input_versionid():                              # 获得用户输入的版本号,以便做版本回滚操作
    return prompt("please input project rollback version ID:",default="")

@task
@runs_once
def tar_source():                                   # 打包本地项目主目录,并将压缩包存储到本地压缩包目录
    print yellow("Creating source package...")
    with lcd(env.project_dev_source):
        local("tar -czf %s.tar.gz ." % (env.project_tar_source + env.project_pack_name))
    print green("Creating source package success!")


@task
def put_package():                                   # 上传任务函数
    print yellow("Start put package...")
    with settings(warn_only=True):
        with cd(env.deploy_project_root+env.deploy_release_dir):    # 切换到Lwebadmin目录下的releases目录
            run("mkdir %s" % (env.deploy_version))                  # 创建版本目录
    # v2版本的全路径
    env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/"+env.deploy_version

    with settings(warn_only=True):
        # 上传项目压缩包至v2版本的全路径
        result = put(env.project_tar_source + env.project_pack_name +".tar.gz",env.deploy_full_path)
    if result.failed and not confirm("put file failed, Continue[Y/N]?"):
        abort("Aborting file put task!")

    with cd(env.deploy_full_path):
        # 成功解压后删除压缩包
        run("tar -zxvf %s.tar.gz" % (env.project_pack_name))
        run("rm -rf %s.tar.gz" % (env.project_pack_name))

    print green("Put & untar package success!")


@task
def make_symlink():             # 为当前版本目录做软链接
    print yellow("update current symlink")
    # 当前版本是V2版本
    env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/"+env.deploy_version
    with settings(warn_only=True):
        # 删除原来的软链接文件
        run("rm -rf %s" % (env.deploy_project_root + env.deploy_current_dir))
        # 为当前V2版本做软链接文件current
        run("ln -s %s %s" % (env.deploy_full_path, env.deploy_project_root + env.deploy_current_dir))
    print green("make symlink success!")

@task
def rollback():                 # 版本回滚任务函数
    print yellow("rollback project version")
    versionid= input_versionid()        # 获得用户输入的回滚版本号
    if versionid=='':
        abort("Project version ID error,abort!")

    # 要回滚的版本路径
    env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/"+versionid
    # 删除原来的软链接文件
    run("rm -f %s" % env.deploy_project_root + env.deploy_current_dir)
    # 为回滚版本制作新的软链接文件
    run("ln -s %s %s" % (env.deploy_full_path, env.deploy_project_root + env.deploy_current_dir))
    print green("rollback success!")

@task
def go():
    tar_source()
    put_package()
    make_symlink()

三 运行结果

[root@localhost pymaintain]# fab -f 7_3_9.py go
[192.168.0.101] Executing task 'go'
Creating source package...
[localhost] local: tar -czf /data/dev/releases/release.tar.gz .
Creating source package success!
Start put package...
[192.168.0.101] run: mkdir 20190302v2
[192.168.0.101] put: /data/dev/releases/release.tar.gz -> /data/www/Lwebadmin/releases/20190302v2/release.tar.gz
[192.168.0.101] run: tar -zxvf release.tar.gz
[192.168.0.101] out: ./
[192.168.0.101] out: ./test.html
[192.168.0.101] out:

[192.168.0.101] run: rm -rf release.tar.gz
Put & untar package success!
update current symlink
[192.168.0.101] run: rm -rf /data/www/Lwebadmin/current
[192.168.0.101] run: ln -s /data/www/Lwebadmin/releases/20190302v2 /data/www/Lwebadmin/current
make symlink success!

Done.
Disconnecting from 192.168.0.101... done.

四 开发项目目录

[root@localhost dev]# tree
.
├── Lwebadmin
│   └── test.html
└── releases
    └── release.tar.gz

2 directories, 2 files

五 生产环境目录

[root@slave2 Lwebadmin]# tree
.
├── current -> /data/www/Lwebadmin/releases/20190302v2
└── releases
    └── 20190302v2
        └── test.html

3 directories, 1 file

六 说明

本实战实现了一个通用性很强的代码发布管理功能,支持快速部署与回滚,无论发布还是回滚,都可以通过切换current的软链来实现, 非常灵活。该功能的流程图如图:

在生产环境中Nginx的配置如下:

server_name domain.com 
index index.html index.htm index.php; 
root /data/www/Lwebadmin/current;

将站点根目录指向“/data/www/Lwebadmin/current”,由于使用 Linux软链接做切换,管理员的版本发布、回滚操作用户无感知,同时也规范了我们业务上线的流程。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/88076984
今日推荐