推送指向无对应工作流提交的Tag未触发workflow,是否为预期行为?
GitHub Actions 标签触发工作流的行为疑问解答
问题背景
仓库结构如下:
- 提交记录
first-commit: add test file second-commit: add workflow
.github/workflows/tag.yaml
name: tag_handler on: push: tags: - "*" jobs: hello: runs-on: ubuntu-22.04 steps: - run: echo "hello from tag push"
.github/workflows/push.yaml:
name: push_handler on: push: jobs: hello: runs-on: ubuntu-22.04 steps: - run: echo "hello from push"
推送指向second-commit的Tag时,push_handler和tag_handler均会被触发;但推送指向first-commit的Tag时,仅push_handler触发,tag_handler无响应。观察到:
on.push触发时会引用分支最新的工作流定义,即便该工作流在Tag指向的提交中不存在;on.push.tags则引用Tag指向的提交当时的工作流定义,由于first-commit中无tag_handler,因此未触发。
需求:推送指向first-commit的Tag时,也能触发second-commit中新增的tag_handler,询问这是预期设计还是疏漏。
解答
这是GitHub Actions的预期设计行为,并非配置或解析疏漏,核心逻辑差异在于两种触发条件的工作流选取规则:
on: push(无标签限定):当推送事件发生时(包括推标签),GitHub会使用当前推送目标分支的最新提交中的工作流定义来执行。哪怕标签指向的旧提交里没有这个工作流,只要分支最新版本有,就会触发。on: push.tags(标签限定触发):针对标签推送的触发规则,GitHub会严格使用标签所指向的提交中的工作流定义来判断是否执行。因为first-commit里还没有tag_handler这个工作流文件,所以自然不会触发。
如果想要实现推送旧提交的标签时也触发新添加的tag_handler,可以采用以下方案:
将tag_handler的触发规则修改为on: push,同时在工作流中添加条件判断,只在推送标签时执行任务。示例修改如下:
name: tag_handler on: push: jobs: hello: runs-on: ubuntu-22.04 if: startsWith(github.ref, 'refs/tags/') steps: - run: echo "hello from tag push"
这样修改后,无论是推指向新提交还是旧提交的标签,都会触发这个工作流,然后通过if条件过滤出标签推送的情况执行任务。
内容的提问来源于stack exchange,提问作者CatBraaain
相关产品推荐
相关产品推荐

