あっぽログ
← 記事一覧に戻る

GitHub ActionsでPHPアプリのCI/CDパイプラインを構築する:テスト・静的解析・デプロイを自動化する

はじめに

コードを書いたあとに毎回手動でテストを実行したり、デプロイ作業をしたりするのは手間がかかり、ミスも起きやすくなります。GitHub Actionsを使えば、プッシュやプルリクエストをトリガーにしてテスト・静的解析・デプロイを自動化できます。

この記事では、PHPアプリを対象にGitHub Actionsのワークフローをゼロから構築する方法を解説します。


GitHub Actionsの基本構造

GitHub Actionsのワークフローは、リポジトリの .github/workflows/ ディレクトリに YAMLファイルとして置きます。

.github/
  workflows/
    ci.yml

YAMLファイルの基本構造は以下のとおりです。

name: ワークフロー名

on:           # トリガーの設定
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  job-name:   # ジョブの定義
    runs-on: ubuntu-latest
    steps:
      - name: ステップ名
        run: echo "Hello"
  • on:ワークフローを起動するイベント(push・pull_request など)
  • jobs:並列または順番に実行する処理のまとまり
  • steps:ジョブ内の具体的な手順

PHPのテスト自動化(PHPUnit)

まずはPHPUnitを実行するジョブを作ります。

# .github/workflows/ci.yml
name: PHP CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        php-version: ["8.2", "8.3"]   # 複数バージョンでテスト

    steps:
      - name: リポジトリをチェックアウト
        uses: actions/checkout@v4

      - name: PHPをセットアップ
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: mbstring, pdo, pdo_mysql
          coverage: xdebug

      - name: Composerの依存関係をキャッシュ
        uses: actions/cache@v4
        with:
          path: vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-

      - name: 依存関係をインストール
        run: composer install --no-progress --prefer-dist

      - name: PHPUnitを実行
        run: ./vendor/bin/phpunit --coverage-text

ポイント解説

  • matrixphp-version を配列にすると、PHP 8.2と8.3の両方でジョブが並列実行されます。複数バージョンの互換性チェックに便利です。
  • shivammathur/setup-php:PHP環境を簡単にセットアップできる公式推奨のアクションです。
  • actions/cachevendor ディレクトリをキャッシュすることで、2回目以降の composer install を高速化できます。

静的解析の自動化(PHPStan)

テストに加えて、PHPStanによる静的解析もCIに組み込みましょう。

  analyse:
    runs-on: ubuntu-latest
    needs: test   # testジョブが成功したあとに実行

    steps:
      - uses: actions/checkout@v4

      - uses: shivammathur/setup-php@v2
        with:
          php-version: "8.3"

      - name: 依存関係をインストール
        run: composer install --no-progress --prefer-dist

      - name: PHPStanを実行
        run: ./vendor/bin/phpstan analyse src --level=8

needs: test を指定すると、test ジョブが成功した場合のみ analyse ジョブが実行されます。これにより、テスト失敗時に無駄な静的解析が走らなくなります。

phpstan.neon の設定例

# phpstan.neon
parameters:
    level: 8
    paths:
        - src
    excludePaths:
        - src/Legacy

デプロイの自動化

mainブランチへのマージ時に自動デプロイするジョブを追加します。ここではSSH経由でサーバーにデプロイする例を示します。

  deploy:
    runs-on: ubuntu-latest
    needs: [test, analyse]   # テストと静的解析が両方通ったら実行
    if: github.ref == 'refs/heads/main'   # mainブランチのみ

    steps:
      - uses: actions/checkout@v4

      - name: SSHでデプロイ
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            composer install --no-dev --optimize-autoloader
            php artisan migrate --force
            php artisan config:cache

Secretsの設定

SSH接続情報などの機密情報は、GitHubリポジトリの Settings → Secrets and variables → Actions から登録します。

シークレット名内容
SSH_HOSTサーバーのIPアドレスまたはホスト名
SSH_USERSSHユーザー名
SSH_PRIVATE_KEYSSH秘密鍵の内容

ワークフロー内では ${{ secrets.SECRET_NAME }} の形式で参照でき、ログに値が出力されることはありません。


完成したワークフロー全体像

push / pull_request
       ↓
   [test ジョブ]
   PHP 8.2 / 8.3 で PHPUnit 実行
       ↓(成功したら)
   [analyse ジョブ]
   PHPStan レベル8 で静的解析
       ↓(成功 & mainブランチなら)
   [deploy ジョブ]
   SSHでサーバーにデプロイ

まとめ

この記事では、GitHub ActionsをつかったPHPアプリのCI/CDパイプライン構築方法を解説しました。

  • PHPUnitで複数PHPバージョンのテストを自動化
  • PHPStanで静的解析を自動化
  • Secretsを活用して安全に本番デプロイを自動化
  • needs を使ったジョブの依存関係設定

一度ワークフローを整備すれば、プッシュするだけで品質チェックからデプロイまでが自動で完了します。開発サイクルを高速化しながらリリースの安全性を高めるために、ぜひCIパイプラインを導入してみてください。

← 記事一覧に戻る