前書き

複数の開発者がいるプロジェクトで作業する場合、ある人がリポジトリにプッシュし、別の人が古いバージョンのコードに変更を加え始めるとイライラすることがあります。 このような間違いは時間がかかるため、リポジトリを同期させるスクリプトを設定する価値があります。 本番環境でこのメソッドを適用して、修正プログラムやその他の変更をすばやくプッシュすることもできます。

この特定のタスクを完了する他のソリューションが存在しますが、独自のスクリプトを作成することは、将来のカスタマイズの余地を残す柔軟なオプションです。

https://github.com [GitHub]では、リポジトリのhttps://developer.github.com/webhooks/[webhooks]を設定できます。リポジトリは、イベントが発生したときにHTTPリクエストを送信するイベントです。 たとえば、誰かがプルリクエストを作成するか、新しいコードをプッシュすると、Webhookを使用して通知できます。

このガイドでは、あなたまたは誰かがコードをGitHubにプッシュするたびにGitHub webhook通知をリッスンするhttps://nodejs.org/[Node.js]サーバーを開発します。 このスクリプトは、リモートサーバー上のリポジトリを最新バージョンのコードで自動的に更新するため、新しいコミットを取得するためにサーバーにログインする必要がなくなります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1-Webhookのセットアップ

まず、リポジトリのwebhookを構成します。 このステップが重要なのは、それがないと、Githubは、事態が発生したときにどのイベントを送信するのか、またはどこに送信するのかを知らないからです。 最初にwebhookを作成し、次にリクエストに応答するサーバーを作成します。

GitHubアカウントにサインインし、監視するリポジトリに移動します。 リポジトリのページのトップメニューバーにある[設定]タブをクリックし、左側のナビゲーションメニューの[Webhooks]をクリックします。 右隅の[* Webhookの追加*]をクリックし、プロンプトが表示されたらアカウントパスワードを入力します。 次のようなページが表示されます。

image:https://assets.digitalocean.com/articles/node_webhook_sync_1604/ZLBHSjF.png [Webhooks Page]

  • [*ペイロードURL *]フィールドに、「+ http://:8080+」と入力します。 これは、まもなく作成するNode.jsサーバーのアドレスとポートです。

  • *コンテンツタイプ*を `+ application / json`に変更します。 作成するスクリプトはJSONデータを想定しているため、他のデータタイプを理解することはできません。

  • * Secret *には、このWebhookのシークレットパスワードを入力します。 Node.jsサーバーでこのシークレットを使用して、要求を検証し、GitHubからのものであることを確認します。

  • *このWebhookをトリガーするイベントを選択するには、*プッシュイベントのみ*を選択します。 コードが更新され、サーバーに同期する必要があるため、プッシュイベントのみが必要です。

  • *アクティブ*チェックボックスを選択します。

  • フィールドを確認し、[* Webhookを追加*]をクリックして作成します。

pingは最初は失敗しますが、Webhookが設定されたことを確認してください。 次に、サーバーにクローンを作成します。

手順2-サーバーへのリポジトリの複製

このスクリプトはリポジトリを更新できますが、リポジトリを最初に設定することはできないため、ここでそれを行います。 サーバーにログインします。

ssh @

ホームディレクトリにいることを確認してください。 次に、Gitを使用してリポジトリを複製します。 `+ sammy `をGitHubユーザー名に、 ` hello_hapi +`をGithubプロジェクトの名前に置き換えてください。

cd
git clone https://github.com//.git

これにより、プロジェクトを含む新しいディレクトリが作成されます。 次の手順でこのディレクトリを使用します。

プロジェクトのクローンを作成したら、webhookスクリプトを作成できます。

ステップ3-Webhookスクリプトの作成

GitHubからのWebhookリクエストをリッスンするサーバーを作成しましょう。 ポート `+ 8080 +`でWebサーバーを起動するNode.jsスクリプトを作成します。 サーバーはwebhookからのリクエストをリッスンし、指定したシークレットを確認し、GitHubから最新バージョンのコードを取得します。

ホームディレクトリに移動します。

cd ~

`+ NodeWebhooks +`というwebhookスクリプト用の新しいディレクトリを作成します。

mkdir ~/NodeWebhooks

次に、新しいディレクトリに移動します。

cd ~/NodeWebhooks

`+ NodeWebhooks `ディレクトリ内に ` webhook.js +`という新しいファイルを作成します。

nano webhook.js

次の2行をスクリプトに追加します。

webhook.js

var secret = "";
var repo = "";

最初の行は、ステップ1で作成したシークレットを保持する変数を定義し、GitHubからのリクエストであることを確認します。 2行目は、ローカルディスクで更新するリポジトリへのフルパスを保持する変数を定義します。 これは、ステップ2でチェックアウトしたリポジトリを指している必要があります。

次に、スクリプトに + http`および + crypto`ライブラリをインポートするこれらの行を追加します。 これらを使用してWebサーバーを作成し、秘密をハッシュして、GitHubから受け取ったものと比較できるようにします。

webhook.js

let http = require('http');
let crypto = require('crypto');

次に、スクリプトからシェルコマンドを実行できるように、 `+ child_process +`ライブラリをインクルードします。

webhook.js

const exec = require('child_process').exec;

次に、このコードを追加して、GitHub webhookリクエストを処理し、それが本物のリクエストである場合に新しいバージョンのコードを取得する新しいWebサーバーを定義します。

webhook.js

http.createServer(function (req, res) {
   req.on('data', function(chunk) {
       let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');

       if (req.headers['x-hub-signature'] == sig) {
           exec('cd ' + repo + ' && git pull');
       }
   });

   res.end();
}).listen(8080);

`+ http.createServer()`関数は、Githubからの着信リクエストをリッスンするポート ` 8080 `でWebサーバーを起動します。 セキュリティのために、リクエストに含まれるシークレットがステップ1でwebhookを作成するときに指定したものと一致することを検証します。 シークレットはSHA1ハッシュ文字列として ` x-hub-signature`ヘッダーで渡されるため、シークレットをハッシュし、GitHubが送信するものと比較します。

リクエストが本物であれば、シェルコマンドを実行して、 `+ git pull +`を使用してローカルリポジトリを更新します。

完成したスクリプトは次のようになります。

webhook.js

const secret = "";
const repo = "";

const http = require('http');
const crypto = require('crypto');
const exec = require('child_process').exec;

http.createServer(function (req, res) {
   req.on('data', function(chunk) {
       let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');

       if (req.headers['x-hub-signature'] == sig) {
           exec('cd ' + repo + ' && git pull');
       }
   });

   res.end();
}).listen(8080);

最初のサーバーセットアップガイドに従った場合、ポート `+ 8080 +`のトラフィックを許可することにより、このWebサーバーが外部Webと通信できるようにする必要があります。

sudo ufw allow 8080/tcp

スクリプトが準備できたので、スクリプトが適切に機能することを確認しましょう。

ステップ4-Webhookのテスト

コマンドラインで「+ node +」を使用して実行することにより、webhookをテストできます。 スクリプトを開始し、ターミナルでプロセスを開いたままにします。

cd ~/NodeWebhooks
nodejs webhook.js

https://github.com [Github.com]のプロジェクトのページに戻ります。 リポジトリのページのトップメニューバーにある[設定]タブをクリックし、左側のナビゲーションメニューにある[Webhooks]をクリックします。 手順1で設定したウェブフックの横にある[編集]をクリックします。 次の図に示すように、* Recent Deliveries *セクションが表示されるまで下にスクロールします。

画像:https://assets.digitalocean.com/articles/node_webhook_sync_1604/oniwqcg.png [Webhookの編集]

右端の3つのドットを押して、[再配信]ボタンを表示します。 ノードサーバーを実行した状態で、[再配信]をクリックして、リクエストを再度送信します。 リクエストを送信することを確認すると、成功したレスポンスが表示されます。 これは、pingを再配信した後、「+ 200 OK +」応答コードで示されます。

これで、スクリプトをバックグラウンドで実行し、ブート時に開始することを確認できます。 `+ CTRL + C +`を使用すると、ノードのwebhookサーバーが停止します。

ステップ5-WebhookをSystemdサービスとしてインストールする

systemdは、Ubuntuがサービスを制御するために使用するタスクマネージャーです。 ブート時にwebhookスクリプトを開始し、systemdコマンドを使用して他のサービスと同様に管理できるサービスを設定します。

新しいサービスファイルを作成することから始めます。

sudo nano /etc/systemd/system/webhook.service

systemdにスクリプトの実行方法を指示する次の構成をサービスファイルに追加します。 これはSystemdにノードスクリプトの場所を伝え、サービスを説明します。

`+ sammy +`をユーザー名に置き換えてください。

/etc/systemd/system/webhook.service

[Unit]
Description=Github webhook
After=network.target

[Service]
Environment=NODE_PORT=
Type=simple
User=
ExecStart=/usr/bin/nodejs /home//NodeWebhooks/webhook.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

システムの起動時に開始されるように、新しいサービスを有効にします。

sudo systemctl enable webhook.service

次に、サービスを開始します。

sudo systemctl start webhook

サービスが開始されていることを確認します。

sudo systemctl status webhook

サービスがアクティブであることを示す次の出力が表示されます。

Output● webhook.service - Github webhook
  Loaded: loaded (/etc/systemd/system/webhook.service; enabled; vendor preset: enabled)
  Active:  (running) since Fri 2018-08-17 19:28:41 UTC; 6s ago
Main PID: 9912 (nodejs)
   Tasks: 6
  Memory: 7.6M
     CPU: 95ms
  CGroup: /system.slice/webhook.service
          └─9912 /usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js

これで、新しいコミットをリポジトリにプッシュし、サーバー上の変更を確認できます。

デスクトップマシンから、リポジトリのクローンを作成します。

git clone https://github.com//.git

リポジトリ内のファイルの1つを変更します。 次に、ファイルをコミットし、コードをGitHubにプッシュします。

git add
git commit -m ""
git push origin master

Webhookが起動し、変更がサーバーに表示されます。

結論

新しいコミットをリモートリポジトリに自動的にデプロイするNode.jsスクリプトをセットアップしました。 このプロセスを使用して、監視する追加のリポジトリを設定できます。 リポジトリーをプッシュするときにWebサイトまたはアプリケーションを実動にデプロイするように構成することもできます。