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

如何将Bazel测试生成的文件输出至GitHub Artifacts

解决Bazel沙盒下测试生成文件的GitHub Artifacts收集问题

核心问题分析

你用genrule的思路存在本质问题——genrule是构建阶段执行的逻辑,依赖的srcs必须是构建前就存在的静态文件,但测试生成的截图、HTML是测试运行阶段的动态产物,genrule无法捕获这些运行时生成的内容,自然没法打包到输出文件里。另外Bazel沙盒会清理测试过程中写入非指定目录的文件,只有写到Bazel预留的测试输出目录的文件才会被保留。

解决方案步骤

1. 修改测试代码,输出到Bazel指定的测试输出目录

在Jest/Puppeteer测试中,将生成的文件写入Bazel提供的TEST_UNDECLARED_OUTPUTS_DIR环境变量指定的目录,这个目录是Bazel沙盒专门用来保存测试额外输出的,测试结束后不会被删除:

// 测试代码中的文件生成逻辑示例
const outputDir = process.env.TEST_UNDECLARED_OUTPUTS_DIR || './local-test-outputs';
// 生成错误截图
await page.screenshot({ path: `${outputDir}/failure-screenshot-${Date.now()}.png` });
// 生成错误页面HTML
fs.writeFileSync(`${outputDir}/failure-report.html`, pageContent);

2. 配置GitHub Actions工作流

在你的.github/workflows/xxx.yml文件中,执行Bazel测试后,直接从Bazel保留的测试输出目录收集文件:

jobs:
  run-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Bazel
        uses: bazelbuild/setup-bazelisk@v3
      - name: Execute tests with Bazel
        run: bazel test //path/to/your/test:target --keep_going --test_output=errors
      - name: Upload test failure artifacts
        uses: actions/upload-artifact@v4
        with:
          name: test-failure-assets
          # 匹配所有测试目标的未声明输出文件
          path: bazel-testlogs/**/test.outputs/**
          # 可选:仅在测试失败时上传
          if: failure()

关键路径说明

Bazel会自动将TEST_UNDECLARED_OUTPUTS_DIR中的文件复制到仓库根目录下的bazel-testlogs/<测试包路径>/<测试目标名>/test.outputs目录中,所以在GitHub Actions里直接用bazel-testlogs/**/test.outputs/**作为路径就能捕获所有测试生成的文件。

如果需要自定义输出目录,可以在bazel test命令中手动指定环境变量:

bazel test //path/to/test:target --test_env=TEST_UNDECLARED_OUTPUTS_DIR=$(pwd)/custom-test-outputs

对应的Artifacts路径就改成custom-test-outputs/**。

为什么原来的genrule不适用

genrule的执行时机在测试之前,它只能处理构建阶段已存在的文件,无法感知测试运行时生成的动态内容。而且genrule的输出会被放到Bazel的缓存目录(默认是~/.cache/bazel),这个目录不在GitHub Actions的工作空间内,自然无法被Artifacts捕获。

内容的提问来源于stack exchange,提问作者Andrew Moss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:18