如何通过GitHub Action将PHPUnit覆盖率报告截图嵌入PR评论?
解决方案:通过GitHub API上传PR专属附件实现图片直接显示
可以实现你想要的效果——利用GitHub的REST API将截图上传到PR专属的资产存储位置,再将返回的图片链接嵌入PR评论,就能让图片直接显示在评论内,完全复现手动拖拽上传的逻辑。
核心原理
手动拖拽图片到PR评论时,本质是调用了GitHub的「上传Issue资产」API,将文件存储到与PR绑定的专属位置,返回的URL是公开可直接渲染的。我们可以在GitHub Action中复现这个流程:
- 调用API将截图上传到当前PR的资产库
- 用返回的图片URL生成带Markdown图片语法的评论内容
- 调用API发布评论到PR
GitHub Action 实现示例
下面是完整的Action步骤,包含权限配置、图片上传和评论发布:
jobs: coverage-comment: runs-on: ubuntu-latest permissions: issues: write # 必须配置此权限才能上传资产和发布评论 steps: # 先执行你的PHPUnit测试、生成截图的步骤,示例: # - name: Run PHPUnit & generate coverage screenshot # run: ./your-coverage-screenshot-script.sh - name: Upload screenshot to PR and add comment uses: actions/github-script@v6 with: script: | const fs = require('fs'); const screenshotPath = './coverage-screenshot.png'; // 替换为你的截图实际路径 // 读取截图文件内容 const fileBuffer = fs.readFileSync(screenshotPath); // 上传图片到PR专属资产位置 const uploadResult = await github.rest.repos.uploadIssueAsset({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, name: 'phpunit-coverage-report.png', // 自定义显示的文件名 data: fileBuffer }); // 发布包含图片的评论 await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: ` ### PHPUnit 代码覆盖率报告  ` });
关键注意事项
- 权限配置:必须在job中设置
permissions: issues: write,否则GITHUB_TOKEN没有权限上传资产和发布评论。 - 文件路径:确保
screenshotPath指向你的截图实际生成路径,避免找不到文件的错误。 - API稳定性:使用
actions/github-script比直接用curl更可靠,它已封装了GitHub API的调用逻辑,无需手动处理认证和JSON解析。
为什么之前的方案不可行
- Base64编码的data URI:GitHub明确禁止在PR/Issue评论中渲染此类链接,属于安全限制。
- 构建产物链接:构建产物的URL是临时的,且需要GitHub认证才能访问,无法在公开评论中直接渲染图片。
这个方案完全复刻了手动上传图片的流程,生成的图片链接是PR专属的,无需公开上传到外部存储,且能直接在评论中显示。
内容的提问来源于stack exchange,提问作者Xenology
相关产品推荐
相关产品推荐

