Github 动作条件触发器
Github Actions Conditional Trigger
我需要帮助解决问题,我正在尝试根据 2 个不同的发布标签触发 2 个不同的工作流程。我希望 prod-* 触发生产工作流,并希望 dev-* 触发开发工作流。
问题是两个标签都会触发两个工作流,我不知道如何解决这个问题
(我已经取消了这两个操作,但如您所见,它们触发了)
这里的两种情况都使用 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-
(需要第一个job) 为每个场景执行你想要的操作。
这是一个可以使用的完整示例:
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
事件触发工作流。对于具有 release
event as there is for push
and pull_request
事件的标签没有直接过滤器。
因此,您可以在包含发布标签的上下文中结合 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:
# [...]
我需要帮助解决问题,我正在尝试根据 2 个不同的发布标签触发 2 个不同的工作流程。我希望 prod-* 触发生产工作流,并希望 dev-* 触发开发工作流。
问题是两个标签都会触发两个工作流,我不知道如何解决这个问题
(我已经取消了这两个操作,但如您所见,它们触发了)
这里的两种情况都使用 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-
(需要第一个job) 为每个场景执行你想要的操作。
这是一个可以使用的完整示例:
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
事件触发工作流。对于具有 release
event as there is for push
and pull_request
事件的标签没有直接过滤器。
因此,您可以在包含发布标签的上下文中结合 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:
# [...]