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

  1.  
    # -*- coding:UTF-8 -*-
  2.  
    '''
  3.  
    Created on 2018年1月12日
  4.  
     
  5.  
    @author: liuyazhuang
  6.  
    '''
  7.  
     
  8.  
    from fabric.api import *
  9.  
    from fabric.colors import *
  10.  
    from fabric.context_managers import *
  11.  
    from fabric.contrib.console import confirm
  12.  
    import time
  13.  
     
  14.  
    env.user = 'root'
  15.  
    env.hosts = ['192.168.209.121', '192.168.209.122']
  16.  
    env.password = '密码'
  17.  
     
  18.  
    #开发机项目主目录
  19.  
    env.project_dev_source = '/data/dev/source/'
  20.  
    #开发机项目压缩包存储目录
  21.  
    env.project_tar_source = "/data/dev/releases/"
  22.  
    #项目压缩包前缀,文件名为release.tar.gz
  23.  
    env.project_pack_name='release'
  24.  
     
  25.  
    #项目生产环境主目录
  26.  
    env.deploy_project_root = "/data/application/"
  27.  
    #项目发布目录,位于主目录下面
  28.  
    env.deploy_release_dir = 'releases'
  29.  
    #对外服务的当前版本软链接
  30.  
    env.deploy_current_dir = 'current'
  31.  
    #版本号
  32.  
    env.deploy_version=time.strftime("%Y%m%d") + "v2"
  33.  
     
  34.  
    @runs_once
  35.  
    def input_versionid(): #获得用户输入的版本号,以便做版本回滚操作
  36.  
    return prompt("please input project rollback version ID:", default="")
  37.  
     
  38.  
    @task
  39.  
    @runs_once
  40.  
    def tar_source(): #打包本地项目主目录,并将压缩包存储到本地压缩包目录
  41.  
    print yellow("Creating source package...")
  42.  
    with lcd(env.project_dev_source):
  43.  
    local("tar -czf %s.tar.gz." %(env.project_tar_source + env.project_pack_name))
  44.  
    print green("Creating source package success!")
  45.  
     
  46.  
    @task
  47.  
    def put_package(): #上传任务函数
  48.  
    #开始打印
  49.  
    print yellow("Start put package...")
  50.  
    with settings(warn_only = True):
  51.  
    with cd(env.deploy_project_root + env.deploy_release_dir):
  52.  
    #创建版本目录
  53.  
    run("mkdir %s" % (env.deploy_version))
  54.  
    env.deplog_full_path = env.deploy_project_root + env.deploy_release_dir + "/" + env.deploy_version
  55.  
     
  56.  
    #上传项目压缩包至此目录
  57.  
    with settings(warn_only = True):
  58.  
    result = put(env.project_tar_source + env.project_pack_name + ".tar.gz", env.deplog_full_path)
  59.  
    if result.failed and not("put file failed, Continue[Y/N]?"):
  60.  
    abort("Aborting file put task!")
  61.  
     
  62.  
    #成功解压后删除压缩包
  63.  
    with cd(env.deplog_full_path):
  64.  
    run("tar -zxvf %s.tar.gz" % (env.project_pack_name))
  65.  
    run("rm -rf %s.tar.gz" % (env.project_pack_name))
  66.  
     
  67.  
    print green("put & untar package success!")
  68.  
     
  69.  
     
  70.  
    @task
  71.  
    def make_symlink(): #为当前版本目录做链接
  72.  
    print yellow("update current symlink")
  73.  
    env.deploy_full_path = env.deploy_project_root + env.deploy_release_dir + "/" + env.deploy_version
  74.  
    #删除软链接,重新创建并制定软链接源目录,新版本生效
  75.  
    with settings(warn_only = True):
  76.  
    run("rm -rf %s" % (env.deploy_project_root + env.deploy_current_dir))
  77.  
    run("ln -s %s %s" % (env.deploy_full_path, env.deploy_project_root + env.deploy_current_dir))
  78.  
    print green("make symlink success!")
  79.  
     
  80.  
    @task
  81.  
    def rollback(): #版本回滚任务函数
  82.  
    print yellow("rollback project version")
  83.  
    #获得用户输入的回滚版本号
  84.  
    versionid = input_versionid()
  85.  
    if versionid == '':
  86.  
    abort("Please version ID error, abort!")
  87.  
     
  88.  
    env.deploy_full_path = env.deploy_project_root + env.deploy_release_dir + "/" + versionid
  89.  
    #删除软链接,重新创建并制定软链接目录,新版本生效
  90.  
    run("rm -f %s" % env.deploy_project_root + env.deploy_current_dir)
  91.  
    run("ln -s %s %s" % (env.deploy_full_path, env.deploy_project_root + env.deploy_current_dir))
  92.  
    print green("rollback success!")
  93.  
     
  94.  
    @task
  95.  
    def go(): #自动化程序版本发布入口函数
  96.  
    tar_source()
  97.  
    put_package()
  98.  
    make_symlink()

本实例实现了一个通用性很强的代码发布管理功能,支持快速部署与回滚,无论发布还是回滚,都可以通过切换current软链接来实现,非常灵活。由于使用了Linux的软链接做切换,我们的版本发布、回滚操作用户无感知,同时也规范了我们业务上线的流程。

Python之——生产环境代码包发布管理fabirc的更多相关文章

  1. fabric生产环境代码包发布管理

  2. 基于node的前端项目代码包发布至nexus

    目录 目录... 3 1. 前言... 1 2. 配置... 1 2.1. 配置angular.json文件... 1 2.2. 配置package.json文件... 1 2.3. 复制git地址. ...

  3. Anaconda 科学计算环境与包的管理

    相信大多数 python 的初学者们都曾为开发环境问题折腾了很久,包管理和 python 不同版本的问题,特别是 window 环境安装个 scrapy 各种报错 ,使用 Anaconda 可以很好的 ...

  4. .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)

    最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...

  5. git管理测试生产环境代码

    利用post-update实现简单钩子 #!/bin/bash cd /www/test || exit #进入指定的目录 unset GIT_DIR #清楚环境变量 git checkout mas ...

  6. Linux_CentOS下搭建Nodejs 生产环境-以及nodejs进程管理器pm2的使用

    nodejs安装:https://www.cnblogs.com/loaderman/p/11596661.html nodejs 进程管理器 pm2 的使用 PM2 是一款非常优秀的 Node 进程 ...

  7. 利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境

    一.环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新 ...

  8. (17/24) webpack实战技巧:生产环境和开发环境并行设置,实现来回切换

    1. 概述 生产环境和开发环境所需依赖是不同: --开发依赖:就是开发中用到而发布时用不到的.在package.json里面对应的就是devDependencies下面相关配置. --生产依赖: 就是 ...

  9. Python 一键安装全部依赖包

    使用 pip requirements.txt 用来记录项目所有的依赖包和版本号,只需要一个简单的 pip 命令就能完成. pip freeze > requirements.txt 生成的文件 ...

随机推荐

  1. 1.centos6.8安装docker

    简介环境安装依赖安装步骤1.删除旧版本的docker2.安装docker2.1 yum安装docker2.2 tar安装2.3 在线脚本事实证明以上的安装方式都行不通 参考文档:https://doc ...

  2. Tornado之笔记集合

    目录 一.基本使用 二.路由系统 三.视图函数 四.模版语言 五.cookie 六.CSRF 七.文件上传 八.异步非阻塞 九.RESTFUL 十.自定义组件 一.基本使用 1.最简使用 import ...

  3. ubuntu16更新源

    http://blog.csdn.net/fengyuzhiren/article/details/54844870

  4. php 数组去重

    php 数组去重 数组中重复项的去除 2010-07-28 15:29 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php                    ...

  5. Git基础级介绍

    这篇随笔是在学习了廖雪峰老师的git教程之后写的总结,要看详细的基础级git介绍可以去http://www.liaoxuefeng.com/wiki/0013739516305929606dd1836 ...

  6. 团队博客作业Week5 --- 团队贡献分--分配规则

    团队会议 时间:公元2015年10月26日22时3分20秒 地点:宿舍楼716房间 与会人员:陈谋,李剑锋,卢惠民,刘夕霆,仉伯龙,潘成鼎. 会议内容:今天的组会主要讨论的是项目团队贡献分的计算方式, ...

  7. oo第八次作业--5,6,7次作业总结

    一.多线程的设计 这三次作业的主要内容就是使用多线程并且解决多线程中出现的问题.而对于多线程我也有了自己的理解.首先明确的一点是单个CPU在同一时间只能处理一件事.那么,不管是多进程还是多线程,我们的 ...

  8. 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结

    当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...

  9. 冲刺One之站立会议8 /2015-5-21

    今天我们把聊天界面做了优化和改进,主要实现了聊天的功能.显示了正在进行通信的成员列表,和当前状态,是否连通和正常通信,大体完成了预期的目标. 燃尽图8

  10. 软工网络15团队作业8——Beta阶段敏捷冲刺(用户使用调查报告)

    一.项目概述 1.项目名称 考研必背 2.项目简介 微信小程序,帮助考研学生记忆单词. 3.项目预期达到目标 用户无需下载app,仅通过微信小程序就可以达到背单词的目的,并且能够制定背单词的计划. 4 ...