GitHub Webhookを活用した自動デプロイツールの紹介

最近、ブログを書くのが面倒だと話している人がいて、その内容を聞いて自分も以前やっていたことを思い出しました。彼が述べた点から、自分の使っている小道具を整理して共有しようと思いました。

このプロジェクトは、Goで作られた軽量なGitHub Webhookリスナーで、コードをプッシュした後に自動的にデプロイをトリガーします。

Webhookとは何か

Webhookは、GitHubが特定のアクションが発生した際に指定されたURLにネットワーク通知を送る仕組みです。一般的なイベントにはpushpull_requestreleaseなどがあります。これらの通知を受け取った後、イベントタイプに応じて処理を行うことができます。例えば、コードの自動デプロイ、テストの実行、ドキュメントの更新などが可能です。

Webhookの設定は簡単です。GitHubのリポジトリ内でSettings → Webhooks → Add webhookを選択し、サーバーのアドレスとシークレットを入力します。監視したいイベントを選択すれば、GitHubがそれらのイベント発生時にPOSTリクエストを送信します。受け取ったリクエストを検証し、対応する操作を実行すれば完了です。

私は以前、ある動作中のサービスにWebhookを置きっぱなしにしていました。そのため、一度もちゃんと考え直すことはありませんでした。しかし、Webhookの本質は単純で、必要なのはリクエストを受け取るためのインターフェースだけです。

なぜGoを選んだのか

Goはこのようなツールに最適です:

  • ビルド後のファイルは1つの実行可能ファイルであり、サーバーに直接配置して実行できます。
  • 実行時のオーバーヘッドが少なく、起動が速いため、長期的なリスニングに適しています。
  • コードが簡潔で、HTTPリクエストの解析、署名の検証、イベントおよびブランチのマッチング、コマンドの実行といったロジックが簡単に記述できます。

そこで、このツールを整理することにしました。ただ一つの設定ファイルがあれば、バイナリファイルは動作します。

設定例

設定ファイルの構造は以下の通りです:

repositories:
  'zxc7563598/astro-theme-pure': # リポジトリ名
    secret: 'xxxxxx' # GitHub Webhookシークレット
    rules:
      - event: 'push'
        branches: ['main']
        actions:
          - type: 'shell'
            command: 'sh ./scripts/astro-theme-pure.sh'

プログラムは指定されたポートでリクエストを待ち受けます。イベントが発生すると、ブランチとイベントタイプをチェックし、一致すれば設定されたシェルスクリプトを実行します。

この例では、zxc7563598/astro-theme-pureリポジトリのmainブランチにpushが発生した場合、sh ./scripts/astro-theme-pure.shが実行されます。

これにより、コードを書くだけで、デプロイプロセスが自動化されます。

私のデプロイスクリプト

私のブログのデプロイスクリプトは以下の通りです:

#!/bin/bash
set -e
PROJECT_DIR="/opt/astro-blog"
GIT="/usr/bin/git"
BUN="/usr/bin/bun"
PM2="/usr/bin/pm2"
export HOME="/root"
export PM2_HOME="/root/.pm2"

log() {
    echo "[deploy] $1"
}
log "========================================"
log "Astro Blogのデプロイを開始"
log "時間: $(date)"
log "========================================"
cd "$PROJECT_DIR" || { log "プロジェクトディレクトリに移動できませんでした"; exit 1; }
log "最新のコードを取得中..."
$GIT fetch origin
$GIT reset --hard origin/main
log "依存関係のインストール(Bun)..."
$BUN install
log "Astroプロジェクトのビルド..."
$BUN run build
log "PM2のプロセスを再起動..."
$PM2 restart "$PROJECT_DIR/ecosystem.config.cjs"
log "PM2の状態:"
$PM2 list || true
log "デプロイ完了"
log "時間: $(date)"
log "========================================"


このプロセスにより、私はコードを書くだけです。エディタで編集してpushすると、サーバーが自動的に取得、ビルド、再起動を行います。ほとんど手をかけなくても済みます。

試してみたい場合は

このプロジェクトはGitHubに公開されています:github-webhook-listener。軽量で柔軟性があり、導入も簡単です。自動デプロイを希望する場合は、READMEを参照するか、releasesから直接ダウンロードして使ってみてください。

タグ: Go Webhook CI/CD Deployment Astro

8月9日 12:12 投稿