zoukankan      html  css  js  c++  java
  • Python之——生产环境代码包发布管理fabirc

    程序生产环境的发布是业务上线最后一个环境,要求具备源码打包、发布、切换、回滚、版本管理等功能,本实例实现了一整套流程,其中版本切换与回滚使用了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的软链接做切换,我们的版本发布、回滚操作用户无感知,同时也规范了我们业务上线的流程。

  • 相关阅读:
    牛顿插值法及其C++实现
    见鬼吧,拉格朗日插值法
    迭代法与开根号求值(letcode 69)
    多项式计算之秦九韶算法
    (扩展根目录容量方法汇总)把Linux系统迁移到另一个分区或者硬盘
    jdk 动态代理源码分析
    python 随笔
    java 笔记
    enum(枚举类型)
    提高工作效率的准则
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/9253679.html
Copyright © 2011-2022 走看看