0Pricing
PHP Academy · レッスン

GitHub ActionsによるCI/CD

プッシュするたびにPHPを自動でテストしてデプロイします。

「GitHub ActionsによるCI/CD」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

PHPのCI/CD

すべてのpushでテスト、lint、静的解析を実行し、mainブランチで成功した場合はイメージをビルドしてデプロイするべきです。GitHub Actionsは、リポジトリのイベントをトリガーとして、管理されたランナー上でこのパイプラインを実行します。

このレッスンでは、実際のMySQLサービス上でPHPUnitを実行し、Composerをキャッシュし、PHPStanを実行し、Dockerイメージをビルドしてデプロイするワークフローを構築します。

ワークフローの構成

ワークフローは.github/workflows/*.ymlに配置します。on:トリガーがあり、1つ以上のjobs:があり、各ジョブにはsteps:があります。needs:で関連付けられていない限り、ジョブは分離されたランナー上で並列に実行されます。

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

setup-phpアクション

shivammathur/setup-phpは、ランナー上に指定したPHPバージョンと必要な拡張機能やツール(Composer、PHPStanなど)をインストールする標準的な方法です。テストのためだけにイメージをビルドするより、はるかに高速です。

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: pdo_mysql, intl, redis, zip
          coverage: pcov
          tools: composer:v2, phpstan

Composerをキャッシュする

実行のたびに依存関係を再ダウンロードすると、数分が無駄になります。composer.lockのハッシュをキーにしてComposerのディレクトリをキャッシュすると、依存関係が変わったときだけキャッシュが無効になります。

      - name: Get Composer cache dir
        id: composer-cache
        run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: composer-

      - run: composer install --prefer-dist --no-progress

サービスコンテナ

ジョブではサービスコンテナを起動できます。これは、ランナーが127.0.0.1で接続できる実際のMySQLやRedisです。optionsでヘルスチェックを追加し、DBの準備が完了する前にステップが実行されないようにしてください。

  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_DATABASE: app_test
          MYSQL_ROOT_PASSWORD: root
        ports: ['3306:3306']
        options: >-
          --health-cmd="mysqladmin ping -proot"
          --health-interval=5s --health-retries=10

テストとカバレッジを実行する

依存関係をインストールし、MySQLを起動したら、PHPUnitを実行します。テストのDSNは127.0.0.1:3306を指定してください。カバレッジを生成し、必要に応じて、しきい値を下回った場合にビルドを失敗させます。

      - name: Run PHPUnit
        env:
          DATABASE_URL: "mysql://root:root@127.0.0.1:3306/app_test"
        run: vendor/bin/phpunit --coverage-clover=coverage.xml

      - name: Static analysis
        run: phpstan analyse src --level=8 --no-progress

マトリックスビルド

ライブラリは複数のPHPバージョンで通過する必要があります。strategy.matrixを使うと、ジョブを組み合わせごとの並列実行に分割でき、ステップ内では${{ matrix.php }}が展開されます。

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2', '8.3', '8.4']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}

イメージタグを算出する

デプロイには、一意で追跡可能なイメージタグが必要です。一般的にはコミットSHAを使います。このスニペットは、ワークフローで表現するタグ導出ロジックを示しており、refとSHAからレジストリ用のタグを生成します。

<?php
// Mirrors what the workflow computes for the image tag
$ref = 'refs/heads/main';
$sha = '9f41efadc0de1234567890abcdef0000deadbeef';

$branch = str_replace('refs/heads/', '', $ref);
$shortSha = substr($sha, 0, 7);
$tag = sprintf('registry.example.com/app:%s-%s', $branch, $shortSha);

echo $tag . PHP_EOL;          // registry.example.com/app:main-9f41efa
echo 'is_main: ' . ($branch === 'main' ? 'yes' : 'no') . PHP_EOL;
?>

イメージをビルドしてプッシュする

mainブランチでは、BuildKitとGitHub Actionsのキャッシュを使い、docker/build-push-actionでDockerイメージをビルドします。最初にシークレットトークンでレジストリにログインしてください。認証情報をハードコードしてはいけません。

  build:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          target: runtime
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

シークレットとOIDC

認証情報はリポジトリまたは環境のsecretsに保存し、${{ secrets.NAME }}として参照します。ログではマスクされます。クラウドへのデプロイではOIDCを優先してください。permissions: id-token: writeにより、ランナーはAWS/GCPから有効期間の短いトークンを取得できるため、リポジトリに長期間有効なキーを保存せずに済みます。

  deploy:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      id-token: write     # enables OIDC
      contents: read
    steps:
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/deploy
          aws-region: eu-central-1

デプロイステップと環境

本番環境へのデプロイは、GitHubのenvironment(必要に応じて必須レビュアーを設定)によって承認を必須にしてください。その後、デプロイステップでロールアウトを開始します。KubernetesのdeploymentやECSサービスを更新したり、SSHで接続して新しいイメージを取得したりします。

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production       # can require manual approval
      url: https://app.example.com
    steps:
      - name: Roll out
        run: |
          kubectl set image deployment/app \
            app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          kubectl rollout status deployment/app --timeout=120s

確認

Actionsで保存したクラウドキーと比べた場合、OIDCの主なセキュリティ上の利点は何ですか?

まとめ

GitHub ActionsでPHPのCI/CDパイプラインを構築しました。push/PRをトリガーにし、setup-phpで拡張機能を設定し、ロックファイルをキーにComposerをキャッシュし、ヘルスチェック付きのMySQLサービスコンテナを使い、PHPUnitとPHPStanを実行し、バージョンマトリックスを設定し、さらにmainブランチでのみGHAキャッシュを使ったビルドとプッシュを行い、OIDC認証と環境による承認を組み合わせたデプロイを実行しました。

原則: ロックファイルのハッシュをキーにしてキャッシュする、ヘルスチェックで準備完了したサービスだけを使用する、SHAでイメージにタグを付ける、保存したキーよりOIDCを優先することです。

よくある質問

「GitHub ActionsによるCI/CD」レッスンは無料ですか?

はい。「GitHub ActionsによるCI/CD」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「GitHub ActionsによるCI/CD」で何を学びますか?

プッシュするたびにPHPを自動でテストしてデプロイします。 ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「GitHub ActionsによるCI/CD」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. PHPアプリケーションのコンテナ化
  2. マルチステージビルドと最適化
  3. ローカル環境向けDocker Compose
  4. GitHub ActionsによるCI/CD
← PHP Academyに戻る