You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何等待两个GitHub Workflow完成并合并Go覆盖率文件生成准确统计

解决GitHub Actions中多Workflow覆盖率合并问题

1. 等待两个Workflow完成并收集覆盖率文件

首先需要让两个Workflow将生成的覆盖率文件上传为GitHub Artifact,再创建一个专门的合并Workflow,监听前两个Workflow的完成事件,确保两者都成功后再执行合并操作。

步骤1:在Workflow A和B中上传覆盖率文件

在Workflow A的测试步骤后添加上传动作:

- name: 上传Workflow A的覆盖率文件
  uses: actions/upload-artifact@v4
  with:
    name: coverage-A
    path: ./coverage-A.out # 替换为你的覆盖率文件实际路径

在Workflow B中上传两个覆盖率文件:

- name: 上传Workflow B的覆盖率文件
  uses: actions/upload-artifact@v4
  with:
    name: coverage-B
    path: |
      ./coverage-B1.out # 替换为第一个文件路径
      ./coverage-B2.out # 替换为第二个文件路径

步骤2:创建合并触发的Workflow

新建merge-coverage.yml文件,设置仅在Workflow A和B都成功完成后触发:

on:
  workflow_run:
    workflows: ["Workflow A", "Workflow B"] # 替换为你的Workflow名称
    types: [completed]
    branches: [main] # 根据你的目标分支调整

jobs:
  merge-coverage:
    runs-on: ubuntu-latest
    # 仅当两个Workflow的最新运行都成功时执行
    if: >-
      ${{ github.event.workflow_run.conclusion == 'success' &&
      (await github.rest.actions.listWorkflowRuns({
        owner: github.repository_owner,
        repo: github.event.repository.name,
        workflow_id: github.event.workflow_run.workflow_name == 'Workflow A' ? 'Workflow B' : 'Workflow A',
        status: 'completed',
        branch: 'main',
        per_page: 1
      })).workflow_runs[0].conclusion == 'success' }}
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 下载所有覆盖率Artifact
        uses: actions/download-artifact@v4
        with:
          path: coverage-files
          pattern: coverage-*
          merge-multiple: true

2. 合并多个Go覆盖率文件

根据你使用的Go版本,选择对应的合并方式:

方式1:Go 1.20+(官方工具)

Go 1.20及以上版本自带covdata工具,支持标准.out文件的转换与合并:

# 将所有.out文件转换为covdata格式
for file in coverage-files/*.out; do
  go tool covdata textfmt -i="$file" -o="${file%.out}.covdata"
done

# 合并所有covdata文件
go tool covdata merge -i=coverage-files/*.covdata -o=merged.covdata

# 将合并后的covdata转换回标准.out格式
go tool covdata fmt -i=merged.covdata -o=merged-coverage.out

# 可选:生成HTML覆盖率报告
go tool cover -html=merged-coverage.out -o coverage-report.html

方式2:Go 1.20以下(第三方工具)

使用gocovmerge工具合并,先安装再执行:

# 安装gocovmerge
go install github.com/wadey/gocovmerge@latest

# 合并三个覆盖率文件
gocovmerge coverage-files/coverage-A.out coverage-files/coverage-B1.out coverage-files/coverage-B2.out > merged-coverage.out

合并后的merged-coverage.out文件即可用于生成准确的整体代码覆盖率统计。

内容的提问来源于stack exchange,提问作者Maria Ines Parnisari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:31:06