Вопрос или проблема
Множественные рабочие процессы GitHub не запускаются
У меня проблема с рабочими процессами. У меня есть несколько файлов в директории .github/workflows
. Для целей данного поста, давайте скажем, что их два: build.yml
и cypress.yml
. Я хочу запускать рабочий процесс/задачу только в том случае, если выполнены критерии paths
, чтобы тесты cypress не запускались, пока не будет добавлен/изменен файл *.test-cy.tsx
.
name: CI
on:
push:
paths: ["**/*", "!.github/**/*"]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
steps:
- uses: actions/checkout@v3
- name: Использовать Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
cache-dependency-path: "package-lock.json"
- run: npm ci
- run: npm run build --if-present
- run: npm run build-storybook --if-present
name: Cypress
on:
push:
paths: ["src/**/*.test-cy.{js,jsx,ts,tsx}"]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
steps:
- uses: actions/checkout@v3
- name: Использовать Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
cache-dependency-path: "package-lock.json"
- run: npm ci
- run: npm run test:cypress --if-present
Когда я отправляю коммит, запускается только первый процесс. Я пытался также сделать это в одном рабочем процессе с несколькими задачами, но не смог найти правильное условие для if:
.
Это шпаргалка по паттернам фильтрации для github action. Здесь нет символов {
и }
. Это может сработать:
name: Cypress
on:
push:
paths:
- 'src/**/*.test-cy.tsx?'
- 'src/**/*.test-cy.jsx?'
jobs:
test:
runs-on: ubuntu-latest
Ответ или решение
Ваша проблема со срабатыванием нескольких рабочих процессов в GitHub Actions может быть связана с тем, как вы настраиваете триггеры для каждого рабочего процесса. Давайте рассмотрим детали и предложим решение.
Вы описали, что у вас есть два файла в каталоге .github/workflows
: build.yml
и cypress.yml
. Цель состоит в том, чтобы тесты Cypress запускались только тогда, когда определенные файлы с расширением *.test-cy.tsx
добавлены или изменены, при этом рабочий процесс сборки build.yml
должен запускаться на все изменения в коде, кроме файлов в директории .github
.
В вашем текущем варианте рабочего процесса Cypress, триггер настроен на следующие пути:
on:
push:
paths: ["src/**/*.test-cy.{js,jsx,ts,tsx}"]
Однако у вас также есть другие файлы с расширениями, которые могут не соответствовать вашим ожиданиям. Вам нужно исправить определение путей в cypress.yml
. Попробуйте следующий подход:
Шаг 1: Исправление cypress.yml
Избегайте использования символа {}
. Вместо этого укажите пути более явно:
name: Cypress
on:
push:
paths:
- 'src/**/*.test-cy.tsx'
- 'src/**/*.test-cy.jsx'
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
cache-dependency-path: "package-lock.json"
- run: npm ci
- run: npm run test:cypress --if-present
Шаг 2: Объединение рабочих процессов (опционально)
Если вы хотите объединить оба рабочих процесса в один и применять условия, вы можете использовать директиву if:
для выполнения отдельных заданий в зависимости от изменений файлов:
name: CI
on:
push:
paths: ["**/*", "!.github/**/*"]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
cache-dependency-path: "package-lock.json"
- run: npm ci
- run: npm run build --if-present
- run: npm run build-storybook --if-present
test:
runs-on: ubuntu-latest
needs: build
if: ${{ github.event_name == 'push' && (github.event.head_commit.message contains 'test-cy') }} # Условие для тестов.
strategy:
matrix:
node-version: [20.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
cache-dependency-path: "package-lock.json"
- run: npm ci
- run: npm run test:cypress --if-present
Заключение
Теперь ваши рабочие процессы будут правильно срабатывать в соответствии с заданными условиями. Убедитесь, что ваши коммиты содержат изменения в соответствующих файлах при тестировании. Если у вас есть другие вопросы или проблемы, не стесняйтесь задавать их!