天天看點

bitbucket基于commit事件的自動釋出起因思考實作service

起因

公司有一個頻繁疊代的項目,每日的送出量有20個左右。每次想要看到變更後的效果,都要ssh進入伺服器,先git pull,再restart服務,頗為麻煩。

思考

手動釋出代碼既麻煩又存在操作不及時、操作失誤等問題。于是我想到了持續內建系統,如Jenkins。不過這套系統對于本項目來說有點殺雞用牛刀了,而且費資源。

我找到了bitbucket中的Webhooks的介紹:

Webhooks allow you to extend what Bitbucket does when the repository changes (for example, new code is pushed or a pull request is merged).

意思是說對代碼進行讀寫操作的時候可以執行一些自定義動作,如下圖:

bitbucket基于commit事件的自動釋出起因思考實作service

我們隻需綁定Push事件即可,URL填入自己搭建的service(稍後介紹),一旦有對應事件産生,則會通路URL,那麼此時就可以觸發自動更新代碼的邏輯了。

實作service

核心實作

Bitbucket提供了對應文檔,這裡隻看Push事件的文檔。

Show request body

按鈕提供了請求資料的樣本。

下面附上比對目前分支事件的代碼

import jmespath
def match_branch(content, branch):
    data = json.loads(content)
    changes = jmespath.search('push.changes', data)
    for change in changes or []:
        commit_branch = jmespath.search('new.name', change)
        if commit_branch and commit_branch == branch:
            return True
    return False
           

如果請求體被函數檢測通過,那麼就執行git pull,restart等行為。

這裡附上基于flask web架構的demo

from flask import Flask, request
app = Flask(__name__)
BRANCH = 'master'
@app.route('/autodeploy', methods=['POST'])
def autodeploy():
    if match_branch(request.data, BRANCH):
        # TODO: 執行git pull,restart等行為
        pass
    else:
        return 'ignore', 

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=)
           

BRANCH全局變量需要修改為自己項目對應的分支名,服務的URL為

http://yourdomain.com:8000/autodeploy

,将其填入Bitbucket的Webhooks中,那麼下次代碼從本地Push到伺服器時,就自動釋出。

繼續閱讀