💤

GithubにPushされた時にサーバーが自動でアップデートされるようにする

2022/09/19に公開

アップデートめんどくさい

全てがめんどくさい人間なので、アップデートもめんどくさい。
なので、GithubにPushされたら自動でアップデートしてくれるようにしたい!
やります

つかうもの

webhookをセットアップする

https://github.com/adnanh/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されたときのみ実行できます。

詳細はここここを確認してください。

webhook.json
[
    {
        "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に以下のようなものをおいておきます。

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