Условный Триггер действий Github

#github #github-actions #building-github-actions

Вопрос:

Мне нужна помощь, чтобы кое-что понять, я пытаюсь запустить 2 разных рабочих процесса на основе 2 разных тегов выпуска. Я хочу, чтобы prod-* запускал рабочий процесс производства, а dev-* для рабочего процесса разработки.

Проблема в том, что оба тега запускают оба рабочих процесса, и я понятия не имею, как это исправить

введите описание изображения здесь

(Я отменил оба действия, но они сработали, как вы можете видеть) введите описание изображения здесь

Ответ №1:

tags Элемент недопустим для release событий. Следовательно, рабочий процесс запускается для каждого release события типа, опубликованного независимо от тега. Прямого фильтра для тегов с release событием нет, как для push и pull_request события.

Таким образом, вы можете использовать if условие для заданий в сочетании с github.ref в контексте, содержащем тег выпуска.

 name: Deploy

on:
  release:
    types: [published]

jobs:
  deploy-dev:
    name: Deploy to development
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/dev-')
    steps:
      # [...]

  deploy-prod:
    name: Deploy to production
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/prod-')
    steps:
      # [...]
 

Комментарии:

1. Мы оба делали одно и то же по-разному. Однако ваше решение выглядит проще (без использования outputs ) для того, чтобы быть менее подробным. Отличный ответ 🙂 👍

2. @GuiFalourd Спасибо. Да, идея в основном одна и та же, и всегда здорово видеть, как все можно решить по-разному.

Ответ №2:

Здесь published триггер используется в обоих случаях (независимо от тега), потому что рабочий процесс начнется для опубликованных OR событий тегов (с информированным шаблоном).

Чтобы выполнить операцию только для определенного тега, вам нужно будет извлечь версию тега из $GITHUB_REF (env-var), например, используя шаг, как показано ниже, с выводом в первом задании:

 - name: Get the version 
  id: get_tag_version 
  run: echo ::set-output name=version::${GITHUB_REF/refs/tags//}
 

А затем используйте if condition 2 других задания, чтобы проверить, содержит prod- ли версия тега или dev- (требуется первое задание) для выполнения операции, которую вы хотите для каждого сценария.

Вот полный пример того, что можно было бы использовать:

 name: Example

on:
  release:
    types: [published]

jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      tag_version: ${{ steps.get_tag_version.outputs.version }}
    steps:
     - name: Get the version 
       id: get_tag_version 
       run: echo ::set-output name=version::${GITHUB_REF/refs/tags//}

   job2: # will be executed on for dev- tag
    runs-on: ubuntu-latest
    needs: [job1]
    if: contains( needs.job1.outputs.tag_version , 'dev-')
    steps:
     [...]

   job3: # will be executed on for prod- tag
    runs-on: ubuntu-latest
    needs: [job1]
    if: contains( needs.job1.outputs.tag_version , 'prod-')
    steps:
     [...]
   
 

Я закодировал рабочий процесс для проверки реализации выше, и он работал так, как ожидалось, создавая prod-2 тег выпуска:

Пример

РЕДАКТИРОВАТЬ: Обратите внимание, что вы также можете использовать a startWith вместо contains функции для выражения if.