如何等待两个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
相关产品推荐
相关产品推荐

