GithubのWebhookを使用して、本番環境へのデプロイを試した件
本番環境へのデプロイに関して、
自分なりに試そうとする中で、
色々と、
見返して再確認することがあると思うので、
調査した時の内容や、
実際に試したことをメモ。
調べながら、メモしている感じなので、
個人的な見返してどういう経緯だったとかを確認するようなので、
調べる中で気になった関連事項についても個人用に書いているので、
個別に必要な情報は、記事内にもある公式情報を参照してもらえると。
試すことになった経緯
GitHubのWebhookを試そうと思ったのは、
- 80ポート、443ポートを開放している環境
- 80ポート、443ポートを開放していない環境
の2つに分けて、
それぞれ、
どのような方法が良いかなと考えて、
GitHubのWebhookを試してみようとなった。
その検討時のメモは、
以下のメモ記事を参照。
Githubからの本番環境へのデプロイで構成別のプラクティスを考えた件
GitHubのWebhookについて
Webhook自体は、
Slack等を使ったとことがあるが、
公式情報にもあるが、
Webhook を使うと、GitHub で特定のイベントが発生するたびに、
外部の Web サーバーに通知を配信できます
ということ。なるほど。
Webhook を使用すると、ソフトウェア システムで発生するイベントにサブスクライブし、それらのイベントが発生するたびにサーバーに配信されるデータを自動的に受信できます。
Webhook を、API をポーリングする (API を断続的に呼び出す) のではなく、データが発生次第受信します。 Webhook では、Webhook の作成時に 1 度イベントに関与するだけで済みます。
Webhook は、次のようなさまざまなシナリオで使用されます。
- 外部 CI サーバーで CI (継続的インテグレーション) パイプラインをトリガー。 たとえば、コードがブランチにプッシュされたときに Jenkins または CircleCI で CI をトリガーします。
- GitHub のイベントに関する通知をコラボレーション プラットフォームに送信。 たとえば、プル要求に関するレビューがある場合に Discord または Slack に通知を送信します。
- Jira などの外部イシュー トラッカーを更新。
- プロダクション サーバーへのデプロイ。
- GitHub で発生したイベントを監査目的でログに記録。
GitHubの公式
https://docs.github.com/ja/webhooks/about-webhooks
上記の中で、
自分なりにあまり使わない用語なのでメモ。
ポーリングする (API を断続的に呼び出す)
これは、使っていこう。
上記で考えると、
やはり、
通知系イベント発生のために、イベントドリブンという認識。
個人的にちょっと思ったのは、
Webhookとソケットは、
どちらもイベントドリブンの認識だが、
常時かどうかが違うのか?
- Webhook:リクエスト型。イベント発生時に一度だけHTTP送信。軽量・シンプル。
- ソケット(WebSocket等):常時接続。双方向通信が可能。リアルタイム性◎、実装は重め。
ということらしい。
違うのは、
「接続維持の有無」と「通信の方向性」
ということ。
上記を簡潔にいうならば、
- Webhook:イベント時に一方向で通知(接続は都度)
- ソケット:接続維持しながら双方向通信が可能
ということらしい。
なるほど。
Webhookを実際にやっていく上のやること
実際にWebhookを試していくにあたって、
実際にやることを考えたら、
- Webhookを利用した軽量アプリで常駐化
- GitHubでpushした時にWebhookアプリのURL呼び出すように設定
の2つが必要な認識。
これを取り組んでみる。
常駐アプリを作る
Node.jsで作る準備
npm init -y
npm install express
npm install body-parser
コード
const express = require('express');
const bodyParser = require('body-parser');
const { exec } = require('child_process');
const app = express();
app.use(bodyParser.json());
app.post('/webhook', (req, res) => {
console.log('📥 Webhook received:', req.body);
// 任意の処理(例:pull & deploy)
exec('cd /path/to/your/project && git pull', (err, stdout, stderr) => {
if (err) {
console.error('❌ Error:', stderr);
} else {
console.log('✅ Git Pull:', stdout);
}
});
res.sendStatus(200);
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`🚀 Webhook server listening on port ${PORT}`);
});
上記で
node app.js
などで動かす。
これをドメインと紐づけてアクセスできるようにしたら、
アプリ側は準備オッケー。
GitHubのリポジトリにWebhookの設定を追加
GitHubの対象リポジトリで、
上部メニューの「Settings」に移動
左メニューに「Webhook」を選択。
「Add webhook」で追加
設定してみたのは以下。
項目名 | 設定値 |
---|---|
Payload URL | https://〜の先ほどの常駐アプリのURL |
Content Type | 推奨はx-www-form-urlencodedだが、 とりあえず、application/jsonで挙動確認 |
Secret | 未設定 |
Enable SSL Verification | オン |
Which events would you like to trigger this webhook? | Just the push event |
上記をして、
「Add webhook」
こちらで準備完了。
試してたらエラーになった
上記処理で試していたら、
Webhookでアプリにはアクセスあり、
cd /path/to/your/project
は動いたが、
git pull
で、
❌ Git Pull Error: git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
のようにエラー。
パスフレーズ求められているということが原因と考えられる
というところまでは進んだが、
Nodeアプリ側に認証情報を渡すことや、
パスフレーズ省略を試していたが、
うまくこの点を解消できず。
パスフレーズなしなどは、
個人的には、セキュリティ面の上でないかなと思うので、
この点は引き続き、調査を続ける。
もしわかったら、
別の記事にメモ残すかも。
こちらもおすすめ
初心者向けの色々な情報はあるけれど、
- 無料でお試しができるスクール
- ホームページなど簡単に作成できる
- 組織で使いたいサービス
について、
少しでも試して良いものがあると、
それを活用することで学習や業務などが効率化できるので、
おすすめのサイトなどをいくつか紹介しておきます
おすすめ書籍
コメント一覧
コメントはまだありません。
コメントを残す