如何在Jenkins中无需克隆的情况下监听子模块更改

时间:2015-11-15 05:55:43

标签: git jenkins

詹金斯是一个超然的人。每当子模块更新时,我都需要触发一个构建。但是,只有主项目被克隆。

两个问题

  • 如何判断Jenkins在子模块获取时触发构建 更新,但不克隆子模块?我需要主项目代码 克隆了,但Jenkins仍然只需要启动构建 子模块得到更新。所以,让我们说子模块A得到 更新(新提交ism adE),它应该触发主项目代码被克隆的构建。子模块未被克隆。
  • 在Jenkins克隆主项目后,如何将最新的更改从子模块拉到子模块目录?当然,子模块目录将位于一个独立的头部。如何从最近的提交中提取子模块的最新更改(我不能使用git子模块更新,因为这不会将最新的更改提取到子模块)。

基本上,我想为每个子模块提供自己的CI环境进行测试,但每个子模块都不是一个独立的应用程序;他们依赖于主要项目。因此,当子模块更新时,我们需要使用该子模块中的最新代码更新主项目而不必克隆子模块,必须拉出子模块中的代码。 我不想在主项目上设置轮询。 Jenkins每次都应该检查子模块以检查是否有新的提交

1 个答案:

答案 0 :(得分:0)

我会推荐一个监控父回购的Jenkins工作。

默认情况下,如果您未启用Job Configuration -> Section Source Code Management, Git -> Advanced Button (under Branches to build) -> Recursively update submodules,则不会克隆子模块 它只会监视父repo的克隆,定期获取最新的提交,只需启用Poll SCM,而不是通过设置指定时间表:参见“Automatically triggering a Jenkins build on Git commit”。

如果更新子模块,则表示父仓库也会发生变化 当子模块发生变化时,将创建并推送新的父repo SHA1,记录 gitlink (a special entry in the index)。该gitlink引用了子模块的新SHA1。

这意味着,每次父回购更改时,jenkins工作都需要执行以下操作:

git diff --name-only --diff-filter=M ${revision} HEAD

如果M(已修改)列表包含该作业的正确子模块,则(使用Parameterized Trigger Plugin)触发正确的CI作业。

正确的CI作业(每个子模块一个)也将监视主父回购,默认情况下也不会克隆子模块,除了正确的子作业。
它的第一步应该遵循“git submodule update specific submodule only

git submodule update --init -- <specific relative path to submodule>

该工作的其余部分可以构建/测试该特定子模块。