CI/CDを構築する(GitHub Actions × Laravel)

こんにちは!今回は、LaravelプロジェクトでGitHub Actionsを使ってCI/CD(継続的インテグレーション/継続的デリバリー)を構築する方法について解説します。CI/CDを導入することで、コードの品質管理や自動デプロイが可能になり、開発効率が大幅に向上します。

CI/CDとは?

CI/CD(継続的インテグレーション/継続的デリバリー)とは、アプリケーション開発のライフサイクルを自動化するプラクティスです。

  • 継続的インテグレーション(CI): コードの変更を頻繁に統合し、自動テストを実行して品質を確保します
  • 継続的デリバリー(CD): 検証済みのコードを自動的に本番環境などにデプロイします

GitHub Actionsとは?

GitHub Actionsは、GitHubが提供するCI/CDプラットフォームです。リポジトリ内で直接ワークフローを定義でき、コードのプッシュやプルリクエストなどのイベントをトリガーにして自動処理を実行できます。

LaravelプロジェクトにCI/CDを導入するメリット

  1. コード品質の向上: 自動テストによりバグの早期発見が可能
  2. 開発速度の向上: 手動デプロイの手間が省ける
  3. 一貫性の確保: 環境による差異を減らせる
  4. 安全なデプロイ: テスト済みのコードのみがデプロイされる

実装手順

1. GitHub Actionsのワークフローファイルを作成する

まず、プロジェクトのルートディレクトリに .github/workflows ディレクトリを作成し、その中に laravel.yml ファイルを作成します。

mkdir -p .github/workflows
touch .github/workflows/laravel.yml

2. CIワークフローの設定

以下は、基本的なLaravelのCIワークフローの例です。このワークフローでは、PHPの依存関係のインストール、コードのリンティング、テストの実行を行います。

name: Laravel CI

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

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    
    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: laravel_test
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    steps:
    - uses: actions/checkout@v3
    
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.1'
        extensions: mbstring, dom, fileinfo, mysql
        coverage: xdebug
    
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    
    - name: Generate key
      run: php artisan key:generate
    
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    
    - name: Configure Database
      env:
        DB_CONNECTION: mysql
        DB_HOST: 127.0.0.1
        DB_PORT: 3306
        DB_DATABASE: laravel_test
        DB_USERNAME: root
        DB_PASSWORD: password
      run: |
        php artisan migrate --force
    
    - name: Run PHPStan
      run: ./vendor/bin/phpstan analyse
    
    - name: Execute tests via PHPUnit
      env:
        DB_CONNECTION: mysql
        DB_HOST: 127.0.0.1
        DB_PORT: 3306
        DB_DATABASE: laravel_test
        DB_USERNAME: root
        DB_PASSWORD: password
      run: vendor/bin/phpunit

3. CDワークフローの設定

次に、継続的デリバリー(CD)のためのワークフローを設定します。例として、サーバーへのSSHデプロイを行う設定を紹介します。

.github/workflows/deploy.yml ファイルを作成し、以下のように設定します:

name: Laravel Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    needs: laravel-tests
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.1'
    
    - name: Install Dependencies
      run: composer install --no-dev --optimize-autoloader
    
    - name: Deploy to Production
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          cd /path/to/your/project
          git pull origin main
          composer install --no-dev --optimize-autoloader
          php artisan migrate --force
          php artisan config:cache
          php artisan route:cache
          php artisan view:cache

4. GitHub Secretsの設定

CDワークフローで使用するSSH認証情報などの機密情報は、GitHubのSecretsに保存します。

  1. GitHubリポジトリのSettingsタブを開く
  2. Secretsセクションを選択
  3. 以下のシークレットを追加:
    • SSH_HOST: デプロイ先サーバーのIPアドレスまたはドメイン
    • SSH_USERNAME: SSHユーザー名
    • SSH_PRIVATE_KEY: 秘密鍵の内容

応用例: Envoyを使ったデプロイ

より高度なデプロイ管理には、LaravelのEnvoyを使用することもできます。

  1. Envoyのインストール:
composer require laravel/envoy --dev
  1. Envoyfile.blade.phpの作成:
@servers(['production' => 'username@production.example.com'])

@task('deploy', ['on' => 'production'])
    cd /path/to/project
    git pull origin main
    composer install --no-dev --optimize-autoloader
    php artisan migrate --force
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
@endtask
  1. GitHub Actionsからの実行:
- name: Install Envoy
  run: composer global require laravel/envoy

- name: Run Envoy
  run: ~/.composer/vendor/bin/envoy run deploy

テストの高速化: PHPUnitのパラレル実行

テストの実行時間を短縮するために、PHPUnitのパラレル実行を設定できます。

  1. paratest のインストール:
composer require --dev brianium/paratest
  1. GitHub Actionsでの実行:
- name: Execute tests via Paratest
  env:
    DB_CONNECTION: mysql
    DB_HOST: 127.0.0.1
    DB_PORT: 3306
    DB_DATABASE: laravel_test
    DB_USERNAME: root
    DB_PASSWORD: password
  run: vendor/bin/paratest

キャッシュを活用してワークフローを高速化

GitHub Actionsでは、依存関係のキャッシュを活用することで、ワークフローの実行時間を短縮できます。

- name: Cache Composer dependencies
  uses: actions/cache@v3
  with:
    path: vendor
    key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
    restore-keys: ${{ runner.os }}-composer-

- name: Install Dependencies
  run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

まとめ

GitHub ActionsとLaravelを組み合わせたCI/CDパイプラインを構築することで、以下のメリットが得られます:

  1. 自動テストによるコード品質の向上
  2. デプロイプロセスの自動化
  3. 開発プロセスの一貫性
  4. チーム開発の効率化

CI/CDの導入は最初は少し手間がかかりますが、一度設定すれば長期的な開発効率の向上に大きく貢献します。小規模なプロジェクトから始めて、徐々に拡張していくのがおすすめです。

ぜひ、あなたのLaravelプロジェクトにもGitHub Actionsを活用したCI/CDを導入してみてください!

参考リンク

コメント

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