GitHubを使用してプロダクトを管理していると、毎デプロイ時にサーバーにssh接続してpullしてって作業を行うのはめんどくさいですよね?そこでmasterブランチにpushされたりmergeされた際に自動でサーバー上にデプロイされるよう対応させる方法をご説明します。
今回やりたいこと
今回やりたいことは簡単で、GitHubのmasterブランチにpushもしくはmergeした際にサーバーに自動デプロイを行うプログラムをPHPで作成してみます。ブランチ毎に挙動を変えられるように対応もさせたいと思います。
必要な手順
1. GitHubにサーバーのSSHキーを登録
これはGitHubを使用してコードを管理していると思いますので、今回は説明を省略します。
サーバー上でSSH鍵の生成を行う → 公開鍵をGitHubに登録 って言う手順ですね!
ちゃんと登録されているかどうかは以下のコマンドを実行することで確かめる事ができます。
$ ssh -T git@github.com
ちゃんと接続ができていたら以下のような返答があるはずです。
Hi xxxxxxxxxxxx! You've successfully authenticated, but GitHub does not provide shell access.
2. デプロイ用のプログラムの作成
今回はデプロイを自動化するために二つのプログラムをPHPで作成していきます。今回はこちらのサイトのコードを参考に作成してみました。
deploy.php
こちらのプログラムでオートデプロイの機能本体を作成していきます。
<?php /* 設定ファイル読み込み */ require_once( dirname( __FILE__ ) . '/config.php' ); file_put_contents( LOG_FILE, date( "[Y-m-d H:i:s]" ) . " Start Deploy\n", FILE_APPEND | LOCK_EX ); /* データ取得 */ $post_data = file_get_contents( 'php://input' ); $hmac = hash_hmac( 'sha1', $post_data, SECRET_KEY ); $payload = json_decode( $post_data, true ); /* 認証&処理実行 */ if ( isset( $_SERVER['HTTP_X_HUB_SIGNATURE'] ) && $_SERVER['HTTP_X_HUB_SIGNATURE'] === 'sha1=' . $hmac ) { foreach ( $commands as $branch => $command ) { /* ブランチを判断 */ if ( $payload['ref'] == 'refs/heads/' . $branch ) { if ( $command !== '' ) { /* コマンド実行 */ exec( $command ); file_put_contents( LOG_FILE, date( "[Y-m-d H:i:s]" ) . " " . $_SERVER['REMOTE_ADDR'] . " " . $branch . " " . $payload['commits'][0]['message'] . "\n", FILE_APPEND | LOCK_EX ); } } } } else { /* 認証失敗際の挙動 */ file_put_contents( LOG_ERR, date( "[Y-m-d H:i:s]" ) . " invalid access: " . $_SERVER['REMOTE_ADDR'] . "\n", FILE_APPEND | LOCK_EX ); }
config.php
そしてこちらのプログラムでは設定系をまとめています。
途中に出てくるSECRET_KEYについては後ほど説明するのでとりあえず無視してください。
<?php /* 設定 */ define( 'LOG_FILE', dirname( __FILE__ ) . '/hook.log' ); define( 'LOG_ERR', dirname( __FILE__ ) . '/error.log' ); define( 'SECRET_KEY', 'シークレットキーを入力' ); /* 実行するコマンド */ $commands = array( 'develop' => '',//developブランチ 'master' => 'cd 対象ディレクトリ && git pull origin master' // masterブランチ );
3. 作成したプログラムの配置
プログラムを配置する場所は正直どこでも良いと思います。ちゃんとURLでアクセス可能な場所に配置してください。
— deploy.php
|- config.php
|- hook.log // ログファイル
|- error.log // エラー時のログファイル
4. webnockの設定
デプロイ用のプログラムの配置が完了したらGitHub上でwebnockの設定をする必要があります。
対象のリポジトリのSettingタブをクリックしてWebnockの設定を行います。
- Payload URL: 先ほど配置したdeploy.phpのURLを入力
- Content type: application/json
- Secret: 好きなものを設定しましょう。ここで設定したものを先ほどの$SECRET_KEYの箇所に入力してください
- Which events would you like to trigger this webhook?: Just the push event.
これで、自動でmasterブランチにpushされた際にデプロイされるようになりました!!