こんにちは!今回は、LaravelプロジェクトでGitHub Actionsを使ってCI/CD(継続的インテグレーション/継続的デリバリー)を構築する方法について解説します。CI/CDを導入することで、コードの品質管理や自動デプロイが可能になり、開発効率が大幅に向上します。
CI/CDとは?
CI/CD(継続的インテグレーション/継続的デリバリー)とは、アプリケーション開発のライフサイクルを自動化するプラクティスです。
- 継続的インテグレーション(CI): コードの変更を頻繁に統合し、自動テストを実行して品質を確保します
- 継続的デリバリー(CD): 検証済みのコードを自動的に本番環境などにデプロイします
GitHub Actionsとは?
GitHub Actionsは、GitHubが提供するCI/CDプラットフォームです。リポジトリ内で直接ワークフローを定義でき、コードのプッシュやプルリクエストなどのイベントをトリガーにして自動処理を実行できます。
LaravelプロジェクトにCI/CDを導入するメリット
- コード品質の向上: 自動テストによりバグの早期発見が可能
- 開発速度の向上: 手動デプロイの手間が省ける
- 一貫性の確保: 環境による差異を減らせる
- 安全なデプロイ: テスト済みのコードのみがデプロイされる
実装手順
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に保存します。
- GitHubリポジトリのSettingsタブを開く
- Secretsセクションを選択
- 以下のシークレットを追加:
SSH_HOST
: デプロイ先サーバーのIPアドレスまたはドメインSSH_USERNAME
: SSHユーザー名SSH_PRIVATE_KEY
: 秘密鍵の内容
応用例: Envoyを使ったデプロイ
より高度なデプロイ管理には、LaravelのEnvoy
を使用することもできます。
- Envoyのインストール:
composer require laravel/envoy --dev
- 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
- GitHub Actionsからの実行:
- name: Install Envoy
run: composer global require laravel/envoy
- name: Run Envoy
run: ~/.composer/vendor/bin/envoy run deploy
テストの高速化: PHPUnitのパラレル実行
テストの実行時間を短縮するために、PHPUnitのパラレル実行を設定できます。
- paratest のインストール:
composer require --dev brianium/paratest
- 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パイプラインを構築することで、以下のメリットが得られます:
- 自動テストによるコード品質の向上
- デプロイプロセスの自動化
- 開発プロセスの一貫性
- チーム開発の効率化
CI/CDの導入は最初は少し手間がかかりますが、一度設定すれば長期的な開発効率の向上に大きく貢献します。小規模なプロジェクトから始めて、徐々に拡張していくのがおすすめです。
ぜひ、あなたのLaravelプロジェクトにもGitHub Actionsを活用したCI/CDを導入してみてください!
コメント