Gradle 插件解析中断事后总结
引言
2022 年 1 月 12 日,Gradle 用户在从 Gradle 插件门户 解析插件时遇到问题,原因是插件门户的部分功能依赖于 JCenter 的中断。
这篇事后总结提供了中断的时间线,描述了对 Gradle 用户的影响,以及为进一步降低 Gradle 插件门户对 JCenter 的依赖所采取的行动。
最后,我们还将讨论您如何保护您的构建免受此类中断的影响。
受 JCenter 中断影响项目依赖的用户,还应参阅我们关于 JCenter 关闭的原始博文。
中断时间线 #
- 世界标准时间 1 月 12 日下午 4:30 中断开始
- Gradle 用户开始注意到构建中插件解析失败。
- 世界标准时间 1 月 12 日下午 4:56 事件开启
- 中断在 Gradle 状态页面 上得到确认。
- 世界标准时间 1 月 12 日下午 6:00
- 我们确定了一个热修复程序,它将允许 Gradle 插件门户忽略来自 JCenter 的
5xx
错误代码并完全解析其托管的插件。然而,该热修复程序无法立即构建和部署,因为构建插件门户代码需要从插件门户本身和 JCenter 解析一些插件,而这失败了。 - 世界标准时间 1 月 12 日晚上 8:44 第一个修复程序部署
- 我们通过使用仓库内容过滤和支持的元数据源来更新插件门户的构建,使其完全不依赖 JCenter。第一个修复程序已部署。
- 世界标准时间 1 月 12 日晚上 8:58 第二个修复程序部署
- 第一个修复程序被证明不足。我们开发并部署了第二个修复程序,允许我们更改插件门户重定向到的仓库。我们将插件门户配置为使用我们内部的 JCenter 镜像。
- 世界标准时间 1 月 12 日晚上 9:43 中断解决
- 现有的镜像填充过于稀疏,因为它不常使用,这意味着大多数构建仍然无法解析插件。我们更新了镜像仓库,使其也重定向到 Maven Central。这导致大多数依赖项得到正确解析,并解除了大多数构建的阻塞。依赖于仅在 JCenter 上可用的工件的插件仍然无法解析。
- 世界标准时间 1 月 13 日上午 6:35 事件关闭
- JCenter 恢复在线。镜像仓库改回只镜像 JCenter,并且 Gradle 插件门户仍配置为使用镜像仓库。
中断对构建的影响 #
此次中断揭示了当插件门户无法处理所有请求时,构建可能失败的几种方式
- 使用动态版本插件的构建无法解析版本列表。
- 在短暂的 CI 代理或新环境中运行的构建可以下载插件工件,但它们无法从 JCenter 下载插件的依赖项。
- Gradle 在插件门户上请求的插件缺少工件,解析失败,因为 JCenter 会返回
5xx
错误而不是404
,Gradle 将其视为错误而不是缺少工件。
降低未来中断的可能性 #
解决 Gradle 插件的问题对 Gradle 构建影响很大。下面我们描述了我们正在采取的步骤,以降低未来潜在中断的可能性和严重性。
即时更改 #
在此事件之后,Gradle 插件门户现在使用 Gradle 托管的 JCenter 镜像,而不是直接使用 JCenter。这应该可以保护用户免受因镜像缓存的库而导致的短期 JCenter 中断。我们在周末看到了另一次 JCenter 短暂中断,但这似乎没有影响 Gradle 插件门户的用户。
背景信息 #
Gradle 插件门户与 JCenter 之间的链接主要是历史原因。
在 Bintray 和 JCenter 停止服务公告之前,您可以通过两种不同方式发布 Gradle 插件
- 发布到 Bintray 仓库。插件作者可以请求将插件包含在插件门户中。
- 发布到插件门户。插件作者可以使用
plugin-publish
插件直接上传他们的插件。
Gradle 插件门户依赖 JCenter 的以下功能
- 可用版本列表:发布到 Bintray 然后在插件门户上的插件仍然需要向插件用户公开其所有版本。
- 缺失的工件:诸如Gradle 模块元数据、校验和和签名文件等文件并非总是由插件门户支持。这些文件可能已直接发布到 JCenter 而非插件门户。
- 插件依赖:插件使用的依赖,如 Guava,不会部署到插件门户,但需要像部署了一样可以访问,这就是重定向所提供的功能。
当 Bintray 于 2021 年 5 月关闭时,我们停止并删除了与 Bintray 的集成,但我们继续重定向到 JCenter,因为 JFrog 表示 JCenter 将无限期地保持只读状态。我们现在正在重新考虑该决定,并将努力减少和消除插件门户对 JCenter 的依赖。
Gradle 团队的目标是找到一个对构建影响最小的解决方案,但我们知道零影响是不可能的。
我们将提供未来更新,说明我们如何替换插件门户上的 JCenter,以及这可能如何影响您的构建。
强化您的构建基础设施 #
构建工程师可以通过将构建基础设施与 JCenter 和 Gradle 插件门户等在线服务解耦来强化其构建基础设施。
通过设置插件门户的镜像,您可以将工件缓存到离您的构建基础设施和开发者更近的地方。
这可以提供多重好处
- 性能提升
- 为了安全和审计目的,更好地控制使用的依赖项
- 与中断隔离
如果您已经在使用自定义仓库,您还可以利用仓库内容过滤来确保您从特定仓库获取构建和项目依赖项。
反馈 #
如果您有任何问题,请在我们的论坛或Gradle 社区 Slack上告知我们。