Chuyển đến nội dung chính

レッスン 21: Docker と CI/CD

Laravel の Dockerfile (PHP-FPM + Nginx)。 Laravel セイル、Docker Compose。 GitHub Actions CI/CD パイプライン (lint、テスト、ビルド、デプロイ)。 Laravel Forge、Vapor (サーバーレス)。

💻 プログラミング — レッスン 21 レッスン 21: Docker と CI/CD

Laravel: 基本から上級まで

パート 6: テスト、Docker、本番環境

xdev.asia

1. Dockerfile (多段階)

FROM php:8.4-fpm-alpine AS base
RUN apk add --no-cache libpq-dev \
    && docker-php-ext-install pdo_pgsql opcache

FROM base AS composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --prefer-dist

FROM base AS runtime
WORKDIR /app
COPY --from=composer /app/vendor ./vendor
COPY . .
RUN php artisan config:cache \
    && php artisan route:cache \
    && php artisan view:cache

EXPOSE 9000
CMD ["php-fpm"]

2.Docker Compose

services:
  app:
    build: .
    volumes:
      - .:/app
    depends_on:
      - db
      - redis

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
      - .:/app
    depends_on:
      - app

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: ${DB_DATABASE}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

  queue:
    build: .
    command: php artisan queue:work --tries=3 --timeout=90
    depends_on:
      - db
      - redis

volumes:
  pgdata:

3. GitHub アクション CI/CD

name: Laravel CI/CD
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:16
        env:
          POSTGRES_DB: testing
          POSTGRES_USER: test
          POSTGRES_PASSWORD: test
        ports: ["5432:5432"]

    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: "8.4"
          extensions: pdo_pgsql

      - run: composer install --no-interaction
      - run: cp .env.testing .env
      - run: php artisan key:generate
      - run: php artisan test --parallel --coverage --min=80
        env:
          DB_CONNECTION: pgsql
          DB_HOST: 127.0.0.1
          DB_DATABASE: testing
          DB_USERNAME: test
          DB_PASSWORD: test

  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy
        run: |
          ssh ${{ secrets.SERVER }} "cd /app && git pull && composer install --no-dev && php artisan migrate --force && php artisan optimize"

次の記事: 実稼働環境の導入と監視。