#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.