Gradle 插件解析中断事后分析
介绍
2022年1月12日,由于 Gradle 插件仓库所依赖的 JCenter 服务中断,Gradle 用户在从 Gradle 插件仓库解析插件时遇到问题。
这篇事后分析报告给出了中断的时间线,描述了对 Gradle 用户的影响,以及为进一步减少 Gradle 插件仓库对 JCenter 的依赖而采取的措施。
最后,我们还将讨论 *您* 如何保护 *您的构建* 免受此类中断的影响。
受到 JCenter 中断影响项目依赖的用户也应该参考我们关于 JCenter 关闭的原始博客文章。
中断时间线 #
- UTC 时间下午 4:30,1月12日 中断开始
- Gradle 用户开始注意到插件解析在构建中失败。
- UTC 时间下午 4:56,1月12日 事件开启
- 中断在 Gradle 状态页上被确认。
- UTC 时间晚上 6:00,1月12日
- 我们找到了一个热修复方案,该方案将允许 Gradle 插件仓库忽略来自 JCenter 的
5xx
错误代码,并完全解析其托管的插件。然而,热修复程序无法立即构建和部署,因为构建插件仓库代码需要从插件仓库自身和 JCenter 解析一些插件,但解析失败了。 - UTC 时间晚上 8:44,1月12日 第一个修复程序已部署
- 我们更新了插件仓库的构建,通过使用 仓库内容过滤 和 支持的元数据源,使其完全不依赖 JCenter。第一个修复程序已部署。
- UTC 时间晚上 8:58,1月12日 第二个修复程序已部署
- 第一个修复程序被证明是不够的。我们开发并部署了第二个修复程序,该程序允许我们更改插件仓库重定向到的仓库。我们将插件仓库配置为使用我们内部的 JCenter 镜像。
- UTC 时间晚上 9:43,1月12日 中断已解决
- 现有的镜像仓库填充不足,因为它使用不多,这意味着大多数构建仍然无法解析插件。我们将镜像仓库更新为也重定向到 Maven Central。这导致大多数依赖项被正确解析,并解除阻止了大多数构建。依赖于仅在 JCenter 上可用的工件的插件仍然无法解析。
- UTC 时间上午 6:35,1月13日 事件已关闭
- JCenter 恢复在线。镜像仓库被改回仅镜像 JCenter,并且 Gradle 插件仓库仍然配置为使用镜像仓库。
中断对构建的影响 #
这次中断显示了当插件仓库无法服务所有请求时,构建可能会失败的几种方式。
- 使用插件动态版本的构建无法解析版本列表。
- 在临时 CI 代理或新环境中运行的构建可以下载插件工件,但他们无法从 JCenter 下载插件的依赖项。
- 插件在插件仓库上错过了 Gradle 请求的工件,解析失败,因为 JCenter 会返回
5xx
错误而不是404
错误,Gradle 将5xx
错误视为错误,而不是缺少工件。
减少未来中断的可能性 #
解析 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 上告知我们。