使用fabric進行代碼的自動化部署

#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。第一次寫,可能比較簡單,將持續改進。python

相關文章
相關標籤/搜索