如何用Github鉤子做自動部署

  • 2020 年 4 月 26 日
  • 筆記

最近機緣巧合的購置了域名和伺服器,不用實在是浪費,再加上一直沒有屬於自己的個人網站,所以打算用hexo在伺服器上玩一下,這樣也就不用再糾結用Github pages還是Gitee pages了。當然,今天的主題並不是部落格搭建,而是如何利用Github的鉤子,將部落格程式碼部署到伺服器上。

畢竟Github的鉤子已經歷史悠久了,網上有很多開源項目可以拿來用,所以我並沒有造輪子,而是去找了5K star的開源Go項目webhook,這個工具的作用是接收Github倉庫的變動通知,然後調用你配置好的shell腳本,腳本可以寫上程式碼拉取的命令或是編譯的操作等,具體根據個人需求而定。簡而言之,它只起著拉通Github與你伺服器的作用。

file

webhook工具安裝

因為webhook是Go語言開發的,所以要先安裝Go語言。

yum install -y golang

然後就可以用go命令安裝webhook了。

go get github.com/adnanh/webhook

命令安裝位置可以通過go env查看,GOPATH就是命令安裝路徑,比如我的命令就安裝在/root/go/bin/webhook。

go env
...
GOOS="linux"
GOPATH="/root/go"
...

生成ssh key

在編寫腳本之前確保伺服器有許可權拉取github程式碼,如果已經做了配置可跳過本節去看部署腳本編寫。ssh key是程式碼託管平台(github、gitee、coding、gitlab等)鑒別你是否有權拉取程式碼的身份標識,生成只需一行命令和一路回車就行了。

ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:M6sCf/J/hOu3zLxMkFUVmv3iWIa30CfbxiWqmWCt1YE root@iZwz96y36tk2ecnykzituxZ
The key's randomart image is:
+---[RSA 2048]----+
|            ..o. |
|           . o   |
|          . o    |
|       . o .     |
|      E S.  .    |
|  .  . ..Oo ..   |
|   oo o ==Boo .  |
|   .++.+o#== .   |
|    .=*+=+@o     |
+----[SHA256]-----+

生成後可通過cat ~/.ssh/id_rsa.pub命令查看,最後將key加入github即可,加法不再贅述,請自行Google。

cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQHBAAABAQCv7LGVJUFdcLL+HZyRFTQIQCdre61Gch76lDVpmWSX9BGGRU3iQS7EU5qApFn1VSvt+yf4rMt2LEkuxGCm1wIyBKZ6LYDViZBeTAfx4BcM1mcpxOX6I/+r07mQ4llTz+poQB1Zp9Y60uk0tbGOVWlCoDBEvf9qeEnQ0qEczEkv7wcawV6pVhlXjFKZgq0EOQbCYoWMvPUl+dwDbTcl/h+7At1nlgfF7IuRHlKf18qvgnTRT2wpiuz4pWdoAi8LcY1JiR1z5OB0oCJ2euhyDND39G2NxZRS1FIVdgCEvioHtdoHOSoWBlcSj0fLFSnscBfRBrCd7yhOP7fFKfrowHMj root@iZwz96y36tk2ecnykzituxZ

部署腳本編寫

該shell腳本的主要目的是從github拉取程式碼,腳本內容很簡單,只做了目錄的簡要判斷,程式碼目錄存在則更新,不存在則克隆倉庫,工作目錄和倉庫名稱、地址請換成自己的。

#!/bin/bash

cd /home/www/website

if [ ! -d "go-home" ]; then
  git clone //github.com/pingyeaa/go-home.git
fi

cd go-home
git pull

webhook配置與啟動

編寫配置文件hooks.json,格式如下。

[
  {
    "id": "deploy-webhook",
    "execute-command": "deploy.sh",
    "command-working-directory": "/home"
  }
]
  • id:鉤子的id,可自定義
  • execute-command:要執行的腳本名,就是剛才編寫的部署腳本
  • command-working-directory:腳本所在目錄

完成後通過webhook命令啟動,可以看到id為deploy-webhook的配置已經載入了,我們需要注意的是監聽的埠和路徑,等下要用到。

/root/go/bin/webhook -hooks hooks.json -verbose

[webhook] 2020/04/22 15:18:22 version 2.6.11 starting
[webhook] 2020/04/22 15:18:22 setting up os signal watcher
[webhook] 2020/04/22 15:18:22 attempting to load hooks from hooks.json
[webhook] 2020/04/22 15:18:22 found 1 hook(s) in file
[webhook] 2020/04/22 15:18:22   loaded: deploy-webhook
[webhook] 2020/04/22 15:18:22 serving hooks on //0.0.0.0:9000/hooks/{id}
[webhook] 2020/04/22 15:18:22 os signal watcher ready
//0.0.0.0:9000/hooks/{id}

Github Webhooks配置

現在伺服器已經啟動了webhook程式監聽9000埠,接下來僅需要告訴Github這個地址和埠就好了。

打開倉庫設置頁,添加webhook。

配置webhooks,Payload URL就是要通知的地址,把剛才列印出的埠和路徑填上即可,其他默認。

file

現在可以提交程式碼測試了,如果推送失敗Github中會有錯誤提示,同樣的,成功不僅在Github中能看到,伺服器的列印日誌也有記錄。

file

file


我是平也,這有一個專註Gopher技術成長的開源項目「go home」


感謝大家的觀看,如果覺得文章對你有所幫助,歡迎關注公眾號「平也」,聚焦Go語言與技術原理。
關注我