GitHubにpushがあったら,自動でpullする環境(on Plesk)のメモ

Pleskでサブドメイン内にpull専repoを作って,テスト環境を最新に保つ

やりたいことは,GitHubのリポジトリにpushがあったら,plesk内のサブドメイン下にある環境のリポジトリを自動でpullさせて,常に最新の開発版と同等の状態に保たせること.

  1. GitHubにpush
  2. GitHubからPost-Receive Hooksが飛ぶ
  3. Postを受けて自動でpull
  4. 自動で最新になる

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");

ログとかは適当にとる.

なんとなくできた

なんだか乱暴な気がする設定だが・・・がくり.とりあえず.とりあえず.