【问题标题】:Bazel overwriting test logs and BuildEventProtocol via BuildEventServiceBazel 通过 BuildEventService 覆盖测试日志和 BuildEventProtocol
【发布时间】:2017-09-04 22:03:03
【问题描述】:

我正在尝试实现 BuildEventService 的服务器,以便我可以让 bazel 将其 BuildEventProtocol 消息导出到它。我试图弄清楚如何在没有竞争条件的情况下读取测试运行的日志,特别是由于 bazel 在本地机器上重复使用相同的路径进行多次运行以及 BES 的默认异步性质,这似乎非常困难。

示例: 作为事件流的一部分,我得到以下信息:

EventStream event:
stream_id {
  build_id: "a4a34ca2-fc4b-483d-b4ab-b4546bdb2c4e"
  component: TOOL
  invocation_id: "b09c0b08-b096-4673-9521-4980506207f7"
}
sequence_number: 11
event {
  event_time {
    seconds: 1504560960
    nanos: 778000000
  }
  bazel_event {
    [type.googleapis.com/build_event_stream.BuildEvent] {
      id {
        test_summary {
          label: "//libraries:types-test"
          configuration {
            id: "fe35dfece8e09ba054305e51187b3316"
          }
        }
      }
      test_summary {
        total_run_count: 1
        failed {
          uri: "file:///private/var/tmp/_bazel_endobson/f851d7f6c7010ae7d7a3db153bed36de/execroot/yaspl/bazel-out/darwin_x86_64-fastbuild/testlogs/libraries/types-test/test.log"
        }
        overall_status: FAILED
      }
    }
  }
}

我想读取 uri 中的文件: file:///private/var/tmp/_bazel_endobson/f851d7f6c7010ae7d7a3db153bed36de/execroot/yaspl/bazel-out/darwin_x86_64-fastbuild/testlogs/libraries/types-test/test.log

但似乎每次我运行测试时都会得到相同的 uri。因此,我想在下一次测试运行重新创建它之前阅读它。但是 bazel 默认情况下会异步上传,因此即使在 BES 服务器接收到此流消息之前,似乎也没有什么可以阻止 bazel 再次启动和重新创建文件。

我怎样才能避免这种竞争并仍然阅读这些文件?

【问题讨论】:

    标签: bazel


    【解决方案1】:

    这取决于您是否可以控制 Bazel 客户端。如果是这样,那么是的,您可以避免比赛。否则你不能。

    1. 您可以在每次调用时指定不同的--output_base Bazel(输出基数是路径前缀 /private/var/tmp/_bazel_endobson/f851d7f6c7010ae7d7a3db153bed36de 在 你的例子)。但是,--output_base 是一个启动选项,并且 因此需要在更改时重新启动 Bazel 服务器。那会 工作,但它很慢,你需要指定不同的 --output_base 在调用之前,如果您以编程方式调用 Bazel 可能没问题。
    2. 您可以指定--bes_best_effort=false 在这种情况下BES 上传 是同步的,即 Bazel 等待上传完成。如果 上传失败,构建也失败。
    3. 您可以将 bazel 客户端包装在一个 shell 脚本中,此外还可以上传到您的 BES 服务,还将 BEP 写入一个文件,然后在调用结束时解析该文件以获取 test.log 文件并在提供之前上传这些文件控制权还给用户。

    【讨论】:

    • 提交github.com/bazelbuild/bazel/issues/3689 以跟踪功能请求。现在 2 可能是最好的解决方案,因为它只需要更改 .bazelrc 文件,但在 0.5.4 中它实际上并不能同步工作。它确保消息被发送,但在退出之前不等待服务器的确认。)
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多