Благодаря GitHub Actions мы можем очень быстро настроить рабочие процессы для нашего git-репозитория без какой-либо конфигурации со стороны платформы GitHub. Действительно, нам просто нужно создать специальный файл .yml в папке .github/workflows
вашего репозитория.
Наличие CI, запускаемого при каждом «git pull» (или запланированного с помощью настройки cron в GitHub Action), повышает качество каждого pull-запроса, сделанного для вашего проекта.
Вы можете запускать инструменты проверки производительности (PHPStan), анализа кода (ESLint/Prettier), скрипты форматирования (PHP CS/CodeSniffer), модульные тесты и т.д.
Создайте свой первый GitHub Action ?
В этой статье мы создадим действие GitHub, которое запускает модульные тесты вашего приложения. Однако вы можете создать буквально любое действие GitHub для рабочих процессов вашего репозитория ?.
Сначала перейдите в свой репозиторий GitHub, а затем создайте .github/workflows
.
В папке workflows
создайте файл под названием test.yml
или ci.yml
.
Внутри него вы начнете с названия CI Action (как оно будет отображаться на вкладке GitHub Actions).
В нашем примере, давайте сделаем name: Tests
? .
Затем вы можете упомянуть, какое событие вы хотите, чтобы GitHub слушал благодаря on:
. Я обычно упоминаю on: [push,pull_request]
. Таким образом, он будет запускаться при каждом git push
и pull request.
Затем мы можем начать объявлять задания нашего GitHub Action, jobs: run:
, где мы упоминаем каждое действие, которое мы хотим, чтобы задание выполнялось для нас.
runs-on
— это на какой ОС вы хотите, чтобы задание выполнялось. В моем случае это будут только Linux и Windows, поэтому я могу упомянуть runs-on: [ 'ubuntu-latest', 'windows-latest' ]
. Суффикс -latest
означает, что будет использоваться самая новая из доступных ОС.
Итак, на данный момент мы имеем следующее ?
name: Tests
on: [push, pull_request]
jobs:
run:
runs-on: [ 'ubuntu-latest', 'windows-latest' ]
strategy:
matrix:
php-versions: ['7.3', '7.4', '8.0', '8.1']
name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.os }}
# The set of steps will be below
steps:
Теперь мы можем упомянуть шаги для заданий нашего GitHub Action. Это те шаги, которые должны выполняться каждый раз при запуске нашего GitHub Action.
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring
coverage: none
tools: phpunit:${{ matrix.phpunit-version }}, composer:v2
- name: Check PHP Version
run: php -v
- name: Check Composer Version
run: composer -V
- name: Validate composer.json & composer.lock
run: composer validate --strict
- name: Install PHP dependencies
run: composer install --no-interaction --no-progress --no-suggest
- name: Run Test Suite
run: vendor/bin/phpunit
Несколько шагов задания, таких как
- name: Check PHP Version
run: php -v
и
- name: Check Composer Version
run: composer -V
предназначены для получения дополнительной информации о версии, запущенной на вашем CI, на случай, если вам понадобится расследовать проблему, поступившую с вашего GitHub Action.
И следующее
- name: Validate composer.json & composer.lock
run: composer validate --strict
используется для проверки файла composer.json
перед установкой зависимостей.
Наконец, на последнем шаге будут выполнены модульные тесты
- name: Run Test Suite
run: vendor/bin/phpunit
Как только вы закончите с настройкой вашего CI-файла, GitHub автоматически запустит ваше новое действие рабочего процесса, которое вы только что добавили.
При новом коммите pushed или pull request (в зависимости от того, какое событие у вас настроено (on: [push,pull_request]
)), GitHub покажет статус каждого запуска CI.
? Вот, CI для Pull Request показывает, что все шаги пройдены ✅
? Вот, задание Action прошло ✅
*? Там задание не выполнено из-за ошибки в модульном тесте ❌ *
Скорость и кэширование
При использовании CI всегда полезно кэшировать необходимые зависимости. Некоторые CI (Travis, Circle CI или другие) не бесплатны, и вам придется платить за их использование. Когда вы кэшируете их, они становятся быстрее и потребляют меньше ресурсов. Таким образом, их выполнение также будет дешевле.
Если вы используете Composer, вы можете добавить эти два шага в задания вашего GitHub Action.
- name: Get Composer Cache Directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache Composer dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
Примечание: Вы также можете использовать хэш коммита key: mycache-${{ github.sha }}
в качестве ключа кэша для обновления кэша при публикации нового коммита. Это обычно полезно, если ваш проект — просто библиотека, и ваш composer.lock не будет изменен.
С помощью NPM
- name: Cache NPM deps
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: ${{ runner.os }}-npm-
Если вы используете Pipenv с Python,
- name: Cache Pipenv
uses: actions/cache@v2
with:
path: |
~/.cache/pip
~/.cache/pipenv
~/.local/share/virtualenvs/
key: pip-pipenv-${{ hashFiles('Pipfile.lock') }}
restore-keys: pip-pipenv-
- uses: actions/setup-python@v2
with:
python-version: 3.9
- run: pip install pipenv
- run: pipenv install --deploy --dev
Ресурс: GitHub: Кэширование зависимостей для ускорения рабочих процессов.
Пример ? https://github.com/pH-7/pH2Gravatar/blob/master/.github/workflows/test.yml
За пределами тестирования действий ?
Как я уже говорил, действия GitHub могут использоваться не только для запуска тестов.
Действительно, разработчики часто сталкиваются с тем, что выполняют повторяющиеся задачи, которые можно легко автоматизировать с помощью CI ?.
Вы можете использовать действия GitHub для гораздо большего, чем просто запуск тестов, например, для развертывания ваших изменений на GitHub Pages, повторной публикации пакетов NPM или даже для действия, которое создает PR с вашим пост-файлом DEV.to .md.
А вы? Как вы чаще всего используете GitHub Actions? ?
? Наконец, если вы хотите углубиться в PHP или JavaScript/Node, не забудьте заглянуть в мои курсы на Udemy https://www.udemy.com/user/pierresoria/.