Как настроить GitHub Actions для проекта Laravel, чтобы собрать и загрузить Docker-образ на Docker Hub?

Вопрос или проблема

Я работаю над проектом, построенным с:

  • Laravel 10

  • Tailwind

  • MySQL

Я хочу автоматизировать процесс, чтобы каждый раз, когда я загружаю изменения на GitHub, GitHub Actions запускали тесты, собирали проект и загружали образ Docker в Docker Hub. Затем я смогу подтянуть его из Docker Hub и запустить проект. Однако у меня возникают трудности с правильной настройкой файла .yml и Dockerfile.

Вот моя конфигурация GitHub Actions (laravel.yml):

name: Laravel CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

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

    services:
      mysql:
        image: mysql:5.7
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
        env:
          MYSQL_DATABASE: laravel
          MYSQL_ROOT_PASSWORD: password
        ports:
          - 3306:3306

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: mbstring, pdo_mysql, bcmath
          ini-values: post_max_size=256M, max_execution_time=300

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

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

      - name: Setup .env file
        run: |
          cp .env.example .env
          php artisan key:generate

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

      - name: Install Node.js dependencies
        run: |
          npm install
          npm run build

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: mydockerhubusername/myproject:latest

Вот мой Dockerfile:

FROM php:8.2-fpm

RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    nodejs \
    npm \
    && docker-php-ext-install pdo pdo_mysql mbstring exif pcntl bcmath gd zip

COPY --from=composer:2.6 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

COPY composer.json composer.lock ./

RUN composer install --no-dev --optimize-autoloader --no-scripts --prefer-dist

COPY . .

RUN mkdir -p storage bootstrap/cache

RUN chmod -R 777 storage bootstrap/cache

RUN npm install && npm run build

EXPOSE 9000

CMD ["php-fpm"]

Проблема:

  • Иногда сборка проходит, но приложение Laravel показывает пустую белую страницу после развертывания.

  • В другие разы я получаю ошибки сброса соединения.

  • Я не уверен, правильно ли настроены мой Dockerfile или .yml для загрузки и выгрузки в Docker Hub.

Можете помочь мне выявить проблемы в моей настройке? Что я упускаю или делаю не так для достижения желаемого результата?

Ответ или решение

Для успешной автоматизации развертывания вашего проекта на Laravel через GitHub Actions и Docker, потребуется тщательно настроить как файл конфигурации GitHub Actions, так и сам Dockerfile. Давайте разберем ваш сценарий и выявим возможные проблемы, а также предложим улучшения.

1. Проверка конфигурации GitHub Actions

Ваш файл laravel.yml выглядит в целом правильно, но ниже приведены некоторые рекомендации по улучшению его функциональности:

a) Обновление зависимости Composer

Вы можете добавить флаг --no-scripts к команде composer install, если у вас есть проблемы с зависимостями. Но учтите, что при этом не будут выполнены любые автоматические скрипты, прописанные в composer.json.

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

b) Обработка переменных окружения

Убедитесь, что все переменные окружения, используемые в вашем приложении (например, доступ к базе данных), правильно установлены в файле .env. Вы можете перенести обработку .env в отдельный шаг и проверить корректность конфигурации:

      - name: Check .env configuration
        run: |
          echo "DB_CONNECTION=mysql" >> .env
          echo "DB_HOST=mysql" >> .env
          echo "DB_PORT=3306" >> .env
          echo "DB_DATABASE=laravel" >> .env
          echo "DB_USERNAME=root" >> .env
          echo "DB_PASSWORD=password" >> .env

c) Улучшение сборки и тестирования Docker

Для упрощения процесса сборки и тестирования Docker образа, убедитесь, что ваша команда docker/build-push-action выполняется правильно:

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: mydockerhubusername/myproject:latest

Убедитесь, что mydockerhubusername/myproject отражает ваш действительный путь на Docker Hub.

2. Проверка Dockerfile

Ваш Dockerfile выглядит достаточно информативно, но есть несколько моментов для улучшения:

a) Использование более поздней версии PHP

Вы используете образ php:8.2-fpm, но ваш Actions предназначен для php:8.1. Важно обеспечить совместимость версий PHP везде, чтобы исключить несоответствия.

b) Установка Node.js и NPM

Убедитесь, что версии Node.js и NPM актуальны для вашего проекта. Возможно, стоит рассмотреть использование образа node, чтобы установить нужные зависимости:

FROM node:16 AS node
WORKDIR /var/www/html
COPY . . 
RUN npm install && npm run build

c) Оптимизация команд COPY

Вы можете сократить количество команд COPY, объединив их, что может снизить размер образа и ускорить сборку:

COPY . /var/www/html

3. Проблемные области

a) Пустая страница Laravel

Это может происходить из-за ошибок в коде, неверной конфигурации .env или отсутствия нужных зависимостей. Проверьте логи Laravel, чтобы найти причины (обычно они находятся в storage/logs/laravel.log).

b) Ошибки соединения

Проблемы с подключением могут возникнуть из-за неправильной конфигурации базы данных или несоответствия между docker-compose и вашей конфигурацией GitHub Actions. Убедитесь, что вы можете подключиться к базе данных MySQL из вашего контейнера.

Заключение

Так как процесс CI/CD включает несколько слоев, критически важно, чтобы все части были правильно настроены и соответствовали друг другу. Проверьте указанные моменты в конфигурации GitHub Actions и Dockerfile, внесите необходимые изменения и протестируйте снова.

Для оптимизации и устранения ошибок было бы полезно рассмотреть интеграцию тестов (например, PHPUnit), а также использовать скрипты для автоматизированного тестирования перед деплоем. Это поможет поймать потенциальные ошибки до того, как они окажутся в вашем продакшене.

Успехов в вашем проекте!

Оцените материал
Добавить комментарий

Капча загружается...