我需要帮助来解决一些问题,我正在尝试基于 2 个不同的发布标签触发 2 个不同的工作流。我希望 prod-* 触发生产工作流程,而 dev-* 触发开发工作流程。
问题是两个标签都会触发两个工作流程,我不知道如何解决这个问题
我需要帮助来解决一些问题,我正在尝试基于 2 个不同的发布标签触发 2 个不同的工作流。我希望 prod-* 触发生产工作流程,而 dev-* 触发开发工作流程。
问题是两个标签都会触发两个工作流程,我不知道如何解决这个问题
该元素对事件tags
无效。因此,无论标签如何,都会为每个发布类型的事件release
触发工作流。没有事件标签的直接过滤器,因为有 for和事件。release
release
push
pull_request
因此,您可以在包含release 标记的上下文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:
# [...]
触发器在这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
发布标签:
编辑:请注意,您也可以使用 astartWith
而不是contains
if 表达式的函数。