CakePHP3.5以降でGitからの自動デプロイができるプラグイン(Webhook利用)
2018-11-01
Gitでバージョン管理しているCakePHPアプリケーションで、特定のブランチに変更があったときに自動でサーバーにデプロイできるプラグインを実装し、オープンソースで公開しました。
実装に何か問題があればissueやプルリクエストいただければと思います。
プラグインの紹介
今回作成した「GitDeploy plugin for CakePHP」はGitHubで公開しています。
OSSで開発していますので、バグはもちろん、セキュリティに何かしら問題が判明した場合なども対応しますので、興味のある方は開発にご協力いただければと思います。
動作環境
このプラグインは以下の環境での動作をサポートしています。
- CakePHP 3.5 以降
- PHP 5.6 以降
インストール
1. プラグインの導入
まず、composerを使ってプラグイン本体を導入します。
composer require node-link/cakephp-git-deploy
2. プラグインの読み込み
CakePHP3.6以降では次のようにしてプラグインを読み込みます。
<?php
// src/Application.php
use Cake\Http\BaseApplication;
class Application extends BaseApplication
{
public function bootstrap()
{
parent::bootstrap();
// Load the plugin
$this->addPlugin('NodeLink/GitDeploy');
}
}
CakePHP3.5では次のようにしてプラグインを読み込みます。
<?php
// config/bootstrap.php
use Cake\Core\Plugin;
Plugin::load('NodeLink/GitDeploy', ['bootstrap' => true, 'routes' => true]);
もしくは、以下のコマンドを実行して読み込みます(全てのバージョンで可能)。
bin/cake plugin load -b -r NodeLink/GitDeploy
プラグインの設定値
config/.env
やconfig/app.php
を編集することで、プラグインの設定値を変更できます。
プラグインの設定値の初期値は以下のようになっています。
<?php
return [
'GitDeploy' => [
'enable' => filter_var(env('GIT_DEPLOY_ENABLE', false), FILTER_VALIDATE_BOOLEAN),
'token' => env('GIT_DEPLOY_TOKEN', 'secret'),
'branch' => env('GIT_DEPLOY_BRANCH', 'master'),
'git_path' => env('GIT_DEPLOY_GIT_PATH', '/usr/bin/git'),
'composer_path' => env('GIT_DEPLOY_COMPOSER_PATH', '/usr/local/bin/composer')
],
];
以下の値をconfig/.env
に設定することをお勧めします。
export GIT_DEPLOY_ENABLE="true"
export GIT_DEPLOY_TOKEN="__TOKEN__"
export GIT_DEPLOY_BRANCH="master"
export GIT_DEPLOY_GIT_PATH="/usr/bin/git"
export GIT_DEPLOY_COMPOSER_PATH="/usr/local/bin/composer"
export COMPOSER_HOME="/var/www"
__TOKEN__
をランダムな文字列に変更し、GIT_DEPLOY_GIT_PATH
やGIT_DEPLOY_COMPOSER_PATH
に正しいパスを指定してください。
Webhookの設定
GitHub
デプロイしたいリポジトリを開き、Settings → Webhooks → Add webhookを選択し、以下の設定を行います。
- Payload URL:https://example.com/git-deploy (CakePHPアプリケーションの
/git-deploy
を参照するようにします。) - Content type: application/json
- Secret:
config/.env
に設定したGIT_DEPLOY_TOKEN
の値 - Which events would you like to trigger this webhook?:
? Just the push event - Active:
☑️
"Add webhook"をクリックして設定を保存します。
GitLab
デプロイしたいリポジトリを開き、Settings → Integrationsを選択し、以下の設定を行います。
- URL:https://example.com/git-deploy (CakePHPアプリケーションの
/git-deploy
を参照するようにします。) - Secret Token:
config/.env
に設定したGIT_DEPLOY_TOKEN
の値 - Trigger:
☑️ Push events - Enable SSL verification:
☑️ (SSLを利用する場合のみ。詳しくはGitLabのドキュメントを参照してください。)
"Add webhook"をクリックして設定を保存します。
Bitbucket
デプロイしたいリポジトリを開き、Settings → Webhooks → Add webhookを選択し、以下の設定を行います。
- Title: Git Deploy
- URL:https://example.com/git-deploy?token=
GIT_DEPLOY_TOKEN
(CakePHPアプリケーションの/git-deploy
を参照するようにし、config/.env
に設定したGIT_DEPLOY_TOKEN
の値をパラメーターに設定します。) - Active:
☑️ - SSL / TLS:
⬜️ Skip certificate verification (SSLを利用する場合のみ。詳しくはBitbucketのドキュメントを参照してください。) - Triggers:
? Repository push
"Save"をクリックして設定を保存します。
トラブルシューティング
デプロイがうまくいかない場合、logs/error.log
およびlogs/debug.log
を参照してください。何か原因が記載されている可能性があります。
パーミッション
うまくいかない場合の原因の多くが、パーミッションの設定不備に起因するものです。
Webサーバーの実行ユーザー(www
, www-data
, apache
, etc...)が、CakePHPアプリケーションに対してgit pull
とcomposer install
ができるようにパーミッションを設定する必要があります。
CakePHPアプリケーションの所有グループをWebサーバーの実行ユーザーに変更し、グループに書き込み権限を与えることで実現する方法がお勧めです。次のようにします。
- CakePHPアプリケーションが存在するディレクトリに移動します。
sudo chown -R yourusername:webserverusername project-dir/
を実行します。sudo chmod -R g+s project-dir/
を実行します。sudo chmod -R 775 project-dir/
を実行します。
SSH
git pull
がパスワードなしで実行できるように、SSHキーを生成してWebサーバーの実行ユーザーに追加する必要があります。
Webサーバーの実行ユーザーのホームディレクトリに.ssh
ディレクトリを配置し、SSHキーを追加しましょう。
詳しくは、以下のドキュメントを参照してください。
まとめ
Gitリポジトリの変更を検知して自動でデプロイできるようになると、デプロイのタイムラグによって生じる様々な問題が解決できたりします。
特に、複数人で開発している際には、テスト環境にデプロイされているアプリケーションのバージョンと、実際に開発が進んでいるアプリケーションのバージョンが違ったりすると、折角のテストも無意味なものになりかねません。
また、開発者のやるべき作業が1つ減るので、デプロイに関する開発者の負担が減るのも大きなメリットの一つです。
バグや修正・機能追加依頼の方はGitHubへお願いします。