読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

GitLab + WebHook で自動デプロイ

GitLab と WebHook を使って、 GitLab に push したタイミングで、
自動的にデプロイを行う方法のメモ。


GitHub や、 GitLab などで Web サイトやアプリを管理している時、
いい感じに push したタイミングでサーバーに適用してほしかったりします。
そういうときに、 WebHook を使って、いい感じに自動で更新してもらいます。

とりあえず、 git pull さえ叩ければいいので、簡易的なスクリプトを作りました。

<?php
$KEY = 'xxxxxxxxxxxxxxx';

if(!isset($_GET['key']) || $KEY != $_GET['key']) {
   exit();
}

$push = json_decode(file_get_contents('php://input'), true);

if($push['ref'] != 'refs/heads/master') {
  exit();
}
exec('cd /path/to/repository/ ;  git pull origin master');

exit();

$KEY は、ささやかながら、誰でも叩けてしまうのを対策しています。
(GitHub WebHook には、secret なる項目で、良い感じのものがあるみたい)

こいつを、適当な場所に設置して、 GitLab の WebHook に、 http://example.com/hoge.php?key=xxxxxxxxxxxxxxx とかいう感じで設定すればOKです。

ただ、このままだと無理なので、いろいろ設定していきます。


まず、Web サーバーとして nginx を使っていることを前提としています。
/var/www/.ssh に、キーペアを用意しておきます。

キーペアが用意出来たら、公開鍵を Gitlab に設定し、接続できるか確認します。

$ sudo -u nginx ssh -T git@gitlab.com
Welcome to GitLab, Mikazuki!

接続ができなかった場合は、どこかおかしいので修正しておきます。

接続ができたら、今度はサーバーディレクトリの権限を確認します。

mikazuki@centos6 /srv/ $ ls -l
drwxr-xr-x 8 mikazuki mikazuki 4096 Sep 26 15:44 example.com

こんな感じで、 nginx が所有者になっていない場合はコマンドを叩くと

From gitlab.com:Mikazuki/example.com
 * branch            master     -> FETCH_HEAD
Updating 822fa03..f916a05
error: unable to unlink old 'index.html' (Permission denied)

と言った感じでエラーが出てしまうので、 nginx 所有にします。

$ sudo chown -R nginx:nginx *

これで、更新することができます。