🤖

Laravel + Docker + GitHub Actions でCI環境を構築する手順

に公開

📍 Laravel + Docker + GitHub Actions でCI環境を構築する手順

本記事では、LaravelプロジェクトをDockerで構築し、GitHub Actionsを使ってCI環境を整える手順を書きます。

コードをGitHubにpushして、プルリクを作成すると自動でテストが実行される仕組みを作ります。


✅ 前提条件

  • Docker / Docker Compose がインストール済み
  • GitHub アカウントとリポジトリが用意されている
  • Laravelプロジェクトの作成から始める

🏠 Step 1: Laravel + Docker 環境を構築

📁 ディレクトリ構成

laravel-ci-sample/
├── Dockerfile
├── docker-compose.yml
└── .env

📄 docker-compose.yml

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: laravel_app
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: laravel_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravel

📄 Dockerfile

FROM php:8.2-apache

RUN apt-get update && apt-get install -y \
    libzip-dev zip unzip git curl \
    && docker-php-ext-install pdo_mysql zip

ENV APACHE_DOCUMENT_ROOT /var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf

WORKDIR /var/www/html

RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

⚙️ Step 2: Laravelプロジェクトのセットアップ

docker-compose up -d --build
docker-compose exec app bash

# Laravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel .

# 環境構築
cp .env.example .env
php artisan key:generate

.envDB_HOSTdb に変更(docker-compose上のサービス名)。


🦪 Step 3: テストが動作するか確認

php artisan migrate
php artisan test

tests/Feature/ExampleTest.php がパスすればOK!


☁️ Step 4: GitHubにpushする

git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git push -u origin main

🤖 Step 5: GitHub Actions のCI設定を追加

📁 .github/workflows/ci.yml

name: Laravel CI

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

jobs:
  laravel-tests:
    runs-on: ubuntu-latest

    services:
      db:
        image: mysql:8.0
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: laravel_testing
          MYSQL_USER: laravel
          MYSQL_PASSWORD: laravel
        options: >-
          --health-cmd="mysqladmin ping -h localhost"
          --health-interval=30s
          --health-timeout=5s
          --health-retries=3

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.2
          extensions: pdo_mysql

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress --no-suggest --no-interaction

      - name: Copy .env.github to .env
        run: cp .env.github .env

      - name: Generate application key
        run: php artisan key:generate

      - name: Debug environment
        run: php artisan config:clear

      - name: Run migrations
        run: php artisan migrate --force

      - name: Run tests
        run: php artisan test

📄 Step 6: .env.github(CI用)と phpunit.xml の準備

.env.github

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_testing
DB_USERNAME=laravel
DB_PASSWORD=laravel

phpunit.xml への追記(環境変数)

<php>
  <env name="APP_ENV" value="testing"/>
  <env name="DB_CONNECTION" value="mysql"/>
  <env name="DB_HOST" value="127.0.0.1"/>
  <env name="DB_PORT" value="3306"/>
  <env name="DB_DATABASE" value="laravel_testing"/>
  <env name="DB_USERNAME" value="laravel"/>
  <env name="DB_PASSWORD" value="laravel"/>
</php>

🤖 Step 7: Userモデルを使ったAPIとテストの追加

ここでは、Userモデルを使ったAPIエンドポイントを作成し、Factoryでテストデータを生成して、GitHub Actions上で動作確認する方法を紹介します。

📄 ルーティングを追加(routes/api.php)

use App\Models\User;

Route::get('/users', function () {
    return User::all();
});

🔧 Userモデルのテストファイルを作成

php artisan make:test Api/UserApiTest

📄 Factoryを使ったテストコードを書く

tests/Feature/Api/UserApiTest.php

<?php

namespace Tests\Feature\Api;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\User;

class UserApiTest extends TestCase
{
    use RefreshDatabase;

    public function test_users_endpoint_returns_users(): void
    {
        // テスト用のユーザーを3件作成
        User::factory()->count(3)->create();

        $response = $this->getJson('/api/users');

        $response->assertStatus(200)
                 ->assertJsonCount(3); // JSON配列の件数をチェック
    }
}

✅ 完成!CIの動作確認

  1. GitHub上でPRを作成
  2. 自動的に「Run tests」ジョブが起動
  3. テストにパスすれば OK

Discussion