【入門編】GitHub Actions × Composer:CI/CDで依存関係を自動テスト・デプロイするフロー – ビルド・パッケージ管理ツール生産性向上バイブル

こんにちは!開発現場を支えるインフラやCI/CDの仕組みに触れていると、「どうすれば毎回のビルドやテストをもっと速く、確実に行えるだろうか」と悩む瞬間が必ずやってきますよね。

特にPHPのプロジェクトでなくてはならない存在なのが Composer です。そして、現代の開発において、コードをプッシュした瞬間に自動でテストやデプロイを行ってくれる GitHub Actions はもはや必須の相棒です。

今回は、この「GitHub Actions × Composer」の組み合わせを極限まで最適化し、CI/CDの実行スピードを劇的に爆速化させる実践的なノウハウを、初心者の方にも分かりやすく、かつ現場のプロが唸る深い知見を交えてお伝えします。

これをマスターすれば、チーム全員の待ち時間が消え、毎日のコーディングが劇的に楽になりますよ。それでは、一緒に見ていきましょう!

—

1. そもそもComposerとCI/CDの切っても切れない関係とは?

PHPで開発をしていると、外部のライブラリ(フレームワークや便利なパッケージ)を管理するために `composer.json` というファイルを使いますよね。

開発者のローカル環境では、`composer install` を実行すれば必要なファイルが `vendor/` ディレクトリにダウンロードされます。しかし、GitHub ActionsなどのCI/CD環境(クラウド上の仮想マシン)では、毎回ゼロから環境が立ち上がります。

もし何の工夫もしないと、CIが走るたびに以下のような非効率な事態が起きます。
1. 真っ新な仮想マシンが立ち上がる
2. 毎回、世界中のパッケージリポジトリから膨大なライブラリをダウンロードし直す
3. ネットワーク帯域を消費し、テスト開始までに数分間待たされる

これでは「コードを修正してすぐに結果を確認したい」という開発のリズムが崩れてしまいます。だからこそ、「一度ダウンロードした依存関係を賢くキャッシュし、2回目以降は一瞬でビルドを終わらせる仕組み」が必要なのです。

—

2. 精度高い「Hello World」的ワークフローの全体像

それでは早速、GitHub ActionsでComposerを最高効率で動かすためのYAMLファイルを見ていきましょう。

プロジェクトのルートディレクトリに `.github/workflows/ci.yml` というファイルを作成し、以下のコードを記述してください。

ワークフローの名称(GitHubのActionsタブに表示されます)
name: PHP Composer CI/CD

どのようなトリガーでこのワークフローを動かすか
on:
push:
branches: [ “main”, “master” ] # mainまたはmasterブランチへのプッシュ時
pull_request:
branches: [ “main”, “master” ] # プルリクエスト作成時

jobs:
build:
# 実行環境として最新のUbuntuを指定(高速かつ安定)
runs-on: ubuntu-latest

steps:
# 1. GitHubリポジトリのコードを仮想マシン上にチェックアウト(ダウンロード)する

  • name: Checkout code

uses: actions/checkout@v4

# 2. プロジェクトで使用するPHPのバージョンをセットアップする

  • name: Setup PHP

uses: shivammathur/setup-php@v2
with:
php-version: ‘8.2’ # プロジェクトに合わせたPHPバージョンを指定
tools: composer:v2 # 最新のComposer v2系を確実に使用する
coverage: none # 今回はテストカバレッジ計測を行わないため、無効化して高速化

# 3. 【最重要】Composerのキャッシュディレクトリのパスを自動取得して変数に格納する

  • name: Get Composer Cache Directory

id: composer-cache
run: |
echo “dir=$(composer config cache-files-dir)” >> $GITHUB_OUTPUT

# 4. GitHub Actions公式のキャッシュアクションでvendor配下をキャッシュする

  • name: Cache Composer dependencies

uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
# composer.lockのハッシュ値をキーにして、依存関係が変わった時だけキャッシュを無効化する
key: ${{ runner.os }}-composer-${

タイトルとURLをコピーしました