Рабочие процессы, триггеры и задачи — Примеры

Пример 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 упорядочивает задачи, но не делится файловой системой. Именно выгрузка и загрузка артефакта связывают их, и она же оставляет запись о том, что именно было собрано, — так протестированное становится поставленным.

Подставьте свои имена действий и файлы репозитория там, где в этих набросках стоят заглушки.