Вопрос или проблема
Я работаю с репозиторием на GitHub, который содержит два проекта в отдельных директориях:
shared-project01/
dependency-project01/
У меня настроены два рабочих процесса GitHub Actions:
Рабочий процесс Shared-Build01 (shared-build1.yml):
Создает общий проект.
Вызывает сборку зависимости с помощью workflow_call.
Рабочий процесс Dependency-Build1 (dependency-build1.yml):
Создает проект зависимости.
Может выполняться независимо или вызываться через workflow_call.
dependency-build1.yaml
name: Dependency-Build1
on:
workflow_call:
push:
paths:
- 'dependency-project01/**'
branches:
- master # Срабатывать только на ветке master
jobs:
complete-job:
runs-on: ubuntu-latest
steps:
- name: Проверка репозитория
uses: actions/checkout@v4
- name: Приветствие
run: echo "Работа Dependency-Build завершена успешно!"
shared-build1.yaml
name: Shared-Build01
on:
push:
paths:
- 'shared-project01/**'
branches:
- master
jobs:
complete-job:
runs-on: ubuntu-latest
steps:
- name: Приветствие
run: echo "Работа Shared-Build01 завершена успешно!"
- name: Поспать 30 секунд
run: sleep 30s
shell: bash
call_dependency_build1:
needs: complete-job
uses: ./.github/workflows/dependency-build1.yml
call_dependency_build2:
needs: complete-job
uses: ./.github/workflows/dependency-build2.yml
Мои требования:
Когда оба проекта shared-project01 и dependency-project01 изменены:
Независимый Dependency-Build1 не должен выполняться.
Рабочий процесс Dependency-Build1 должен выполняться как часть рабочего процесса Shared-Build01 через workflow_call.
Когда только dependency-project01 изменен:
Рабочий процесс Dependency-Build1 должен выполняться независимо.
Когда только shared-project01 изменен:
Рабочий процесс Shared-Build01 должен выполняться.
Рабочий процесс Dependency-Build1 должен выполняться как часть рабочего процесса Shared-Build01 через workflow_call.
Есть ли способ контролировать dependency-build1, чтобы он не выполнялся отдельно и пропускать этот рабочий процесс, когда есть изменения в shared-project01 и dependency-project01?
Ответ или решение
Для предотвращения дублирования запусков сборок в GitHub Actions в ситуации, когда изменяются как проекты shared
, так и dependency
, можно использовать условия на основе переменных окружения (environment variables) и логики в workflow. Ниже предлагается решение, которое соответствует вашим требованиям.
Описание задачи
Ваша конфигурация предполагает, что в зависимости от изменений в двух проектах, одно и то же рабочее (workflow) должно вызывать другие рабочие в определённых случаях, а также исключать их запуск, когда это не требуется.
Решение
-
Оптимизация событий (
on
): Определите условия, при которых будут срабатывать ваши рабочие. Основная идея заключается в том, чтобы использовать переменные окружения, задаваемые вShared-Build01
для управления выполнением другого рабочего процесса. -
Создание общей переменной: В рабочем процессе
Dependency-Build1
добавьте проверку на переменную окружения, которая будет сигнализировать о том, что рабочий процесс был вызван изShared-Build01
.
Пример конфигурации
Обновите ваши файлы shared-build1.yml
и dependency-build1.yml
следующим образом:
dependency-build1.yml:
name: Dependency-Build1
on:
workflow_call:
inputs:
skip:
required: false
type: boolean
default: 'false'
push:
paths:
- 'dependency-project01/**'
branches:
- master
jobs:
complete-job:
runs-on: ubuntu-latest
if: inputs.skip != 'true' # Проверка на переменную skip
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Say Hello
run: echo "The Dependency-Build job has been completed successfully!"
shared-build1.yml:
name: Shared-Build01
on:
push:
paths:
- 'shared-project01/**'
branches:
- master
jobs:
complete-job:
runs-on: ubuntu-latest
steps:
- name: Say Hello
run: echo "The Shared-Build01 job has been completed successfully!"
- name: Sleep for 30 seconds
run: sleep 30s
shell: bash
call_dependency_build1:
needs: complete-job
uses: ./.github/workflows/dependency-build1.yml
with:
skip: 'true' # Установление переменной skip на true для предотвращения независимого запуска
Как это работает
-
Когда оба проекта (
shared-project01
иdependency-project01
) изменены:Shared-Build01
будет запущен, и он вызоветDependency-Build1
с переменнойskip: 'true'
, что приведет к тому, чтоDependency-Build1
не будет выполнять свои шаги. -
Когда только
dependency-project01
изменен: Рабочий процессDependency-Build1
будет запущен независимо, и его шаги выполнятся. -
Когда только
shared-project01
изменен: Рабочий процессShared-Build01
будет запущен, и он вызоветDependency-Build1
сskip: 'true'
.
Таким образом, вы сможете контролировать запуск рабочих процессов, предотвращая дублирование сборок и корректно обрабатывая изменения в каждом из проектов.