前回の記事では、CakePHP5 のスケルトン作成と Docker での開発環境構築を行いました。
今回は、GitHub にコードを Push した際に、静的解析やチェックを自動で実行する CI(継続的インテグレーション)環境を構築します。
単に動かすだけでなく、「GitHub Secrets によるセキュリティ対策」と「キャッシュによる高速化」も試しています。
この記事でわかること
- GitHub Actions で Docker を使った CI を動かす方法
-
docker/build-push-actionによるビルドの高速化 -
actions/cacheを使った Composer 依存関係のキャッシュ - GitHub Secrets を使った機密情報(SECURITY_SALT等)の安全な管理
この記事内のソースコードは以下で公開しています。
SECURITY_SALT の生成と設定
CI 環境で CakePHP を動作させるには、暗号化に使う SECURITY_SALT が必要です。
ソルト値の生成
ターミナルで以下のワンラインを実行して、64文字のランダムな文字列を生成します。
openssl rand -hex 32
GitHub Secrets への登録
生成した値を GitHub に登録します。これにより、YAMLファイルに直接ソルト値を書かずに済みます。
- リポジトリの Settings > Secrets and variables > Actions を開く
- New repository secret をクリック
- 名前を
SECURITY_SALTとし、生成した値を貼り付けて保存
CI 設定ファイルの作成
cms-ci.yml を作成します。
cms ディレクトリ配下に変更があった場合のみ動作するように設定しています。
name: CMS CI
on:
pull_request:
paths:
- 'cms/**'
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 1. Dockerイメージのビルド(レイヤーキャッシュ活用)
- name: Build Docker image
uses: docker/build-push-action@v6
with:
context: .
tags: cli:latest
load: true
cache-from: type=gha
cache-to: type=gha,mode=max
# 2. Composer依存関係(vendor)のキャッシュ
- name: Cache Composer dependencies
uses: actions/cache@v4
with:
path: cms/vendor
key: ${{ runner.os }}-composer-${{ hashFiles('cms/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
# 3. 依存関係のインストール
- name: Composer install
run: |
docker run --rm -v ${{ github.workspace }}:/app -w /app/cms cli:latest php ../composer.phar install --no-interaction --prefer-dist
# 4. 静的解析・チェックの実行
- name: Run composer check
run: |
docker run --rm \
-v ${{ github.workspace }}:/app \
-w /app/cms \
-e SECURITY_SALT \
-e DATABASE_TEST_URL \
cli:latest php ../composer.phar check
env:
SECURITY_SALT: ${{ secrets.SECURITY_SALT }}
DATABASE_TEST_URL: sqlite://127.0.0.1/tmp/tests.sqlite
キャッシュ
CI の実行時間を短縮するために、2種類のキャッシュを組み合わせています。
- Docker レイヤーキャッシュ: Dockerfile の各命令をキャッシュします。イメージのビルド時間を短縮します。
-
Composer 依存キャッシュ:
vendorディレクトリそのものをキャッシュします。composer.lockに変更がない限り、重いライブラリのダウンロードをスキップします。
環境差異の排除
ホスト側のディレクトリをコンテナの /app にマウントし、ローカル開発環境と同じ Docker イメージ(cli:latest)で composer check を実行しています。これにより、「手元の PC では動くが CI だと落ちる」という環境依存の問題を完全に防げます。
GitHub Secrets による秘匿
SECURITY_SALT を GitHub の環境変数から注入することで、ログに生のソルト値が表示されるのを防ぎつつ、セキュアにテストを実行できます。
今回はテストのみでの利用なので、秘匿すべき情報ではないかもですが、勉強のために利用することとしました。
composer.json でのコマンド定義
GitHub Actions から呼び出している check コマンドは、composer.json の scripts セクションで定義しています。
定義することで、ユニットテスト(PHPUnit)、静的解析(PHPStan)、コード規約チェック(phpcs)をまとめて実行できます。
"scripts": {
"check": [
"@stan",
"@cs-check",
"@test"
],
"cs-check": "phpcs --colors -p",
"cs-fix": "phpcbf --colors -p",
"test": "phpunit --colors=always",
"stan": "phpstan analyse --memory-limit=1G"
}
動作確認
PR を作成すると、GitHub Actions が自動的に起動します。
初回はビルドに時間がかかりますが、2回目以降はキャッシュが効いて速く終了します。
小さなアプリケーションですが、キャッシュが効いてないときは1分40秒ぐらい、キャッシュが効いているときは50秒ぐらいでした。
さいごに
これで、コードの品質を自動で担保する基盤が整いました。
CakePHP の CMSチュートリアルを進めていこうと思います!