Как предотвратить дублирование сборок в GitHub Actions, когда изменения происходят как в общем проекте, так и в зависимостях, используя workflow_call?

Вопрос или проблема

Я работаю с репозиторием на 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) должно вызывать другие рабочие в определённых случаях, а также исключать их запуск, когда это не требуется.

Решение

  1. Оптимизация событий (on): Определите условия, при которых будут срабатывать ваши рабочие. Основная идея заключается в том, чтобы использовать переменные окружения, задаваемые в Shared-Build01 для управления выполнением другого рабочего процесса.

  2. Создание общей переменной: В рабочем процессе 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'.

Таким образом, вы сможете контролировать запуск рабочих процессов, предотвращая дублирование сборок и корректно обрабатывая изменения в каждом из проектов.

Оцените материал
Добавить комментарий

Капча загружается...