起因
公司有一個頻繁疊代的項目,每日的送出量有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).
意思是說對代碼進行讀寫操作的時候可以執行一些自定義動作,如下圖:
我們隻需綁定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到伺服器時,就自動釋出。