※2017年11月21日に追記しました
GitHubって便利ですよね
現在iOSでの作業環境を作っているところなのですが
「GitHubにPushしたらサーバが自動更新したら超便利じゃね?」
ということで調べてみました
といっても過去に同じものは作ったことあるのですが、Xサーバだとちょっとハマった部分があったのでそこも合わせてご紹介します
下記は準備済みとして進めていきます
- GitHubアカウント
- GitHubにリポジトリ作成済み
- CommitしてPushは出来てる
PHPファイルの準備
こちらを参考に作りました(ファイル名・hook.php)
http://blog.manaten.net/entry/573
<?php $LOG_FILE = dirname(__FILE__).'/hook.log'; $SECRET_KEY = '** secret **'; $path = 'directory path'; if ( isset($_GET['key']) && $_GET['key'] === $SECRET_KEY && isset($_POST['payload']) ) { $payload = json_decode($_POST['payload'], true); if ($payload['ref'] === 'refs/heads/master') { if ( chdir( $path ) ) { exec('git pull --no-edit origin master'); file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['head_commit']['message']."\n", FILE_APPEND|LOCK_EX); } else { file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." Directory change ERROR: ".$_SERVER['REMOTE_ADDR']."\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); }
ほぼ変更していないのですが、Pullを実行するディレクトリへの移動を調整してます
変数解説
$LOG_FILE
ログファイルを吐き出すディレクトリとファイル名を指定します
(dirname(__FILE__).’/hook.log’)だと上のhook.phpと同じ所に吐き出されます
$SECRET_KEY
どこからでもアクセスできちゃうのは不安なのでキーを設定します、好きなシークレットキーを入力して下さい
GitHub側でURLを設定する時に一緒に設定します
$path
Pullを実行するディレクトリへのパスを設定します
Xサーバの場合「/home/ユーザー名/ディレクトリ名」と設定します
ここにちょっとハマったので分岐してやりました
変更箇所解説
基本的には参考させていただいたこちらのサイトと同じですが
追加したディレクトリパスの部分だけ解説していきます
何にハマったか
そもそもPHPのexecで「cd」を実行できないんだねーという所から始まりました(出来ると思ってた)
exec('cd /home/hogehoge; git pull --no-edit origin master');
こんなコードを書いてたのですが、アクセスエラーは出ないのにPull出来ないという所で悩んでました
PHPでのディレクトリ移動はchdirを使おう
chdirを使うことで実行するディレクトリを変更することが出来ます
しかもchdirは返り値で成功した場合に TRUE を、失敗した場合に FALSE を返してくれます
じゃあifで分岐してやればディレクトリ移動に成功しているかどうかのチェックも出来るということで分岐してやりました
GitHubでの設定
GitHubのリポジトリの設定画面でwebhooksを選択します
Add webhookでwebhookを追加します
hook.phpを設定したURLの後ろに「?key=** secret **」と設定したシークレットキーを入力します
これでPushしてサーバ側がPullしてれば完了です
まとめ
GitHubにPushしたら自動的にPullさせるものは他にも色々ありますが、なるべく簡単に設置と設定を出来るようにと思って参考サイトのものを調整してみました
ブランチを作成している場合はexecの中身を変更して下さい
これとiPadなどにWorking Copy – Anders BorumとTextastic Code Editor 6 – Alexander Blachが入っていればちょっとしたコーディングならiOS端末で出来ます
GitHubは色々便利ですね
追記
ブランチからPullする場合の変更箇所です
if ($payload['ref'] === 'refs/heads/master') {
exec('git pull --no-edit origin master');
上記2つの「master」をブランチ名に変更して下さい
また、「パスワードを聞かれてpullが進まない」といった場合は
{cloneしたリポジトリDir}/.git/config
を開いて[remote “origin”]項目のurlにusername:password@を追加して下さい
[remote "origin"] url = https://username:password@github.com/username/repository.git
コメント