GithubのWebhookを使用して、本番環境へのデプロイを試した件

本番環境へのデプロイに関して、

自分なりに試そうとする中で、

色々と、

見返して再確認することがあると思うので、

調査した時の内容や、

実際に試したことをメモ。

試すことになった経緯

GitHubのWebhookを試そうと思ったのは、

  • 80ポート、443ポートを開放している環境
  • 80ポート、443ポートを開放していない環境

の2つに分けて、

それぞれ、

どのような方法が良いかなと考えて、

GitHubのWebhookを試してみようとなった。

その検討時のメモは、

以下のメモ記事を参照。

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の公式

上記の中で、

自分なりにあまり使わない用語なのでメモ。

ポーリングする (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 URLhttps://〜の先ほどの常駐アプリの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アプリ側に認証情報を渡すことや、

パスフレーズ省略を試していたが、

うまくこの点を解消できず。

パスフレーズなしなどは、

個人的には、セキュリティ面の上でないかなと思うので、

この点は引き続き、調査を続ける。

もしわかったら、

別の記事にメモ残すかも。

ピックアップ

こちらもおすすめ

初心者向けの色々な情報はあるけれど、

  • 無料でお試しができるスクール
  • ホームページなど簡単に作成できる
  • 組織で使いたいサービス

について、

少しでも試して良いものがあると、

それを活用することで学習や業務などが効率化できるので、

おすすめのサイトなどをいくつか紹介しておきます

おすすめ書籍

コメント一覧

コメントはまだありません。

コメント送信

コメントを残す

広告

おすすめ記事