綺麗に死ぬITエンジニア

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/.envconfig/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_PATHGIT_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"をクリックして設定を保存します。

Example screenshot showing GitHub webhook settings

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"をクリックして設定を保存します。

Example screenshot showing GitLab webhook settings

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"をクリックして設定を保存します。

Example screenshot showing Bitbucket webhook settings

トラブルシューティング

デプロイがうまくいかない場合、logs/error.logおよびlogs/debug.logを参照してください。何か原因が記載されている可能性があります。

パーミッション

うまくいかない場合の原因の多くが、パーミッションの設定不備に起因するものです。

Webサーバーの実行ユーザー(www, www-data, apache, etc...)が、CakePHPアプリケーションに対してgit pullcomposer installができるようにパーミッションを設定する必要があります。

CakePHPアプリケーションの所有グループをWebサーバーの実行ユーザーに変更し、グループに書き込み権限を与えることで実現する方法がお勧めです。次のようにします。

  1. CakePHPアプリケーションが存在するディレクトリに移動します。
  2. sudo chown -R yourusername:webserverusername project-dir/を実行します。
  3. sudo chmod -R g+s project-dir/を実行します。
  4. sudo chmod -R 775 project-dir/を実行します。

SSH

git pullがパスワードなしで実行できるように、SSHキーを生成してWebサーバーの実行ユーザーに追加する必要があります。

Webサーバーの実行ユーザーのホームディレクトリに.sshディレクトリを配置し、SSHキーを追加しましょう。

詳しくは、以下のドキュメントを参照してください。

まとめ

Gitリポジトリの変更を検知して自動でデプロイできるようになると、デプロイのタイムラグによって生じる様々な問題が解決できたりします。

特に、複数人で開発している際には、テスト環境にデプロイされているアプリケーションのバージョンと、実際に開発が進んでいるアプリケーションのバージョンが違ったりすると、折角のテストも無意味なものになりかねません。

また、開発者のやるべき作業が1つ減るので、デプロイに関する開発者の負担が減るのも大きなメリットの一つです。

バグや修正・機能追加依頼の方はGitHubへお願いします。

筆者について

フリーランスエンジニアとして活動している、「もりやませーた」です。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

PHP OSS