Github Actions如何获取关联提交的全部标签?求方法与工具推荐
问题背景
我正尝试将一条Jenkins流水线迁移至Github Actions。该流水线通过CLI从特性分支部署,示例命令如下:
deploy --env develop --region us-west-2 --pkg service1 service2 service3
我的Github Actions工作流基于标签触发:
on: workflow_dispatch: push: tags: - 'us-west-2-[0-9]+.[0-9]+'
在Jenkins中,我可通过git tag --points-at ${env.GIT_COMMIT}查看所有关联标签。在Github Actions的YAML文件中我尝试了如下写法:
- run: echo "TAG_NAMES=$(git tag --points-at ${{ env.GIT_COMMIT }})" >> $GITHUB_ENV - run: echo $TAG_NAMES
但预期返回所有服务的标签,实际仅返回1个。现请教两个问题:
- 在Github Actions工作流中,有没有更好的方法生成全部标签名称列表?
- 是否有现成的Github Action可实现此功能?
解决方案
1. 更可靠的标签列表生成方法
首先要解决的是Github Actions默认拉取深度不足的问题:actions/checkout默认只拉取最新1次提交,本地仓库没有完整标签信息,所以第一步要修改checkout步骤拉取全量历史:
- uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取所有提交和标签
然后处理标签列表写入环境变量的截断问题——直接用git tag输出写入时,换行符会被截断导致只保留第一个标签。可以用tr命令将换行转为空格/逗号,把标签列表转为单行:
- run: | TAG_LIST=$(git tag --points-at ${{ env.GITHUB_SHA }}) echo "TAG_NAMES=$(echo "$TAG_LIST" | tr '\n' ' ')" >> $GITHUB_ENV - run: echo "所有关联标签:$TAG_NAMES"
如果需要逗号分隔(方便后续脚本处理),可以调整为:
- run: | TAG_LIST=$(git tag --points-at ${{ env.GITHUB_SHA }}) echo "TAG_NAMES=$(echo "$TAG_LIST" | tr '\n' ',' | sed 's/,$//')" >> $GITHUB_ENV
2. 现成的Github Action实现
方式一:用actions/github-script调用Github API
无需拉取全量仓库,直接通过API获取当前提交的关联标签,更高效:
- uses: actions/github-script@v7 id: get-tags with: script: | const tags = await github.rest.repos.listTagsForCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); return tags.data.map(tag => tag.name).join(' '); - run: echo "所有关联标签:${{ steps.get-tags.outputs.result }}"
方式二:使用专门的标签处理Action
rlespinasse/github-slug-action会自动将当前提交的所有标签用逗号分隔,存入GIT_TAGS环境变量:
- uses: rlespinasse/github-slug-action@v4 - run: echo "所有关联标签:${{ env.GIT_TAGS }}"
内容的提问来源于stack exchange,提问作者nray
相关产品推荐
相关产品推荐

