GitHubにpushがあったら,自動でpullする環境(on Plesk)のメモ
Posted: Updated:
Pleskでサブドメイン内にpull専repoを作って,テスト環境を最新に保つ
やりたいことは,GitHubのリポジトリにpushがあったら,plesk内のサブドメイン下にある環境のリポジトリを自動でpullさせて,常に最新の開発版と同等の状態に保たせること.
- GitHubにpush
- GitHubからPost-Receive Hooksが飛ぶ
- Postを受けて自動でpull
- 自動で最新になる
GitHubのPost-Receive Hooksから自動でpullをさせる部分は後半からなので,Plesk云々の前半部は読み飛ばしていただきたく.
リモートからclone
まずはcloneしてチェックアウト.親のドメインをmydomain、サブドメインをnightly、ターゲットブランチはdevelop/xxxとしている.
% pwd
/var/www/vhosts/mydomain/subdomains/nightly/
% git clone git@github.com:organize/product.git repo
Cloning into 'repo'….
% git checkout --track origin/develop/xxx
Branch develop/xxx set up to track remote branch develop/xxx from origin.
Switched to as new branch 'develop/xxx'
別にnightly buildってわけではなかったが,カッコよかったのでつい・・・.クローン先は,httpdocsと並列な場所にrepoとしてディレクトリを作成した.
今思うとhttpdocsの中に入れておけば,後述のopen_basedirの問題もなかったし,アクセス制限かけるんだしめんどくさいことしちゃった感じ
シンボリックリンク
片っ端からhttpdocs内にシンボリックリンクをうまい具合に作成.
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/index.php ~/subdomains/nightly/httpdocs/index.php
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/index.js ~/subdomains/nightly/httpdocs/index.js
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/php ~/subdomains/nightly/httpdocs/php
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/js ~/subdomains/nightly/httpdocs/js
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/private ~/subdomains/nightly/httpdocs/private
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/images ~/subdomains/nightly/httpdocs/images
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/themes ~/subdomains/nightly/httpdocs/themes
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/setup ~/subdomains/nightly/httpdocs/maintenance
% ln -s /var/www/vhosts/mydomain/subdomains/nightly/repo/htaccess.txt ~/subdomains/nightly/httpdocs/.httaccess
設定ファイルやアセット保管用ディレクトリなどは,httpdocsの中に別途作成して実体を据える.
open_basedirに引っかかるので設定を変更
このままだと,PHP Warning: Unknown: open_basedir restriction in effect. File(…) is not within the allowed path(s)と怒られる.これはpleskの生成する~/conf/httpd.includeに含まれるbasedirに関する設定のため.
今回はアレでソレなので,basedirの位置をhttpdocsより1階層引き上げることにする.
vhost.confの作成
/var/www/vhosts/mydomain/subdomains/nightly/conf/vhost.confを下記のように記述する.
<Directory /var/www/vhosts/mydomain/subdomains/nightly/httpdocs>
<IfModule sapi_apache2.c>
php_admin_value open_basedir "/var/www/vhosts/mydomain/subdomains/nightly:/tmp"
</IfModule>
<IfModule mod_php5.c>
php_admin_value open_basedir "/var/www/vhosts/mydomain/subdomains/nightly:/tmp"
</IfModule>
Options FollowSymLinks
</Directory>
先人の知恵でconfを再生成
% /usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=<domain_name>
これを叩くと,/var/www/vhosts/mydomain/conf/httpd.includeの,nightlyサブドメインのVirtualHostに下記のようなIncludeが追記される.
Inclide /var/www/vhosts/mydomain/subdomains/nightly/conf/vhost.conf
たぶんPleskのブラウザGUIから適当に設定を保存しても作られる気がする・・・.
httpdをrestartして反映させる.
$ /etc/init.d/httpd restart
apacheがgitを操作できるようにする
php - shell_exec and git pull - Stack Overflowを参考に設定する.今回はとりあえず,apahceユーザ自体に公開鍵を持たせる方針でいく.
以下はpleskでの話なので,環境に合わせてうまく適用する.
グループを作成
gitwritersグループを作り,通常ユーザとapacheを追加する.apacheが元々属していたグループを加えるのを忘れないように.
% groupadd gitwriters
% usermod -G gitwriters <username>
% usermod -G gitwriters,apache,psaserv apache
% tail -1 /etc/group
gitwriters:x:2525:<username>,apache
リポジトリをgitwritersグループで操作できるようにする.
%chgrp -R gitwriters /var/www/vhosts/mydomain/subdomains/nightly/repo
%chmod -R g+rw /var/www/vhosts/mydomain/subdomains/nightly/repo
%find /var/www/vhosts/mydomain/subdomains/nightly/repo -type d -print0 | xargs -0 chmod g+s
rootで.sshを作ってあげる
$ mkdir /var/www/.ssh
$ chown apache /var/www/.ssh
一時的に通常ユーザからapache名目で操作できるように変更
下の作業が終わったらvisudoの作業は戻します.
$ visudo
apache ALL=(<username>) NOPASSWD: ALL
apache名目で公開鍵を作成〜1度pull(known_hostsとかの確認を済ませる)
% sudo -u apache ssh-keygen -t rsa
% cd /var/www/vhosts/mydomain/subdomains/nightly/repo
% sudo -u apache git pull
Post-Receive Hooksでphpを叩かせる
こんなphpファイルをgithubのPost-Receive Hooksに叩かせる.
// GitHubからのリクエストのみ応じる
// The Public IP addresses for these hooks are: 207.97.227.253, 50.57.128.197.
if (!in_array($_SERVER['REMOTE_ADDR'], array('207.97.227.253', '50.57.128.197')) ) {
die;
}
chdir('/var/www/vhosts/mydomain/subdomains/nightly/repo');
shell_exec("git pull origin develop/xxx");
ログとかは適当にとる.
なんとなくできた
なんだか乱暴な気がする設定だが・・・がくり.とりあえず.とりあえず.