Gradle 插件解析故障事后分析

2022 年 1 月 12 日,Gradle 用户在从 Gradle 插件门户 解析插件时遇到问题,因为插件门户依赖的 JCenter 出现故障,导致部分功能无法使用。

这篇事后分析报告概述了停机时间线,描述了对 Gradle 用户的影响,以及为进一步减少 Gradle 插件门户对 JCenter 的依赖而采取的措施。

最后,我们还将讨论如何保护您的构建免受此类停机的影响。

受 JCenter 停机影响的项目依赖项用户还应参考我们关于 JCenter 关闭的原始博文

停机时间线

1 月 12 日下午 4:30 UTC 停机开始
Gradle 用户开始注意到构建中的插件解析失败。
1 月 12 日下午 4:56 UTC 事件打开
停机在Gradle 状态页面上得到确认。
1 月 12 日下午 6:00 UTC
我们发现了一个热修复程序,它将允许 Gradle 插件门户忽略来自 JCenter 的5xx错误代码,并完全解析它托管的插件。但是,热修复程序无法立即构建和部署,因为构建插件门户代码需要从插件门户本身和 JCenter 解析一些插件,而这些插件都失败了。
1 月 12 日晚上 8:44 UTC 第一个修复程序部署
我们更新了插件门户的构建,使其不再依赖于 JCenter,而是使用存储库内容过滤支持的元数据源。第一个修复程序已部署。
1 月 12 日晚上 8:58 UTC 第二个修复程序部署
第一个修复程序被证明是不够的。我们开发并部署了第二个修复程序,它允许我们更改插件门户重定向到的存储库。我们配置插件门户使用我们内部的 JCenter 镜像。
1 月 12 日晚上 9:43 UTC 停机解决
现有的镜像填充得太稀疏,因为它没有被广泛使用,这意味着大多数构建仍然无法解析插件。我们更新了镜像存储库以重定向到 Maven Central。这导致大多数依赖项被正确解析,并解除了大多数构建的阻塞。依赖于仅在 JCenter 上可用的工件的插件仍然无法解析。
1 月 13 日凌晨 6:35 UTC 事件关闭
JCenter 恢复在线。镜像存储库更改回仅镜像 JCenter,并且 Gradle 插件门户仍然配置为使用镜像存储库。

停机对构建的影响

这次停机表明了当插件门户无法提供所有请求时,构建可能会失败的几种方式。

  1. 使用动态版本插件的构建无法解析版本列表。
  2. 在短暂的 CI 代理或新环境中运行的构建可以下载插件工件,但它们无法从 JCenter 下载插件的依赖项。
  3. 由于 JCenter 会返回 5xx 错误而不是 404,Gradle 将其视为错误而不是缺少工件,因此插件无法解析 Gradle 在插件门户网站上请求的工件。

降低未来出现故障的可能性

解析 Gradle 插件的问题对 Gradle 构建有很大影响。下面我们将描述我们正在采取的步骤,以降低未来可能出现故障的可能性和严重程度。

立即更改

在此事件之后,Gradle 插件门户网站现在使用 Gradle 托管的 JCenter 镜像,而不是直接使用 JCenter。这应该可以保护用户免受 JCenter 短暂中断的影响,因为镜像已缓存了库。我们看到 JCenter 在周末又出现了一次短暂的中断,但这似乎没有影响 Gradle 插件门户网站用户。

背景信息

Gradle 插件门户网站与 JCenter 之间的联系在很大程度上是历史性的。

在宣布 Bintray 和 JCenter 停用 之前,您可以通过两种不同的方式发布 Gradle 插件

  • 发布到 Bintray 存储库。插件作者随后可以请求将插件包含在插件门户网站上。
  • 发布到插件门户网站。插件作者可以使用 plugin-publish 插件 直接上传他们的插件。

Gradle 插件门户网站依赖于 JCenter 的以下内容

  1. 可用版本列表:发布到 Bintray 然后发布到插件门户网站的插件仍然需要向插件用户公开所有版本。
  2. 缺少工件:插件门户网站并不总是支持 Gradle 模块元数据、校验和和签名文件等文件。这些文件可能已直接发布到 JCenter,而不是发布到插件门户网站。
  3. 插件依赖项:插件使用的依赖项,例如 Guava,不会部署到插件门户,但需要像部署到插件门户一样可访问,这就是重定向提供的功能。

我们在 2021 年 5 月 Bintray 关闭时停止并删除了与 Bintray 的集成,但我们一直重定向到 JCenter,因为 JFrog 表示 JCenter 将无限期地保持只读状态。我们现在正在重新考虑这一决定,并将努力减少和消除插件门户对 JCenter 的依赖。

Gradle 团队的目标是找到一个对构建影响最小的解决方案,但我们知道无法做到零影响。

我们将提供关于如何在插件门户上替换 JCenter 以及这可能如何影响您的构建的未来更新。

加强您的构建基础设施

构建工程师可以通过将其与 JCenter 和 Gradle 插件门户等在线服务分离来加强其构建基础设施。

通过设置 插件门户的镜像,您可以将工件缓存到更靠近您的构建基础设施和开发人员的位置。

这可以提供多种好处

  • 性能提升
  • 更好地控制用于安全和审计目的的依赖项
  • 隔离故障

如果您已经使用自定义存储库,您还可以利用 存储库内容过滤 来确保您从特定存储库获取构建和项目依赖项。

反馈

如果您有任何问题,请在我们的 论坛Gradle 社区 Slack 上告诉我们。

讨论