GithubにPushされた時にサーバーが自動でアップデートされるようにする
アップデートめんどくさい
全てがめんどくさい人間なので、アップデートもめんどくさい。
なので、GithubにPushされたら自動でアップデートしてくれるようにしたい!
やります
つかうもの
- Github Webhook
- webhook
webhookをセットアップする
webhookは、Goで書かれた、Webhookを受け取ってコマンドを実行するツールです。
実行するとHTTPサーバーが立ち上がって、Webhookを受け取ると、設定したコマンドを実行してくれます。
バイナリ1つでjsonを使って挙動を自由に変更できるのでとてもいい感じ™なツールです
Ubuntuであれば、aptでインストールできます。
$ sudo apt install webhook
webhook.jsonを書く
idには適当な名前、
execute-commandには実行したいコマンドを書きます。
pass-arguments-to-commandにはコマンドに渡したい引数を配列で指定できます。
ソースを変更することで、Webhookの中身をコマンドに渡すこともできます。
"pass-arguments-to-command": [
{
"source": "payload",
"name": "ref"
}
]
secretには、Webhookのシークレットを指定します。これは後で使うので取っておいてください。
trigger-ruleでWebhookを実行する条件を指定できます。
以下の例だと、developブランチにPushされたときのみ実行できます。
[
{
"id": "updateHook",
"execute-command": "/var/scripts/update.sh",
"pass-arguments-to-command": [
{
"source": "string",
"name": "1"
},
{
"source": "string",
"name": "2"
},
{
"source": "string",
"name": "3"
}
],
"command-working-directory": "/root",
"trigger-rule": {
"and": [
{
"match": {
"type": "payload-hash-sha256",
"secret": "honihoni",
"parameter": {
"source": "header",
"name": "x-hub-signature-256"
}
}
},
{
"match": {
"type": "value",
"value": "refs/heads/develop",
"parameter": {
"source": "payload",
"name": "ref"
}
}
}
]
}
}
]
GithubのWebhookを設定する
Githubのリポジトリの設定からWebhookを設定します。
Payload URLには、Webhookを受け取るサーバーのURLを指定します。
例: https://hook.example.com/hooks/updateHook
Content typeはjsonにしておきます
Secretに先程指定したシークレットを指定します。
webhookを実行する
webhook -hooks webhook.json -verbose
でサーバーを立ち上げます。
-verbose
をつけると、Webhookを受け取ったときのログが出力されます。
サービスとして実行する
このままではずっとコンソールを開いておかないといけないので、サービスとして実行します。
例として/etc/systemd/system/webhook.service
に以下のようなものをおいておきます。
Description=webhook
[Service]
Type=simple
User=root
ExecStart=webhook -hooks webhook.json -verbose
WorkingDirectory=/root
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=webhook
Restart=always
[Install]
WantedBy=multi-user.target
以下のコマンドを実行すると、サービスとして実行できます。
$ sudo systemctl daemon-reload
$ sudo systemctl enable webhook
$ sudo systemctl start webhook
Discussion