如何在GitHub Action内部获取自身被调用时的ref(分支/版本)?
GitHub Action内部获取自身调用Ref及仓库签出方案
一、不用调用者传参,直接获取Action的调用Ref
1. 外部跨仓库Action
如果你的Action是独立仓库的(比如用uses: [ORG]/my-action@v1调用),别绕弯路,${{ github.action_ref }}就是你要的v1。官方定义里这个变量就是「正在执行的Action的Ref」,外部Action场景下,它直接返回你调用时指定的标签、分支或提交哈希。之前你觉得它返回调用者的Ref,应该是混淆了本地Action的场景。
2. 本地Action(同仓库)
如果Action和工作流在同一个仓库(比如uses: ./.github/actions/my-action),这时候github.action_ref确实会返回工作流所在仓库的Ref——因为本地Action没单独指定Ref,默认用的就是工作流当前的版本。这种场景下直接用${{ github.ref_name }}就行,和Action代码的Ref是一致的。
通用兜底方案:Git命令解析
要是上面的上下文变量不适用,直接进入Action代码目录(${{ github.action_path }})执行Git命令拿Ref:
cd ${{ github.action_path }} # 优先拿分支名,没有就拿标签,再没有就拿短提交哈希 ACTION_REF=$(git symbolic-ref --short HEAD 2>/dev/null || git describe --tags --exact-match 2>/dev/null || git rev-parse --short HEAD) echo "Action Ref: $ACTION_REF"
不管是Composite、JS还是Docker Action,这个方法都能用。
二、动态签出Action所在仓库
把上面拿到的Ref用到actions/checkout里,就能自动签出对应版本的仓库,不用硬编码版本号:
Composite Action示例
runs: using: composite steps: - name: 签出调用者仓库 uses: actions/checkout@v3 with: path: main - name: 获取当前Action的Ref id: get-action-ref shell: bash run: | # 自动判断场景:外部Action用github.action_ref,本地用github.ref_name ACTION_REF="${{ github.action_ref != '' ? github.action_ref : github.ref_name }}" echo "action_ref=$ACTION_REF" >> $GITHUB_OUTPUT - name: 签出Action所在仓库 uses: actions/checkout@v3 with: repository: [ORG]/my-action # 替换成你的Action仓库地址 ref: ${{ steps.get-action-ref.outputs.action_ref }} path: validation
内容的提问来源于stack exchange,提问作者Stephan Prat
相关产品推荐
相关产品推荐

