#!/usr/bin/env python #_*_ coding: utf-8 _*_ # - zhusl -2016.12.17- # usage:fab -f simpale.py go # 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=['127.0.0.1',] env.password='123.com' env.project_dev_source = '/data/dev/hello/' #代码目录 env.project_tar_source = '/data/dev/releases/' #发布机代码压缩包目录 env.project_pack_name = 'release' #代码前缀名,文件名为release.tar.gz env.deploy_project_root = '/data/www/hello/' #项目生产环境主目录 env.deploy_release_dir = 'releases' #项目发布目录,位于主目录下面 env.deploy_current_dir = 'current' #对外发布软连接名 env.deploy_version=time.strftime("%Y%m%d%H%M%S")+"v1" #版本号 @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 -zcf %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): run("mkdir %s " % (env.deploy_version)) env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir +"/"+env.deploy_version with settings(warn_only=True): result = put (env.project_tar_source + env.project_pack_name + ".tar.gz", env.deploy_full_path) if result.failed and not("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") env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir+"/"+env.deploy_version with settings(warn_only=True): run("rm -fr %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("make symlink success!!!") @task def rollback(): #回滚函数 print yellow("rollback project version") versionid = input_versionid() if versionid == '': abord("Porject 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()