Laravel: CI с GitHub Actions

Источник: «Laravel CI with GitHub Action»
GitHub Actions — фантастический способ запуска рабочих процессов Continuous Integration, от запуска тестов до статического анализа и многого другого.

В приложениях Laravel очень важно запускать рабочие процессы для гарантии, что ваш код соответствует определённому стандарту. До того как появился пайплайн CI, мы запускали все рабочие процессы локально, что вызывало проблемы, когда кто-то забывал это сделать.

В этом руководстве я расскажу, как настроить GitHub Actions для приложений Laravel, чтобы вы могли спокойно сидеть и быть уверенным, что ваш код готов к запуску в продакшен.

Начало этого процесса — добавить в корень вашего проекта каталог .github/workflows. В него мы добавляем файлы рабочего процесса (workflow), чтобы GitHub мог взять каждый из них и запустить по отдельности. С этого момента вы можете проектировать свои рабочие процессы так как вам нужно. От отдельных рабочих процессов для каждой части до объединения их всех в один рабочий процесс.

Я начну с тестового рабочего процесса, так как, скорее всего, следует начать с него. Даже если вы реализуете этот рабочий процесс, вы сделаете шаг в правильном направлении.

Я не буду подробно рассказывать о том, как создавать GitHub Actions, так как это довольно сложная и очень специфичная тема для того, как вы хотели бы их реализовать. Рабочий процесс будет создан шаг за шагом, что позволит понять, как это работает.

name: Run tests

on: [push]

Для начала необходимо задать имя для рабочего процесса name: Run tests, которое GitHub будет использовать для отображения того, что происходит. Затем мы добавляем запись on, сообщающую GitHub, на каких событиях должен выполняться этот рабочий процесс. Можно добавлять более одного события, и существует широкий спектр событий, которые можно использовать.

Следующий шаг — определить задания jobs, которые мы хотим запустить. В каждом рабочем процессе может быть несколько заданий. Однако обычно я придерживаюсь одного рабочего задания на рабочий процесс, чтобы упростить его.

name: Run tests

on: [push]

jobs:
tests:
name: Run tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv
coverage: none

- name: Run composer install
run: composer install -n --prefer-dist

- name: Prepare Laravel Application
run: |
cp .env.ci .env
php artisan key:generate


- name: Run tests
run: php artisan test

У нашей задачи есть имя name: Run tests, которое GitHub может использовать в качестве метки при отображении того, что происходит. Нам нужно определить, на чём будет выполняться это задание. Обычно я использую ubuntu-latest, так как это моё обычное целевое развёртывание. Есть много вариантов, ориентированных на определённые версии OS и даже разные доступные операционные системы. Затем наша задача состоит из нескольких шагов, которые необходимо выполнить для запуска. От тестирования кода до выполнения того, что нужно сделать.

Большинство заданий начинаются с actions/checkout@v3, официального action команды GitHub. Здесь я использую версию 3, потому что она поддерживает последнюю версию node.js для любого JavaScript в моём проекте. Если вам нужна конкретная версия node.js, посмотрите примечания к выпуску каждой версии, чтобы убедиться, что она соответствует вашим требованиям.

Затем мы используем action shivammathur/setup-php@v2 для установки и настройки среды PHP. Указываем версию PHP php-version: '8.2' и необходимые расширения extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv.

Далее устанавливаем наши PHP-зависимости для обеспечения бесперебойной установки при развёртывании run: composer install -n --prefer-dist. На каждом шаге можно запустить пакетное действие или cli команду. Затем настраиваем приложение выполняя команды artisan или что-то ещё, что может нам понадобиться. В своём проекте я использую базу данных SQLite, работающую в памяти с тестовой базой данных. Если вы используете что-то другое, есть много хорошо задокументированных доступных опций. Всё, что я делаю, это копирую .env.ci в .env, который будет использовать приложение. Затем мы можем сгенерировать ключ шифрования приложения с помощью специальной команды php artisan key:generate.

Заключительный шаг — запуск набора тестов, для чего я использую команду artisan test. Вы можете вызвать бинарный файл самостоятельно или использовать команду artisan. Вы также можете добавить в эту команду любые дополнительные параметры, которые могут понадобиться для отладки потенциальных сбоев теста в CI.

Теперь, когда первоначальный рабочий процесс запущен, мы можем взглянуть на другой. На этот раз мы будем использовать один из моих любимых рабочих процессов — статический анализ. Как многие, возможно, уже знают, я откровенный разработчик, который всегда размахивает флагом статического анализа.

Для следующей части я не буду повторять все шаги заново. Вместо этого мы сосредоточимся на заключительной части.

name: Static Analysis

on: [push]

jobs:
phpstan:
name: phpstan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
coverage: none

- name: Install composer dependencies
run: composer install -n --prefer-dist

- name: Run Static Analysis
run: ./vendor/bin/phpstan --error-format=github

Поскольку нам не нужно запускать приложение, на этот раз не нужно беспокоиться обо всех PHP зависимостях. Наш последний шаг — запустить сам статический анализ. Я для статического анализа использую PHPStan. Однако это будет работать с любой другой доступной библиотекой статического анализа. Я передаю флаг error-format, чтобы любые потенциальные ошибки были в формате, который GitHub может понять и предназначен для среды CI.

Вы можете пойти дальше, например, запустить Laravel Pint или что-то ещё. Однако как введение, я думаю, что это охватывает всё то, что вам нужно.

Дополнительные материалы

Предыдущая Статья

Eloquent: Аксессоры и Мутаторы в примерах

Следующая Статья

Laravel: Погружение в Уведомления / Notifications