Рабочие процессы, триггеры и задачи — Примеры
Пример 1 — Триггер, который запускает не ту работу
Каждый push в каждую ветку запускает полный конвейер тестов и развёртывания, поэтому pull request, меняющий только документацию, тратит раннеры, а развёртывание идёт из функциональной ветки. Ниже — используемый блок триггера. Перепишите его как политику: проверки на изменениях исходников, развёртывание только из основной ветки и ручная точка входа.
on: push
jobs:
test:
runs-on: ubuntu-latest
steps: [{ run: ./run-tests.sh }]
deploy:
runs-on: ubuntu-latest
steps: [{ run: ./deploy.sh }]
Решение
on:
pull_request:
paths: ["src/**"]
push:
branches: [main]
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps: [{ run: ./run-tests.sh }]
deploy:
needs: test
runs-on: ubuntu-latest
steps: [{ run: ./deploy.sh }]
Триггер — это политика, а не список команд: фильтр по путям не даёт изменению документации заново собирать приложение, а фильтр по ветке не пускает функциональную ветку к развёртыванию. Обычная ошибка — оставить самое широкое событие и добавить фильтры в задачи: это тратит раннеры и топит результат того прогона, который важен.
Пример 2 — Задача, которая полагается на файлы предыдущей
Задача тестов собирает фронтенд, а затем задача развёртывания ссылается на каталог сборки. Каждый прогон падает во второй задаче из-за отсутствующего пути, хотя первая проходит. Почините передачу и объясните отказ.
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: npm ci && npm run build
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- run: ./publish.sh dist/
Решение
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: npm ci && npm run build
- uses: upload-artifact
with: { name: dist, path: dist }
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: download-artifact
with: { name: dist, path: dist }
- run: ./publish.sh dist/
Каждая задача стартует на свежей машине с собственной выгрузкой, поэтому каталога, собранного первой задачей, во второй не существует; needs упорядочивает задачи, но не делится файловой системой. Именно выгрузка и загрузка артефакта связывают их, и она же оставляет запись о том, что именно было собрано, — так протестированное становится поставленным.
Подставьте свои имена действий и файлы репозитория там, где в этих набросках стоят заглушки.