本番のディレクトリとステージングのディレクトリを別々に用意して、githubのWebhookを使用してブランチごとに自動でデプロイする仕組みを作ってみた。
やりたいこと
pushした時に毎回pullするのが面倒だったので、
pushしたデータを「mastar」と「develop」のブランチごとにデプロイする仕組みを作る。
※ブランチ名は以下に記載しているコードを変更すればOK。
やったこと
簡単に仕組みを説明すると、githubのブランチごと(ここではdevelopとmaster)にpushした時にwebhookが発火。
pushした内容が「deploy.php」を通してブランチ名と同じディレクトリごとにデータを送信する仕組み。
前提条件は以下。
GitHubにリモートサーバーのSSHキーを登録
デプロイ用PHPプログラムの作成・配置
GitHubでwebhookの設定
動作確認
サーバーは「さくらのVPS」を使用してます。
サーバーにSSH接続出来ることと、githubへのhookの登録が済んでることが前提になります!
開発環境は以下
サーバー:さくらのVPS
ディレクトリ構成はこんな感じです。
/root
│ ├ master
│ └ develop
└ deploy.php
「deploy.php」には以下に記述をする。
<?php # ────────────────────────────── # 設定(基本的にここだけ環境に合わせて変更する) # ────────────────────────────── # ログファイル定義 $LOG_FILE = dirname(__FILE__).'/_hook.log/hook.log'; # エラーログファイル定義 $LOG_FILE_ERR = dirname(__FILE__).'/_hook.log/hook-error.log'; # GitHubに設定するパスワード的な物(お好きな文字列) $SECRET_KEY = 'xxxxx'; # git pullしたいブランチ(配列) # 「develop」と「master」のブランチを設定 $BRANCHS = array('develop','master'); # ────────────────────────────── # 全てのHTTPリクエストヘッダを取得 $header = getallheaders(); # POSTの生データを取得 $post_data = file_get_contents( 'php://input' ); # ハッシュ値を生成 $hmac = hash_hmac('sha1', $post_data, $SECRET_KEY); if ( isset($header['X-Hub-Signature']) && $header['X-Hub-Signature'] === 'sha1='.$hmac ) { $payload = json_decode($post_data, true); foreach ($BRANCHS as $branch) { if($payload['ref'] == 'refs/heads/'.$branch){ chdir($payload['repository']['name'].'/'.$branch); exec('git pull origin '.$branch.' 2>&1', $output, $return); file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ". $_SERVER['REMOTE_ADDR']." ". $payload['repository']['name']."/".$branch." ". $payload['commits'][0]['message']." ". $output[0]." ".$return."\n", FILE_APPEND|LOCK_EX ); } } } else { file_put_contents($LOG_FILE_ERR, date("[Y-m-d H:i:s]")." ". $_SERVER['REMOTE_ADDR']." 認証失敗"."\n", FILE_APPEND|LOCK_EX ); } ?>