XREAサーバーに自動デプロイ

gitHubにpushしたら自動でサーバーにデプロイされるようにする

  • サーバー:XREA(無料プラン)

ローカル環境

  • apacheインストール済
$ which apachectl
/usr/local/bin/apachectl
$ vim /usr/local/etc/apache2/2.4/httpd.conf

# ドキュメントルートの設定
DocumentRoot "/usr/local/var/www/htdocs"
#  index.phpを利用できるように設定
DirectoryIndex index.php index.html
  • ブラウザからアクセスできることを確認する

XREAにsshできるようにして公開鍵を置いてくる

管理メニュー→ホスト情報登録→SSH登録
これでローカルPCからsshできるようになる。

# 公開鍵をXREAサーバーに配置する
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@[XREAサーバー名]:.
# 配置されていることを確認
$ ssh [ユーザー名]@[XREAサーバー名]
$ ls -la
id_rsa.pub
# authorized_keysに追加する
-bash-4.2$ mkdir .ssh
-bash-4.2$ chmod 700 .ssh
-bash-4.2$ mv id_rsa.pub ./.ssh/.
-bash-4.2$ cd .ssh/
-bash-4.2$ cat ./id_rsa.pub >> authorized_keys
-bash-4.2$ chmod 600 authorized_keys
-bash-4.2$ exit
# 接続確認
$ ssh [ユーザー名]@[XREAサーバー名]
# サーバー名、ユーザー名、パスワードはXREAの管理メニュー→FTP設定に書いてある

デプロイスクリプト

deploy.php
XREAサーバーに置く

<?php
require_once(dirname ( __FILE__ ).'/../cfg.php');

$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = $MY_SECRET_KEY;
$POST_DATA = file_get_contents("php://input");
$hmac = hash_hmac('sha1', $POST_DATA, $SECRET_KEY);
$signature = substr($_SERVER['HTTP_X_HUB_SIGNATURE'], 5);
if ( $signature == $hmac  ) {
    $payload = json_decode($POST_DATA, true);
    exec('cd htdocs ; git pull 2>&1');
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['after']." ".$payload['commits'][0]['message']."\n", FILE_APPEND|LOCK_EX);
} else {
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}

XREAサーバー側であらかじめ対象のリポジトリをgit clone しておく…

gitHubのWebhooksを使う

リポジトリ→Settings→WebhooksからPayload URLとSecretを設定する。

残り作業

ローカルで開発を行っているhtdocsディレクトリをそのままgitHubリポジトリにしていたが、
これをpullするとやはりhtdocsのまま。
XREAはpublic_htmlというディレクトリにアップロードしたものが公開される仕様のため、
XREAサーバーのhtdocs配下にpull してきてからpublic_htmlにmvかcpするスクリプト作る。