在搜索生成失败的目标和错误消息时,解析Bazel生成事件协议的最佳方法是什么? 上下文

在搜索生成失败的目标和错误消息时,解析Bazel生成事件协议的最佳方法是什么? 上下文,bazel,Bazel,虽然Bazel在本地生成时显示生成错误消息,但了解生成图中哪个目标失败并不容易-默认错误消息将指向根目标,而不一定指向包含错误的目标。这不是最优的,因为在构建图非常大的情况下,用户将不得不构建许多已知的好目标,直到他们达到坏目标 除此之外,从CI访问此消息并不实际,用户需要滚动数百行(如果不是数千行的话)并搜索错误消息我想提取生成图失败的确切目标,并获得错误的有意义的描述,以便将其呈现给开发人员,以便他们可以在本地快速复制错误并修复更改。 到目前为止我有什么? Bazel提供了一组丰富的数据,这

虽然Bazel在本地生成时显示生成错误消息,但了解生成图中哪个目标失败并不容易-默认错误消息将指向根目标,而不一定指向包含错误的目标。这不是最优的,因为在构建图非常大的情况下,用户将不得不构建许多已知的好目标,直到他们达到坏目标

除此之外,从CI访问此消息并不实际,用户需要滚动数百行(如果不是数千行的话)并搜索错误消息我想提取生成图失败的确切目标,并获得错误的有意义的描述,以便将其呈现给开发人员,以便他们可以在本地快速复制错误并修复更改。

到目前为止我有什么?
  • Bazel提供了一组丰富的数据,这些数据应该包含所需的信息
  • 在将Bazel设置为将构建事件输出到bin文件中之后,我创建了一个CLI,它接受该文件并按照规范对其进行解析
  • 解析后,我能得到的最好结果是:
  • 事件→ 行动→ 用于
    javac
    → 通过
    getLabel()
    获取失败的目标。这并不理想,因为它依赖于过滤
    javac
    的结果。在一家大公司里,会有几十种不同编程语言的编译器如果能够以一种语言不可知的方式获得构建失败的目标,那就太好了
  • 事件→ 进展→
    srterr的过滤器不为空
    。进度相当于Bazel打印到终端的消息。使用正则表达式,我可以尝试提取信息,例如发生编译错误的文件、行等,尽管此错误消息与失败的目标之间没有链接
  • 资源
    • -与我在2018年遇到的问题相同的人
    在构建事件协议文件中查找错误的半可靠方法可能是查找
    ActionCompletedId
    事件。根据规范:

    报告操作已完成的事件的标识符(并非报告所有操作,仅报告可被视为重要的操作;这包括所有失败的操作)

    它附带了一条
    ActionExecuted
    消息作为有效负载,其中包含有关操作如何终止的信息,包括其stderr。虽然说明书上说

    生成事件协议的使用者不得假定只发布失败的操作


    我发现它足够可靠,可以检查消息中包含的退出代码。

    太棒了,这很有效。路径为事件-->执行的操作-->筛选大于0的退出代码,然后通过
    标签
    字段获取生成失败的目标,并且可以从
    标准文件
    中指示的文件读取错误消息