如果可以在预提交和预推送 git 挂钩上进行测试,为什么还要在持续集成中进行测试?
Why test in continuous integration if you can test on pre-commit and pre-push git hooks?
如果您已经拥有像 Husky 运行 这样的系统,可以在预提交和预推送之前测试您的代码,那么使用持续集成系统来测试您的代码有什么意义?
使用像 Travis 这样的持续集成平台进行测试的一个原因是确保开发人员没有绕过他们自己的本地开发环境的测试 git 挂钩。
CI不仅是测试,还有很多,测试阶段当然是流程中非常重要的一部分。
正如您在自己的回答中所说,可以更改本地环境,CI 上的测试可以有更严格的设置,您测试的环境可能更像最终用户使用的环境(例如,设置版本软件甚至硬件)。
例如,您开发了一个 PHP 包。该软件包支持 php 5.6 和 7.2 之间的所有内容,它还应该支持多种类型的操作系统,并且如果安装或不安装 ext/open_ssl
应该会有不同的行为。本地测试套件很少有允许开发人员在每个所需平台上测试每个可能版本的设置,但在 CI 管道中设置的测试套件可以。
老实说,为了安全起见,多测试一次总是个好主意! ;)
我不太关心它是否在您的本地环境中通过,您的环境路径上可能有不同版本的某些依赖库。我想确定的是,当链接到我们附带的特定库版本时,任何人的贡献都不会破坏软件。
预提交和预推送挂钩非常适合快速操作和测试。有时您甚至可以在 IDE 中设置一个挂钩,以便在您每次保存文件时 运行 快速进行单元测试。但是通常你有多个测试套件,并且与单元测试功能不同,集成和性能测试通常需要更长的时间才能 运行,这对于 hooks 是不可行的。
此外,您希望 运行 在构建可交付成果的同一环境中进行测试,这通常不是您的本地计算机。
使用 CI 系统的另一个原因是 运行 post-合并测试以验证多个并行合并没有引入问题。
总而言之,您 运行 的测试越多越好,并且 CI 系统允许您 运行 两个预合并测试通常由某种触发拉取请求挂钩和 post-合并测试。所有这些都在受控的可靠环境中进行。
在某些有用且合理的工作流程中,提交和推送损坏的提交是可以接受的(尽管不是主分支)。使用 git 钩子阻止此类工作流很烦人。
以变基或合并为例,即使文件已更改,也不会 运行 再次挂钩。
钩子也很难做好。他们检查可能不是推送内容的本地状态(如果存在某些不在 git 中的文件)。
CI 服务器还提供稳定的可预测环境。例如。考虑具有 Linux 的 CI 服务器和使用 MacOs 笔记本电脑的开发人员。 git 钩子 运行 在 MacOs 上,它有不区分大小写的文件系统,允许测试通过即使文件名是错误的。
Hooks 也会惩罚 运行 在提交前手动检查的勤奋开发人员,因为测试只是 运行 又一次。
每个专业项目应该有CI。 真正的问题是,当您已经拥有 CI.
时,为什么任何项目都应该维护烦人的、缓慢的、脆弱的、破碎的本地挂钩
仅将挂钩用于私人玩具项目。
如果您已经拥有像 Husky 运行 这样的系统,可以在预提交和预推送之前测试您的代码,那么使用持续集成系统来测试您的代码有什么意义?
使用像 Travis 这样的持续集成平台进行测试的一个原因是确保开发人员没有绕过他们自己的本地开发环境的测试 git 挂钩。
CI不仅是测试,还有很多,测试阶段当然是流程中非常重要的一部分。
正如您在自己的回答中所说,可以更改本地环境,CI 上的测试可以有更严格的设置,您测试的环境可能更像最终用户使用的环境(例如,设置版本软件甚至硬件)。
例如,您开发了一个 PHP 包。该软件包支持 php 5.6 和 7.2 之间的所有内容,它还应该支持多种类型的操作系统,并且如果安装或不安装 ext/open_ssl
应该会有不同的行为。本地测试套件很少有允许开发人员在每个所需平台上测试每个可能版本的设置,但在 CI 管道中设置的测试套件可以。
老实说,为了安全起见,多测试一次总是个好主意! ;)
我不太关心它是否在您的本地环境中通过,您的环境路径上可能有不同版本的某些依赖库。我想确定的是,当链接到我们附带的特定库版本时,任何人的贡献都不会破坏软件。
预提交和预推送挂钩非常适合快速操作和测试。有时您甚至可以在 IDE 中设置一个挂钩,以便在您每次保存文件时 运行 快速进行单元测试。但是通常你有多个测试套件,并且与单元测试功能不同,集成和性能测试通常需要更长的时间才能 运行,这对于 hooks 是不可行的。
此外,您希望 运行 在构建可交付成果的同一环境中进行测试,这通常不是您的本地计算机。
使用 CI 系统的另一个原因是 运行 post-合并测试以验证多个并行合并没有引入问题。
总而言之,您 运行 的测试越多越好,并且 CI 系统允许您 运行 两个预合并测试通常由某种触发拉取请求挂钩和 post-合并测试。所有这些都在受控的可靠环境中进行。
在某些有用且合理的工作流程中,提交和推送损坏的提交是可以接受的(尽管不是主分支)。使用 git 钩子阻止此类工作流很烦人。
以变基或合并为例,即使文件已更改,也不会 运行 再次挂钩。
钩子也很难做好。他们检查可能不是推送内容的本地状态(如果存在某些不在 git 中的文件)。
CI 服务器还提供稳定的可预测环境。例如。考虑具有 Linux 的 CI 服务器和使用 MacOs 笔记本电脑的开发人员。 git 钩子 运行 在 MacOs 上,它有不区分大小写的文件系统,允许测试通过即使文件名是错误的。
Hooks 也会惩罚 运行 在提交前手动检查的勤奋开发人员,因为测试只是 运行 又一次。
每个专业项目应该有CI。 真正的问题是,当您已经拥有 CI.
时,为什么任何项目都应该维护烦人的、缓慢的、脆弱的、破碎的本地挂钩仅将挂钩用于私人玩具项目。