【发布时间】:2021-10-05 01:32:51
【问题描述】:
我需要帮助来解决一些问题,我正在尝试基于 2 个不同的发布标签触发 2 个不同的工作流。我希望 prod-* 触发生产工作流程,而 dev-* 触发开发工作流程。
问题是两个标签都会触发两个工作流,我不知道如何解决这个问题
【问题讨论】:
标签: github github-actions building-github-actions
我需要帮助来解决一些问题,我正在尝试基于 2 个不同的发布标签触发 2 个不同的工作流。我希望 prod-* 触发生产工作流程,而 dev-* 触发开发工作流程。
问题是两个标签都会触发两个工作流,我不知道如何解决这个问题
【问题讨论】:
标签: github github-actions building-github-actions
published 触发器在这两种情况下都使用(独立于标签),因为您的工作流将针对已发布的OR 标签(带有通知模式)事件启动。
要仅对特定标签执行操作,您必须从 $GITHUB_REF (env-var) 中提取标签版本,例如使用以下步骤并在第一个作业中输出:
- name: Get the version
id: get_tag_version
run: echo ::set-output name=version::${GITHUB_REF/refs\/tags\//}
然后在其他 2 个作业上使用 if condition 来检查标记版本 包含 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 发布标签:
编辑:请注意,您还可以对 if 表达式使用 startWith 而不是 contains 函数。
【讨论】:
tags 元素对release 事件无效。因此,无论标签如何,每个 published 类型的 release 事件都会触发工作流。与push 和pull_request 事件一样,release 事件的标签没有直接过滤器。
因此,您可以在包含发布标签的上下文中结合github.ref 结合使用以作业为条件的if。
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:
# [...]
【讨论】:
outputs),因为它不那么冗长。很好的答案??