【问题标题】:How to listen to submodule changes without cloning in Jenkins如何在不克隆的情况下在 Jenkins 中监听子模块更改
【发布时间】:2016-02-16 11:03:43
【问题描述】:

詹金斯心不在焉。每当子模块更新时,我都需要触发构建。但是,只有主项目被克隆。

两个问题

  • 如何告诉 Jenkins 在子模块获取时触发构建 更新,但不克隆子模块?我需要主项目代码 而是克隆了,但 Jenkins 仍然需要仅在以下情况下开始构建 子模块得到更新。所以假设子模块 A 得到 更新(一个新的提交主义广告),它应该触发一个主要项目代码被克隆的构建。子模块未克隆。
  • Jenkins 克隆主项目后,如何将子模块中的最新更改拉取到子模块目录?当然,子模块目录将处于分离的位置。如何从最近的提交中拉取子模块的最新更改(我不能使用 git submodule update 因为它不会拉取子模块的最新更改)。

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

【问题讨论】:

    标签: git jenkins


    【解决方案1】:

    我会推荐一个 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 也会发生变化。
    当子模块发生变化时,也会创建并推送一个新的父 repo SHA1,记录一个 gitlinkspecial entry in the index)。该 gitlink 引用了子模块的新 SHA1。

    也就是说,每次父 repo 发生变化时,jenkins 作业都需要做一个:

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

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

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

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

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

    【讨论】:

    • 这行不通。我需要它,以便在更新子模块时克隆主项目。但我不希望它只轮询主项目的子模块项目
    • @JamesUmeris 问题是;子模块不知道要克隆的主项目的版本(什么 SHA1)。只有主项目知道子模块,而不是相反。
    • 不,所以我需要它,以便在更新子模块时强制克隆主项目。克隆主项目的最新提交。但我不希望子模块被克隆
    • 轮询必须在子模块而不是主项目上
    • @JamesUmeris 我明白了。您可以尝试使用要监视的子模块 url 设置作业,并首先在其他地方克隆主存储库。我想您需要在签出的父仓库和您监控的克隆子模块之间建立一个符号链接。
    猜你喜欢
    • 1970-01-01
    • 2017-01-18
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2012-07-27
    • 2010-11-20
    相关资源
    最近更新 更多