问题描述
在默认分支中进行合并请求(Merge Request,以下简称MR)时,有用户提出疑问:在之前的特性分支中提交代码并且成功运行了Pipeline,为什么在MR时还需要再次启动Pipeline?是否可以在Pipeline的阶段配置中排除MR?
解决方案
通常,对于持续集成(Continuous Integration,CI),在各个分支中运行Pipeline是一项基本的实践,目的是检查每次更改是否能够成功构建。而当你打开MR时,运行Pipeline是为了为实际的合并事件做准备,这正是你首次打开MR的初衷。请注意,以下回答假定你的问题涉及合并提交(merge commit),而不是MR本身。
或许你的疑问是为什么合并后的相同更改需要再次通过相同的Pipeline。答案在于分支Pipeline和主分支(通常是默认分支,如master)Pipeline是否完全相同。如果合并后的主分支Pipeline和分支Pipeline完全相同,我理解你的困惑。
然而,在主分支Pipeline中通常会运行额外或不同的阶段。举例来说,分支Pipeline可能会将代码交付到测试或预发布环境,而主分支Pipeline可能会将代码部署到生产环境。不同的机密信息可能会被使用,生产环境状态可能发生变化,或者可能需要发布并将软件包传送到制品库等等。测试和交付更改与实际将其部署到用户环境中有很大的不同。
如果你认为这是工作的重复,这可能是信号表明需要重新审视和优化Pipeline。至少,你可以同意每次对主分支的更改都需要进行测试,因此每个提交都需要测试,因此合并提交也需要测试。
从合并请求的角度来看,当你创建MR时,通常会有两个Pipeline触发:
1. 在你按下“Merge”按钮之前的Pipeline。
2. 在你按下“Merge”按钮之后的Pipeline,这个Pipeline会使用新的合并代码,显然是必要的。
此外,有可能你的合并方式影响了Pipeline的触发次数。例如,使用带有合并提交的rebase,会导致分支有两个提交,从而触发两次Pipeline。也许你可以修改作业的触发方式来解决这个问题。
在MR过程中,Pipeline的重复触发有助于确保你的代码和更改经过全面的测试和验证,以便安全地合并到主分支中。
希望以上回答能帮助你更好地理解MR中Pipeline的意义和作用。如果你对具体的Pipeline配置有疑问,也可以详细说明,我们可以进一步讨论。