スポンサーリンク

超簡単にGitHubにPushしたら自動でサーバを更新する【Xサーバ編】

GitHub

※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 BorumTextastic 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

 

コメント

タイトルとURLをコピーしました