"破坏构建"这个概念意味着对代码进行了更改,导致项目无法成功编译或构建。大多数开发人员在其实践中至少遇到过这种情况。根据 Stack Overflow Developer Survey 2023,80% 的受访工程师确认至少有一次在工作仓库中破坏了构建。这是团队开发中最常见的问题之一,需要立即修复。
要点
破坏构建是指在引入更改后项目无法再构建的情况。在 CI/CD 上下文中,这意味着构建管道以错误终止,产物无法创建。
在移动和 Web 开发领域,构建是将源代码转换为可执行文件或包的过程。对于 Android,是通过 Gradle 构建 APK 或 AAB;对于 iOS,是通过 Xcode 编译;对于 Web 项目,是通过 Webpack 或 Vite 构建。在这些阶段的任何一个都可能破坏构建。
现代版本控制系统和 CI/CD 工具,如 Jenkins、GitHub Actions 和 GitLab CI,会自动检测破坏的构建并通知团队。在大多数项目中都有规则:如果构建被破坏,其他所有任务的优先级都会降低,直到构建被修复。
fun main() {
val message: String = "Build successful"
println(message)
// 这一行会破坏构建
val number: Int = "not a number"
}在这个示例中,将字符串赋值给 Int 类型的变量会引起编译错误。类型不匹配是静态类型语言中构建破坏的最常见原因之一。
有几类错误会导致构建破坏。根据 GitLab 2024 年的分析,原因的分布如下。
| 类别 | 示例 | 占比 |
|---|---|---|
| 语法错误 | 缺少括号,错误的导入 | 35% |
| 依赖问题 | 库版本不兼容 | 25% |
| 构建配置 | 资源路径错误 | 20% |
| 合并冲突 | 冲突解决错误 | 15% |
| 基础设施 | CI 运行器或缓存问题 | 5% |
最阴险的类别是依赖问题。更新一个模块中的库可能会破坏相邻模块的构建,如果 API 或方法的行为发生了变化。
而语法错误则可以快速检测——编译器会指明确切的行和错误类型。因此,静态类型语言在构建稳定性方面被认为比动态类型语言更可靠。
破坏的构建直接影响团队的生产力。当构建失败时,开发人员无法从仓库获取项目的当前版本,CI 管道将被阻止所有后续的更改。
Atlassian 2023 年的研究表明,构建破坏超过四个小时的项目平均会损失团队 25% 的有效工作时间。开发人员被迫把精力放在问题诊断上,而非执行自己的任务。
除了生产力,团队士气也会受到影响。破坏构建的开发人员会感受到同事的压力。在健康的团队中,规则是:不因构建破坏而惩罚,但要求立即修复。无责文化 — 将事故作为系统性问题而非某人的错误来分析的方法。
在分布式团队中,破坏的构建可能会阻止其他时区员工的工作。如果欧洲的开发人员在下班前破坏了构建,亚洲的团队可能会因等待修复而损失整个工作日。
预防构建破坏从提交前的本地检查开始。每位开发人员应该在提交更改前运行测试和构建。主要的预防方法分为几个层级。
第二个层级是配置 CI/CD 管道。每个拉取请求必须在合并前通过自动构建和测试。如果构建失败,PR 将被阻止直到修复。这种方法称为 守门提交,在大多数现代项目中使用。
第三个层级是监控和统计。团队跟踪构建恢复时间指标——MTTR(平均恢复时间)。该指标越低,团队对构建破坏的反应越快。目标值不超过 30 分钟。
当构建被破坏时,第一步是确定哪位开发人员最后引入了更改。Git 提供了 git bisect 工具,可以通过二分搜索找到破坏构建的提交。
# 使用已知的好和坏提交开始二分查找
git bisect start
git bisect bad HEAD
git bisect good abc1234
# Git 检查中间的一个提交
# 构建并测试,然后标记:
git bisect good # if build passes
git bisect bad # if build fails
# 约 log2(n) 步后,Git 显示罪魁祸首
git bisect reset找到问题提交后,有两种操作可选。第一种是通过 git revert 回退更改,如果修复需要时间。这是最安全的方法,尤其是当构建阻止了整个团队时。
第二种方案是用新提交立即修复。如果问题是局部的且清楚的,则优先采用这种方法。修复后推送更改并确保构建成功。无论如何,构建恢复时间不应超过一个小时。
常见问题
破坏构建是指在引入更改后代码无法编译或构建的情况。项目进入不可用状态,直到错误被修复。通常这与 语法错误、错误的导入或依赖问题有关。
最常见的原因是语法错误:缺少括号、错误的数据类型或错误的导入。第二是库版本兼容性问题和错误的 构建配置。较少见的是由于合并分支时的冲突导致构建破坏。
责任属于引入破坏构建的更改的开发人员。但在健康的团队中,采用 无责文化 — 重点放在修复和预防上,而非寻找责任人。流程和工具应最小化构建破坏的风险。
最佳恢复时间不超过 30 分钟。如果问题复杂,请通过 git revert 进行回退以解锁团队。使用 git bisect 找到问题提交。修复后重新运行构建。
破坏的构建会阻止所有依赖于共同分支的开发人员的工作。团队生产力下降,项目进度受影响。长时间的构建中断可能导致 更改的累积,并在后续合并时产生复杂的冲突。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。