Bazel通过BuildEventService覆盖测试日志和BuildEventProtocol

Bazel通过BuildEventService覆盖测试日志和BuildEventProtocol,bazel,Bazel,我正在尝试实现BuildEventService的服务器,以便让bazel将其BuildEventProtocol消息导出到它。我正试图找出如何在没有竞争条件的情况下读取测试运行的日志,尤其是由于bazel在本地机器上重复使用相同的路径进行多次运行,以及BES的默认异步性质,这似乎非常困难 例如: 作为事件流的一部分,我得到以下信息: EventStream event: stream_id { build_id: "a4a34ca2-fc4b-483d-b4ab-b4546bdb2c4e"

我正在尝试实现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客户端。如果是这样,那么你可以避免比赛。否则你不能

  • 您可以在每次调用时指定不同的
    --output\u base
    Bazel(输出基是路径前缀
    /private/var/tmp/_bazel_endobson/f851d7f6c7010ae7d7a3db153bed36de
    你的例子)。但是,
    --output_base
    是一个启动选项,并且 因此,更改Bazel服务器时需要重新启动它。那会 工作,但速度很慢,需要指定不同的
    --output_base
    在调用之前,如果以编程方式调用Bazel,这可能很好
  • 您可以指定
    --bes\u best\u efforce=false
    ,在这种情况下,bes上传 是同步的,即Bazel等待上载完成。如果 上传失败,构建也失败
  • 您可以将bazel客户端封装在一个shell脚本中,除了上传到BES服务之外,还可以将BEP写入一个文件,然后在调用结束时解析文件中的test.log文件,并在将控制权交还给用户之前上传这些文件
  • 归档以跟踪功能请求。目前,2可能是最好的解决方案,因为它只需要更改
    .bazelrc
    文件,但在0.5.4中,它实际上并不同步工作。它确保消息被发送,但不会在退出之前等待服务器的确认。)