如何让子模块触发 Jenkins 构建

Jam*_*ris 7 git jenkins

我有一个子模块 A,它不是独立的应用程序。它需要主应用程序才能工作。我想为 A 创建一个 CI 构建,以便每当将提交推送到 A 时,它都会触发使用主项目代码的构建。

我该如何在詹金斯中做到这一点?

我需要做什么:

  • 对 A 的提交会触发构建。
  • 该构建克隆主项目代码,并在 A 的最新提交(不是主项目知道的提交)处提取 A 的最新代码。

我该如何使用 Jenkins 和 GIT 来做到这一点?

注意我的项目有多个子模块。子模块 A 触发构建,从 A 中提取最新的更改以及最新的主代码,并从其他子模块中提取更新。

por*_*ast 8

这可以在没有 git hooks 的情况下完成。在此示例中,我们有 3 个存储库:

  1. 家长
    • 仅包含子模块的空存储库
  2. 孩子-a
    • 一个子模块存储库
  3. 孩子-b
    • 另一个子模块存储库

当使用子模块克隆时,它看起来像:

parent\
    child-a\*
    child-b\*
Run Code Online (Sandbox Code Playgroud)

在 Jenkins 中创建一个名为 的自由式项目dummy-child-a

  • Source Code Management设置下Repository URLchild-a
  • Build Triggers您选择Poll SCM并设置所需的间隔
  • Build点击下Add build step
    • 选择Execute Windows batch commandExecute shell根据您的操作系统
    • 在脚本框中执行类似的操作echo hello(这是虚拟部分)

重复这些步骤child-b


在 Jenkins 中创建一个名为 的自由式项目parent。这是我们实际建造的地方

  • Source Code Management设置下Repository URLparent
  • 单击add下方Additional Behaviours并选择Advanced sub-modules behaviours
    • 查看:
    • Recursively update submodules
    • Update tracking submodules to tip of branch
    • Use credentials from default remote of parent repository
  • Build Triggers正在检查中Build after other projects are built
    • 在该Projects to watch字段中,填写要观看的所有项目,并用逗号分隔:dummy-child-a, dummy-child-b
    • 如果parent没有会改变的源代码,你不需要Poll SCM做这个 Jenkins 工作
    • 查看Trigger even if the build fails

你就完成了。对 child-a 或 child-b 的任何更改都会触发父级的重建。该方法假设父模块中的子模块数量不经常变化。如果要添加另一个子模块,则需要创建另一个dummy项目,然后更新Jenkins 构建projects to watch的版本parent


Mar*_*tin 2

这可以分两步完成:

  1. 在您想要构建的 Jenkins 作业上启用构建触发器 url。这是在“触发远程构建”选项卡下完成的。url 的格式为:JENKINS_URL/job/MY_JOB_NAME/build?token=TOKEN_NAME

  2. 在子模块 A 中设置一个 git post-receive 钩子来调用上面的 url。一个简单的方法就是使用curl: curl JENKINS_URL/job/MY_JOB_NAME/build?token=TOKEN_NAME

然后,对子模块 A 的推送将通过调用 url 来触发主项目 Jenkins 的工作。配置 Jenkins 作业以在构建之前更新其代码或您需要的任何其他细节。

这个答案提供了很多关于如何设置 git hook 的细节。