#coding=utf-8
from fabric.api import local, abort, settings, env, cd, run
from fabric.colors import *
from fabric.contrib.console import confirm

env.hosts = ["root@115.28.×××××"]
env.password = "×××××"


def get_git_status():
    git_status_result = local("git status", capture=True)
    if "无文件要提交,干净的工作区" not in git_status_result:
        print red("****当前分支还有文件没有提交")
        print git_status_result
        abort("****已经终止")


def local_unit_test():
    with settings(warn_only=True):
        test_result = local("python manage.py test")
        if test_result.failed:
            print test_result
            if not confirm(red("****单元测试失败,是否继续?")):
                abort("****已经终止")


def server_unit_test():
    with settings(warn_only=True):
        test_result = run("python manage.py test")
        if test_result.failed:
            print test_result
            if not confirm(red("****单元测试失败,是否继续?")):
                abort("****已经终止")


def upload_code():
    local("git push origin dev")
    print green("****代码上传成功")


def deploy_at_server():
    print green("****ssh到服务器进行下列操作")
    with cd("/var/www/××××××"):
        #print run("pwd")
        print green("****将在远程仓库下载代码")
        run("git checkout dev")
        get_git_status()
        run("git pull origin dev")
        print green("****将在服务器上运行单元测试")
        server_unit_test()
        run("service apache2 restart", pty=False)
        print green("****重启apache2成功")
        print green("********代码部署成功********")


def deploy():
    get_git_status()
    local("git checkout dev", capture=False)
    print green("****切换到dev分支")
    get_git_status()
    print green("****将开始运行单元测试")
    local_unit_test()
    print green("****单元测试完成,开始上传代码")
    upload_code()
    deploy_at_server()

fabric可以将自动化部署或者多机操作的命令固化到一个脚本里,从而减少手动的操作。上面是今天第一次接触这东西后写的,确实很实用。运行fab deploy就行了。
主要逻辑就是将本地的dev分支跑单元测试,然后提交到服务器,ssh登陆到服务器,然后pull下来,再跑单元测试,然后重启apache2。第一次写,可能比较简单,将持续改进。


virusdefender
216 声望7 粉丝

引用和评论

0 条评论