はじめに
コードを書いたあとに毎回手動でテストを実行したり、デプロイ作業をしたりするのは手間がかかり、ミスも起きやすくなります。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
ポイント解説
- matrix:
php-versionを配列にすると、PHP 8.2と8.3の両方でジョブが並列実行されます。複数バージョンの互換性チェックに便利です。 - shivammathur/setup-php:PHP環境を簡単にセットアップできる公式推奨のアクションです。
- actions/cache:
vendorディレクトリをキャッシュすることで、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_USER | SSHユーザー名 |
SSH_PRIVATE_KEY | SSH秘密鍵の内容 |
ワークフロー内では ${{ 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パイプラインを導入してみてください。