如何在Bazel构建输出中获取所有测试与目标的执行结果
问题描述
我在CI环境中通过Bazelisk运行Bazel,无法获取合理的构建输出结果。我希望能够在输出中查看所有测试和构建目标的执行结果(即便是通过缓存命中完成的任务),以便开发人员确认自己编写的代码已经被测试覆盖。
最容易想到的方案是设置--show_task_finish参数,但该参数暂不可用,我尚未找到可以可靠打印测试或目标执行结果的参数。且由于输出量过大,我无法打印通过测试的stdout/stderr信息。
近期我遇到的一段经过脱敏的输出如下,如果我想要确认某个特定目标是否已经被测试,这段输出几乎完全没用:
bazel test //... (23:19:36) INFO: Options provided by the client: Inherited 'common' options: --isatty=0 --terminal_columns=0 (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/project/.bazelrc: Inherited 'common' options: --attempt_to_print_relative_paths --show_timestamps --experimental_allow_tags_propagation (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/.bazelrc: Inherited 'common' options: --color=yes --curses=no --show_progress_rate_limit=0.25 --show_task_finish --announce_rc (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/project/.bazelrc: Inherited 'build' options: --keep_going --verbose_failures --local_cpu_resources=HOST_CPUS*0.5 --local_ram_resources=HOST_RAM*0.5 (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/.bazelrc: Inherited 'build' options: --local_cpu_resources=HOST_CPUS --local_ram_resources=HOST_RAM*.67 (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/project/.bazelrc: 'test' options: --test_output=errors --test_summary=detailed --test_env=LANG=en_US.utf8 --test_env=LOCALE_ARCHIVE (23:19:36) INFO: Reading rc options for 'test' from /home/bazelisk/.bazelrc: 'test' options: --test_verbose_timeout_warnings (23:19:36) INFO: Current date is <blah> (23:19:36) Loading: (23:19:36) Loading: 0 packages loaded (23:19:47) Analyzing: 48 targets (0 packages loaded) (23:19:47) INFO: Build option --test_env has changed, discarding analysis cache. (23:19:47) Analyzing: 48 targets (0 packages loaded, 0 targets configured) (23:19:48) INFO: Analyzed 48 targets (0 packages loaded, 13812 targets configured). (23:19:48) INFO: Found 25 targets and 23 test targets... (23:19:48) [0 / 3] [Prepa] BazelWorkspaceStatusAction stable-status.txt (23:19:50) [2,529 / 2,551] 2 / 23 tests; Testing // ... (22 actions running) (23:19:53) [2,532 / 2,551] 5 / 23 tests; Testing // ... (19 actions running) (23:19:56) [2,533 / 2,551] 5 / 23 tests; Testing // ... (18 actions running) (23:19:59) [2,534 / 2,551] 6 / 23 tests; Testing // ... (17 actions running) (23:20:05) [2,535 / 2,551] 8 / 23 tests; Testing // ... (16 actions running) (23:20:11) [2,536 / 2,551] 8 / 23 tests; Testing // ... (15 actions running) (23:20:16) [2,539 / 2,551] 11 / 23 tests; Testing // ... (12 actions running) (23:20:22) [2,541 / 2,551] 14 / 23 tests; Testing // ... (10 actions running) (23:20:32) [2,544 / 2,551] 17 / 23 tests; Testing // ... (7 actions running) (23:20:44) [2,546 / 2,551] 18 / 23 tests; Testing // ... (5 actions running) (23:20:54) [2,546 / 2,551] 18 / 23 tests; Testing // ... (5 actions running) (23:21:06) [2,547 / 2,551] 19 / 23 tests; Testing // ... (4 actions running) (23:21:29) [2,549 / 2,551] 21 / 23 tests; Testing // ... (2 actions running) (23:21:59) [2,549 / 2,551] 21 / 23 tests; Testing // ... (2 actions running) (23:22:27) [2,549 / 2,551] 21 / 23 tests; Testing // ... (2 actions running) (23:22:50) INFO: Elapsed time: 193.959s, Critical Path: 181.09s (23:22:50) INFO: 24 processes: 24 processwrapper-sandbox. (23:22:50) INFO: Build completed successfully, 24 total actions Test cases: finished with 417 passing and 0 failing out of 417 test cases Executed 23 out of 23 tests: 23 tests pass. (23:22:50) INFO: Build completed successfully, 24 total actions CircleCI received exit code 0
本次运行的完整展开参数
bazel test \ --announce_rc \ --attempt_to_print_relative_paths \ --color=yes \ --curses=no \ --experimental_allow_tags_propagation \ --isatty=0 \ --keep_going \ --local_cpu_resources=HOST_CPUS \ --local_ram_resources=HOST_RAM*.67 \ --show_progress_rate_limit=0.25 \ --show_task_finish \ --show_timestamps \ --terminal_columns=0 \ --test_env=LANG=en_US.utf8 \ --test_env=LOCALE_ARCHIVE \ --test_output=errors \ --test_summary=detailed \ --test_verbose_timeout_warnings \ --verbose_failures \ //...
解决方案
可以通过以下三种方案实现需求,你可以根据自己的场景选择:
- 新增
--show_result=2147483647参数
该参数控制Bazel在控制台输出的目标结果数量上限,默认值较低仅展示失败目标,将值设置为最大整数即可输出所有测试、构建目标的状态,包括缓存命中、执行成功、执行失败的目标,输出仅包含目标路径和状态,不会打印stdout/stderr,不会导致输出量过大。 - 新增
--build_event_text_file=<输出文件路径>参数
该参数会将所有构建事件(包括所有目标的执行状态、缓存命中情况、测试结果)全部写入指定的文本文件,不会污染控制台输出。你可以在CI任务结束后按需解析该文件,提取需要的信息,也可以直接用grep过滤特定目标的执行状态。 - 新增
--experimental_slim_profile=<输出文件路径>参数
该参数输出的精简构建profile为文本格式,包含所有任务的执行状态、耗时、是否命中缓存等信息,解析成本很低,适合需要批量统计任务执行情况的场景。
内容的提问来源于stack exchange,提问作者Simon Swanson
相关产品推荐
相关产品推荐

