GitHub Workflows master分支构建Docker追加多标签实现方法
问题根因
双构建触发、镜像标签SHA不一致的核心原因是Pi-hole监控工作流拆分了两次独立git push操作:先推送版本标签,再推送master分支提交,两次推送分别匹配Docker构建工作流的「master分支推送」「pihole-**格式标签推送」两个触发规则,因此启动两次独立构建任务,两次构建独立运行,自然产出的镜像SHA不统一,还会重复覆盖latest标签。
修复方案
总共需要修改两处工作流配置,实现单次构建打全所有标签。
1. 修改Pi-hole版本监控工作流
将原有的两次拆分推送改为单次批量推送,避免产生多个触发事件。找到工作流中Commit latest release version步骤,替换原有推送逻辑:
- name: Commit latest release version if: steps.git-check.outputs.modified == 'true' run: | git config --global user.name 'Hossy' git config --global user.email 'Hossy@users.noreply.github.com' git commit -am "New Pi-hole release ${{ steps.pi-hole_ver.outputs.pihole-latest }}" git tag -am "Pi-hole ${{ steps.pi-hole_ver.outputs.pihole-latest }}" pihole-${{ steps.pi-hole_ver.outputs.pihole-latest }} # 一次性推送master分支和关联标签,避免产生两次独立push事件 git push --follow-tags origin master
删除原配置中单独推送tag、单独推送master分支的两行git push命令。
2. 修改Docker镜像构建发布工作流
2.1 调整触发规则
移除工作流触发条件中对tag推送事件的监听,所有镜像构建统一由master分支推送事件触发,从根源避免重复触发:
on: schedule: - cron: '37 8 1,15 * *' push: branches: [ master ] # 删除原有的tags: [ 'pihole-**' ]配置 paths-ignore: [ '.github/**' ] pull_request: branches: [ master ] workflow_dispatch:
2.2 补全代码检出步骤
在构建任务的steps最开头添加代码检出步骤,配置拉取完整提交历史和标签,用于后续自动识别版本标签:
steps: # 检出仓库完整代码,拉取全量历史与标签 - name: Checkout repository uses: actions/checkout@v3 with: fetch-depth: 0
2.3 调整元数据标签规则
修改Docker元数据提取步骤的标签规则,在master分支构建时自动识别当前提交绑定的pihole-**格式标签,和分支标签、latest标签合并输出:
- name: Extract Docker metadata id: meta uses: docker/metadata-action@v4.0.1 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=schedule type=ref,event=branch type=ref,event=pr type=raw,value=latest,enable={{is_default_branch}} # 自动识别当前master提交上绑定的pihole-开头标签,作为镜像标签 type=match,pattern=pihole-(.*),group=1,prefix=pihole-,enable=${{ github.ref == 'refs/heads/master' }}
其余登录、构建推送步骤保持原有配置不变即可。
效果验证
- 手动提交更新到master分支(无新tag):仅触发1次构建,自动给镜像打
master、latest两个标签,两个标签对应镜像SHA完全一致,历史版本标签不受影响。 - 监控工作流检测到Pi-hole新版本自动提交:仅触发1次master分支推送对应的构建任务,构建时自动识别关联的版本标签,一次性给镜像打
master、latest、pihole-v*.*三个标签,所有标签对应同一次构建产出的镜像,SHA完全一致,不会重复构建、重复覆盖标签。
内容的提问来源于stack exchange,提问作者Hossy
相关产品推荐
相关产品推荐

