如何从同一分支调用GitHub可复用工作流?
我有一个包含自定义Actions和可复用工作流的仓库,想要测试这些工件的变更——从PR运行的同一分支调用它们,验证行为是否符合预期。
我编写的工作流配置如下:
--- name: 'Test custom actions and reusable workflows' on: pull_request: branches: - main jobs: call-custom-action: runs-on: [ self-hosted, default ] steps: - name: get env vars id: get-env-vars # owner/repo is the repo that this workflow resides in uses: owner/repo/actions/my-custom-action@${{ env.GITHUB_HEAD_REF }} call-reusable-workflow: uses: owner/repo/.github/workflows/my-reusable-workflow.yml@${{ env.GITHUB_HEAD_REF }}
提交后出现报错:
Invalid workflow file: .github/workflows/test-reusable-workflow.yml#L19.
error parsing called workflow
".github/workflows/test-reusable-workflow.yml"
-> "owner/repo/.github/workflows/my-reusable-workflow.yml@${{env.GITHUB_HEAD_REF}}"
: failed to fetch workflow: reference to workflow should be either a valid branch, tag, or commit
我尝试将问题行修改为:
uses: owner/repo/.github/workflows/my-reusable-workflow.yml
但仍报错:
invalid value workflow reference: no version specified
显然无法通过表达式指定版本调用可复用工作流,请问是否存在从同一分支调用该工作流的方法?
方法一:使用PR头部提交的SHA指定版本
PR触发的工作流中,github.event.pull_request.head.sha上下文变量指向当前PR分支的最新提交哈希。由于SHA是明确的提交标识,可直接用于可复用工作流的版本指定,绕过表达式解析限制:
call-reusable-workflow: uses: owner/repo/.github/workflows/my-reusable-workflow.yml@${{ github.event.pull_request.head.sha }}
这种方式能确保调用的是PR分支上的最新可复用工作流版本,完全匹配测试需求。
方法二:简化同一仓库内的工作流引用
若调用的是当前仓库内的可复用工作流,可省略仓库路径,直接使用相对路径搭配SHA:
call-reusable-workflow: uses: ./.github/workflows/my-reusable-workflow.yml@${{ github.event.pull_request.head.sha }}
写法更简洁,效果与方法一一致。
关键说明
- 不能使用分支名表达式(如
${{ env.GITHUB_HEAD_REF }})的原因是:GitHub解析工作流文件时会提前校验可复用工作流的版本引用,动态分支名此时无法被识别为有效引用目标。 - 使用SHA不仅解决了解析问题,还能避免分支后续修改导致的测试不一致,确保测试的是PR提交时的版本。
内容的提问来源于stack exchange,提问作者jamiet

