GitHub Webhooks をつかて push したらデプロイ

以前の記事でgit の hooks を使って push したらWebサーバにデプロイする環境を構築してみたがやっぱり push 先が2つになるのはめんどくさいので GitHub に push したらWebサーバにもデプロイされるようにしたい。

  • リポジトリはプライベート
  • Webhook でデプロイ先のURLへアクセス
  • URLにアクセスされたら、git pull を実行

という単純なものにするのでセキュリティなどは考慮しない。

ただこの場合 apache の権限で git pull されることになるので、Webページのファイル、ディレクトリ権限が apache で読み書きできるものになる。

apache へ ssh キーの設定

/etc/passwd ファイルを確認して apache のホームディレクトリを探し、そこに .ssh ディレクトリを作成して、鍵ファイルを作成する。

# cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
# cd /usr/share/httpd/
# mkdir .ssh
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /usr/share/httpd/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /usr/share/httpd/.ssh/id_rsa.
Your public key has been saved in /usr/share/httpd/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wa8n56*************************lC3oon9kGD8 root@example.com
The key's randomart image is:
+---[RSA 3072]----+
|        .+o      |
|       . .o      |
|   . . .o+.o     |
|. . * . *o+.     |
|.= = = =Soo      |
|o = B E .. .     |
| . * B oo + o    |
|  o   .  * +..   |
|   ...    +o.    |
+----[SHA256]-----+
# chown -R apache:apache /usr/share/httpd/.ssh
# chmod -R 700 /usr/share/httpd/.ssh
# cat /usr/share/httpd/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAA(略)GWVQM9fcb0VXJhTM= root@example.com
#

鍵ファイルを作成したら公開鍵をコピーして、GitHub のアカウントから「Settings」を開き、「SSH and GPG keys」の「SSH Keys」の「New SSH Key」ボタンを押す。

SSH Keyの登録画面になるので、「Title」に識別しやすい名前をつけて、先ほど作成した id_rsa.pub の中身を「Key」貼り付けて、「Add SSH Key」をクリックする。

これでこの現在のアカウントに新しい SSH Key が登録される。

更新用URLの作成

ごく簡単なphpスクリプトで更新用のphpファイルを作成する。

アクセスされても更新されるだけのURL

<?php
system('cd /path/to/web_directory');
system('git pull origin master');

作成した php ファイルの URL にアクセスして、「Already up to date.」とかのメッセージが表示されていることを確認する。

Webhooks の設定

GitHub の資料がわかりやすい。

Webhooks を設定したいリポジトリを開いて、リポジトリの「Settigs」を開き、「Webhooks」を開く。

「Add Webhook」ボタンをクリックして、「Payload URL」に先ほど作成した更新用のURLを貼り付ける。

特にデータのやり取りなどがあるわけでもないのでその他の場所はそのままにして「Add webhook」で作成する。

確認

以上でできたはずなので動作確認。

webhook を設定する前に更新用URLを開いてページが更新されることを確認しておけば確実。

あとは GitHub に push すれば自動的に更新される。