如何解决解析Bazel构建事件协议以搜索失败的目标和错误消息的最佳方法是什么? 上下文到目前为止我有什么?资源
上下文
尽管Bazel在本地构建时会显示构建错误消息,但要了解哪个目标未能通过构建图并不是一件容易的事-默认错误消息将指向根目标,而不一定指向包含错误的目标。这不是最佳选择,因为在构建图很大的情况下,用户必须建立许多已知良好的目标,直到遇到不良目标为止。
除此之外,从CI中访问此消息不切实际,用户需要滚动几百行(如果不是几千行)(在等待它们加载之后)并搜索错误消息。 我想提取出构建图失败的确切目标,并获得对该错误的有意义的描述,以便将其呈现给开发人员,以便他们可以在本地快速重现该错误并修复其更改。
到目前为止我有什么?
- Bazel Build Event Protocol提供了一组丰富的数据,其中应包含所需的信息;
- 设置Bazel以将构建事件输出到bin文件之后,我创建了一个CLI,该CLI接受此文件并按照
build_event_stream.proto
规范对其进行解析; - 解析后,我能获得的最好成绩是:
- 事件→操作→过滤
javac
→通过getLabel()
获取失败的目标。这是不理想的,因为它依赖于过滤javac
的结果。在一家大公司中,会有数十种来自不同编程语言的编译器。 有一种方法可以以一种与语言无关的方式来获取导致构建失败的目标; - 事件→进度→为
srterr not empty
过滤。显然,进度等同于Bazel打印到终端的消息。使用正则表达式,我可以尝试提取信息,例如发生编译错误的文件,其行等。尽管此错误消息与失败的目标之间没有链接。
资源
- Protobuf specification for the build event protocol
- How to find the target failed build from build event protocol?-与我在2018年遇到的问题相同的人;
解决方法
在构建事件协议文件中查找错误的半可靠方式可能是寻找ActionCompletedId
事件。按照规范:
报告操作已完成的事件的标识符(并非报告所有操作,而是报告所有重要操作;包括所有失败的操作)。
它带有ActionExecuted
消息作为有效负载,其中包含有关动作如何终止的信息,包括其stderr。虽然规范说
构建事件协议的使用者不能假定仅发布了失败的操作。
我发现它足以可靠地检查消息中包含的退出代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。