如何在同项目的GitHub Actions不同工作流之间共享Docker镜像标签
GitHub Actions跨工作流传递Docker镜像标签的可行方案
有三种常用的落地方式可以实现该需求:
方案1:使用工作流制品(Artifacts)存储标签
该方案不需要额外权限配置,适合需要保留历史标签记录的场景:
- 第一个push触发的工作流中,完成镜像构建推送后,将生成的标签写入本地文件,上传为工作流制品:
# 假设你已将生成的镜像标签存入DOCKER_IMAGE_TAG环境变量 - name: 写入镜像标签到本地文件 run: echo "${{ env.DOCKER_IMAGE_TAG }}" > ./image-tag.txt - name: 上传标签为工作流制品 uses: actions/upload-artifact@v4 with: name: docker-image-tag path: ./image-tag.txt retention-days: 30 # 可自定义制品保留天数,最长90天
- 第二个手动触发的工作流中,先拉取第一个工作流最近成功运行上传的制品,读取标签即可使用:
- name: 下载最新镜像标签制品 uses: dawidd6/action-download-artifact@v3 with: workflow: 替换为第一个工作流的yml文件名,例如build-image.yml workflow_conclusion: success name: docker-image-tag - name: 读取标签到环境变量 run: echo "DOCKER_IMAGE_TAG=$(cat ./image-tag.txt)" >> $GITHUB_ENV # 后续部署步骤直接引用${{ env.DOCKER_IMAGE_TAG }}即可
方案2:使用仓库变量持久化存储最新标签
该方案适合只需要用到最新构建的镜像标签的场景,读取更简单:
- 首先在仓库的Settings → Secrets and variables → Actions → Variables中新建一个变量,例如命名为LATEST_DOCKER_TAG,初始值可以随便填。
- 在第一个工作流的配置中为GITHUB_TOKEN开放变量读写权限,构建完成后调用API更新该变量的值:
# 工作流开头配置权限 permissions: actions: write contents: read # 构建镜像后的步骤 - name: 更新仓库变量存储最新镜像标签 uses: action-pack/set-variable@v1 with: name: LATEST_DOCKER_TAG value: ${{ env.DOCKER_IMAGE_TAG }} token: ${{ secrets.GITHUB_TOKEN }}
- 第二个工作流中直接引用仓库变量即可:
${{ vars.LATEST_DOCKER_TAG }}
方案3:工作流触发时直接传递参数
如果需要保留手动触发能力的同时,也支持第一个工作流构建完成后自动触发部署,可以采用该方案:
- 先在第二个手动工作流的触发配置中新增入参:
on: workflow_dispatch: inputs: docker_image_tag: description: "待部署的Docker镜像标签" required: true type: string
- 在第一个工作流末尾新增触发第二个工作流的步骤,直接传递镜像标签作为参数:
- name: 触发部署工作流 uses: benc-uk/workflow-dispatch@v1 with: workflow: 替换为第二个工作流的yml文件名,例如deploy.yml inputs: docker_image_tag: ${{ env.DOCKER_IMAGE_TAG }} token: ${{ secrets.GITHUB_TOKEN }}
该方案下手动触发部署时,你可以手动填写要部署的标签值,自动触发时则由第一个工作流自动传入最新构建的标签。
内容的提问来源于stack exchange,提问作者tmp dev
相关产品推荐
相关产品推荐

