Continuous integration 在连续集成中处理多个分支

Continuous integration 在连续集成中处理多个分支,continuous-integration,hudson,jenkins,Continuous Integration,Hudson,Jenkins,在我的公司,我一直在处理扩展CI的问题,同时试图找出在涉及CI和多个分支时应采取的方法。在stackoverflow,也有一个类似的问题。我已经开始了一个新的问题,因为我想得到更多的讨论,并提供一些关于这个问题的分析 到目前为止,我发现我可以采取两种主要的方法(或者其他方法??) 每个分支机构都有多套作业(这里谈论Jenkins/Hudson) 编写工具来管理额外的作业 批量创建/修改/删除作业 每个分支的每个作业的自定义设置(SCM url、dep management repos复制)

在我的公司,我一直在处理扩展CI的问题,同时试图找出在涉及CI和多个分支时应采取的方法。在stackoverflow,也有一个类似的问题。我已经开始了一个新的问题,因为我想得到更多的讨论,并提供一些关于这个问题的分析

到目前为止,我发现我可以采取两种主要的方法(或者其他方法??)

  • 每个分支机构都有多套作业(这里谈论Jenkins/Hudson)
    • 编写工具来管理额外的作业
      • 批量创建/修改/删除作业
      • 每个分支的每个作业的自定义设置(SCM url、dep management repos复制)
      • 使用shell工具、ant脚本和Jenkins CLI解决此问题的一些示例。见:
    • 将导致CI群集上的负载增加
    • 开发人员的反馈周期变慢(如果基础设施无法处理新负载)
  • 每2个分支有多组作业(开发和稳定)
    • 手动管理这两个集合(如果更改作业的配置,请确保在另一个分支中更改)
      • 皮塔,但至少很少管理
    • 其他额外的分支在推送到dev之前无法获得完整的测试套件
    • 不满意的开发者。为什么开发人员应该关心CI扩展问题。他有一个简单的请求,当我分支时,我想测试我的代码。简单

所以,如果我想为开发人员自己的定制分支提供CI,我需要Jenkins的特殊工具(API或shellscripts之类的)和处理伸缩性。或者我可以告诉他们更频繁地合并到DEV,并在自定义分支上不使用CI。你会选择哪一个,或者还有其他选择吗

我会为每个分支设置单独的工作。我以前做过,如果你正确设置了Hudson/Jenkins,管理和设置就不难了。创建多个作业的一种快速方法是从具有类似需求的现有作业复制,并根据需要修改它们。我不确定您是否希望允许每个开发人员为自己的分支设置自己的作业,但这对于一个人(即构建经理)来说并不是什么工作。一旦自定义分支合并到稳定的分支中,相应的作业就可以在不再需要时删除

如果您担心CI服务器上的负载,可以设置单独的CI实例,甚至单独的从属服务器,以帮助平衡多个服务器上的负载。确保运行Hudson/Jenkins的服务器足够。我使用了ApacheTomcat,只需确保它有足够的内存和处理能力来处理构建队列


很重要的一点是,要明确使用CI想要实现什么,然后找出一种方法来实现它,而不需要太多的手动工作或重复。使用CI服务器执行的其他外部工具或脚本来简化整个构建管理过程没有什么错。

我会选择dev+稳定分支。如果您仍然需要自定义分支,并且害怕负载,那么为什么不将这些自定义分支移到云中,让开发人员自己管理它呢。 这就是Kohsuke现在所在的公司。
还有一个Eclipse工具,因此如果您使用Eclipse,您将把它紧密集成到dev env中。

当您谈论扩展CI时,实际上是在讨论扩展CI服务器的使用,以处理所有功能分支以及主线。起初,这看起来是一种很好的方法,因为分支中的开发人员获得了CI作业所包含的自动化测试的所有优势。但是,您在管理CI服务器作业时遇到了问题(正如您所发现的),更重要的是,您并没有真正执行CI。是的,您使用的是CI服务器,但是您没有持续集成来自所有开发人员的代码

执行真正的CI意味着您的所有开发人员都定期向主线提交。说起来容易,但难的是在不破坏应用程序的情况下完成。我强烈建议您阅读,特别是第13章:管理组件和依赖项中的“保持应用程序可发布”一节。要点是:

  • 隐藏新功能,直到完成(也称为)
  • 以一系列小更改的形式递增地进行所有更改,每个更改都是可发布的
  • 使用逐抽象分支对代码库进行大规模更改
  • 使用组件来解耦应用程序中以不同速率更改的部分
除了抽象的分支之外,它们都是不言自明的。这只是一个花哨的术语:

  • 在需要更改的系统部分上创建一个抽象
  • 重构系统的其余部分以使用抽象层
  • 创建一个新的实现,它在完成之前不是生产代码路径的一部分
  • 更新抽象层以委托给新实现
  • 删除旧的实现
  • 如果抽象层不再合适,请删除它
  • 第14章:高级版本控制中分支、流和持续集成部分的以下段落总结了影响

    与创建一个分支并全力重新设计和开发新功能相比,渐进式方法当然需要更多的纪律和关怀——事实上也需要更多的创造力。但是,它显著降低了更改破坏应用程序的风险,并将为您和您的团队节省大量的时间来进行合并、修复损坏,并使您的应用程序进入可部署状态

    放弃特性分支需要相当大的思想转变,您将始终遇到阻力。我