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 *
これで、更新することができます。