利用 github 的 webhooks 自動(dòng)部署博客

原文發(fā)布于自己的博客平臺(tái)【http://www.jetchen.cn/github-webhooks/


背景

博客原是 WordPress 搭建的,由于某些個(gè)人無法接受的原因,準(zhǔn)備轉(zhuǎn)成靜態(tài)博客滋早,之前轉(zhuǎn)過毁渗,使用的是 HEXO哥捕,基本成功了蝶柿,但是是部署在 github pages 上面的鞠评,如今準(zhǔn)備部署在國(guó)內(nèi)的阿里云服務(wù)器上脱茉。

問題

使用 HEXO 搭建的博客平臺(tái)剪芥,進(jìn)行寫博客的流程是:

1、本地使用 Markdown 編寫博客琴许,
2税肪、本地編譯成 html 文件,
3榜田、將 html 文件上傳至服務(wù)器益兄,一般免費(fèi)的有 github page,gitee 等

所以此處需要改造的點(diǎn)其實(shí)很簡(jiǎn)單箭券,就是把 github 倉(cāng)庫(kù)中的 html 文件全部下載至服務(wù)器上净捅,然后利用 web 服務(wù)器做個(gè)反向代理即可,比如 nginx辩块。

后續(xù)的部署流程:

1蛔六、本地寫完博客荆永,編譯完成后上傳至 github 倉(cāng)庫(kù)
2、登陸到服務(wù)器上面進(jìn)行 git update 操作

問題就此暴露出來了国章,每次寫完博客都要登陸下服務(wù)器去更新下 html 文件具钥,我的天,這誰頂?shù)米 ?/p>

解決

于是自然而然想到了 git 倉(cāng)庫(kù)的 web 鉤子捉腥,即當(dāng) git 倉(cāng)庫(kù)收到 push 或者其他命令時(shí)氓拼,會(huì)自動(dòng)調(diào)我們的鉤子程序(其實(shí)就是向我們指定的地址發(fā)送一個(gè) post 請(qǐng)求),而我們只需要讓我們的這個(gè)程序去跟新下服務(wù)器上面的代碼(html 文件)即可抵碟。

流程示例圖見下圖:

流程示例圖

從上面可以出桃漾,我們只剩 2 件事需要做,一是配置下 github 的 webhook拟逮,二是在我們的服務(wù)器上寫一個(gè) web 程序來處理 github 發(fā)送過來的請(qǐng)求撬统。

1、webhook 配置

配置比較簡(jiǎn)單敦迄,需要注意的是恋追,秘鑰雖然是非必填的,但是最好還是加上罚屋,為了安全苦囱。


webhook 配置

請(qǐng)求的數(shù)據(jù),每個(gè)平臺(tái)都不一樣脾猛,在此以 github 為例撕彤,數(shù)據(jù)內(nèi)容見下圖:
注:請(qǐng)求頭中有一個(gè)很重要的簽名參數(shù),該參數(shù)前部分為加密方式猛拴,后部分為的簽名羹铅,而明文就是我們?cè)?webhook 中配置的秘鑰。這點(diǎn)很重要哦愉昆。

webhook 請(qǐng)求示例圖

2职员、程序編寫

寫一個(gè)簡(jiǎn)單是 web 程序。

本人主要是編寫 java 代碼的跛溉,如果要用 java 來寫的話焊切,比較麻煩,所以考慮選擇一款解釋性語言來編寫倒谷,其實(shí)用啥語言都無所謂啦蛛蒙,畢竟代碼處理邏輯很簡(jiǎn)單,選用自己熟悉的就行渤愁,例如 Python牵祟、PHP、nodejs 等都行抖格。

此處選擇的是使用 Python 來編寫诺苹,web 框架是比較輕量的 Flask咕晋,操作 git 使用的是 gitPython,所以需要安裝下:

pip install flask
pip install gitpython

代碼比較簡(jiǎn)單收奔,不多贅述掌呜,主要就是兩點(diǎn):

1、簽名校驗(yàn)
2坪哄、git update

詳細(xì)代碼如下:


from flask import Flask, request, Blueprint, jsonify, current_app
from git import Repo
import hmac

app = Flask(__name__)

@app.route("/api/github_hook", methods=['POST'])
def github_web_hook():

    header_signature_origin = request.headers.get('X-Hub-Signature')
    if header_signature_origin is None:
        return '你沒有權(quán)限訪問质蕉!'
        
    hash_type, header_signature = header_signature_origin.split('=')
    if hash_type != 'sha1':
        return '不支持的加密方式!'
        
    secret = str.encode("http://www.jetchen.cn")
    
    hashhex = hmac.new(secret, request.data, digestmod='sha1').hexdigest()
    if hmac.compare_digest(hashhex, header_signature):
        repo = Repo('/data/blog-test/blog.github.io/') # 獲取本地git倉(cāng)庫(kù)
        # repo = Repo('D:\project\mixed\\blog.github.io\\') # 獲取本地git倉(cāng)庫(kù)
        # origin = repo.remotes.origin # 獲取遠(yuǎn)程庫(kù) & 遠(yuǎn)程分支
        # origin.pull('--rebase') # 拉代碼
        remote = repo.remote()
        remote.pull('master')
        
        if 'after' in request.json:
            commit = request.json['after'][0:6] # pull 的最新的commit
            print('Repository updated with commit {}'.format(commit))
            
    else:
        return '簽名校驗(yàn)失旚婕 模暗!'
        
    return jsonify({}), 200
    
if __name__ == "__main__":
    app.run(port=8001)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市念祭,隨后出現(xiàn)的幾起案子兑宇,更是在濱河造成了極大的恐慌,老刑警劉巖粱坤,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隶糕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡站玄,警方通過查閱死者的電腦和手機(jī)枚驻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來株旷,“玉大人测秸,你說我怎么就攤上這事≡殖#” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵铃拇,是天一觀的道長(zhǎng)钞瀑。 經(jīng)常有香客問我,道長(zhǎng)慷荔,這世上最難降的妖魔是什么雕什? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮显晶,結(jié)果婚禮上贷岸,老公的妹妹穿的比我還像新娘。我一直安慰自己磷雇,他們只是感情好偿警,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般鞍泉。 火紅的嫁衣襯著肌膚如雪虏肾。 梳的紋絲不亂的頭發(fā)上臀晃,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天盆色,我揣著相機(jī)與錄音鹅士,去河邊找鬼扼鞋。 笑死蟹演,一個(gè)胖子當(dāng)著我的面吹牛诵原,可吹牛的內(nèi)容都是我干的英妓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼绍赛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔓纠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惹资,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤贺纲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后褪测,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猴誊,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年侮措,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懈叹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡分扎,死狀恐怖澄成,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畏吓,我是刑警寧澤墨状,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站菲饼,受9級(jí)特大地震影響肾砂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宏悦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一镐确、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饼煞,春花似錦源葫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芭届,卻和暖如春储矩,著一層夾襖步出監(jiān)牢的瞬間感耙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工持隧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留即硼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓屡拨,卻偏偏與公主長(zhǎng)得像只酥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呀狼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容