Jenkins构建中未更新Git子模块


85

我在詹金斯的一个项目中有一个子模块。我已启用高级设置以递归方式更新子模块。

当运行构建时,我看到工作空间中包含子模块中的文件。问题是,这似乎是子模块的第一个修订版。当我推送更改(托管在GitHub上的存储库)时,Jenkins似乎没有更新子模块以获取正确的更改。有人看过吗?

Answers:


96

请注意,Jenkins Git插件2.0将具有“高级子模块行为”,这应确保子模块的正确更新:

的git 2.0

作为评论vikramvi

Advanced sub-modules behavior>“ Path of the reference repo to use during submodule update”针对此字段,添加子模块git url。

路径


Owen B在评论中提到:

对于身份验证问题,现在有一个“使用来自父存储库的默认远程的凭据”选项

JENKINS-20941中看到这里:

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png


6
但是如何?您还可以提供详细步骤,选择哪些选项?谢谢。
zavié

8
@zavié我认为您应该选择“高级子模块行为”,然后选中将出现的复选框“递归更新子模块”,然后单击“保存”。
KajMagnus 2014年

9
如果您使用的是专用存储库,则无法正常工作。
Erik

1
完美的工作对我来说有私人回购
davegallant

3
仅当您的存储库不需要身份验证才能读取git子模块时,此方法才有效。詹金斯错误。
Ernst Kuschke'6

33

这在Jenkins站点上的Git插件文档中的“递归子模块”部分下进行了介绍。

摘抄

GIT插件支持带有子模块的存储库,而子模块本身又具有子模块。但是,必须打开它:在Job Configuration工作配置) -> Section Source Code Management源代码管理)中Git- > Advanced Button高级按钮)(在要构建的分支下)->递归更新子模块

在作业的配置屏幕上的“源代码管理”部分中,下拉“添加”按钮,选择“高级子模块行为”。

   s1

                                 s2

然后选择“递归更新子模块”:

   s3


1
谢谢,但是当我尝试此操作时(大约2年前),此操作不起作用
2014年

@Ben-好,我只是尝试了一下,对我有用。可能与您的版本有关。
slm 2014年

1
仅当您的存储库不需要身份验证才能读取git子模块时,此方法才有效。
Ernst Kuschke '16

@ErnstKuschke-我相信可以为詹金斯(Jenkins)提供SSH密钥,以便它也可以与需要身份验证的仓库进行交互。
slm

29

您是否知道您的Git存储库始终引用子模块的特定修订版?Jenkins不会自动更改修订版。

如果要使用子模块的较新版本,则必须在本地Git存储库中执行以下操作:

cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule

当您这样做时,Jenkins将在构建过程中签出与子模块完全相同的修订版。Jenkins不会自行决定要使用子模块的哪个修订版。这是Git子模块和SVN外部组件之间的根本区别。

您可能想阅读有关子模块的良好参考,例如http://progit.org/book/ch6-6.html


1
@sti提供的ProGit链接已过期。我认为这是当前等效的https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel

链接断开(与HTTPS相关?)- “ 502错误的网关”
彼得·莫滕森

17

最终偶然发现了一种方法,它很简单。

问题:

带有凭据的初始克隆工作正常,但随后的submodule克隆由于凭据不正确而失败。

  1. 自动高级子模块克隆Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours::导致证书错误。
  2. git submodule update --init在该Execute Shell部分中也失败,并显示凭据错误。

解决方案:

我正在使用jenkins-1.574

  1. 选中Build Environment >> SSH Agent复选框。
  2. 选择正确的凭据(可能与本Source Code Management节中选择的凭据相同)
  3. 更新本Execute Shell节中的子模块

    git submodule sync
    git submodule update --init --recursive
    

这是一个屏幕截图在此处输入图片说明


3
不再有这样的复选框。
adi518 '17

11

看来我找到了解决方案:

我添加了一个构建步骤来执行以下shell命令:

git submodule foreach git checkout master
git submodule foreach git pull

执行完这些命令后,您可能仍需要在超级项目中提交,因为子模块中的HEAD已更新。
slacy 2012年

嗨,Ben,您能否详细分享您的解决方案?我想做同样的事情。另外,只是为了确认一下,您的解决方案将git子模块将项目的子模块更新为WORKSPACE,是吗?
Kim Stacks 2013年

没有比这更多的细节了。我只是将这两行添加到我的构建过程中,它总是提取子模块的最新版本。
2013年

10
就像@sti在这里的另一个响应中所说的那样,似乎您正在尝试使用SVN外部组件之类的Git子模块。与其向Jenkins添加这些命令,不如将适当的子模块版本提交到您的主Git存储库中。然后,在构建项目的特定版本时,Jenkins将始终签出相同版本的子模块。可复制的构建是一件好事。
科迪·卡斯特琳

4
@ben我遇到了这个命令,您可能会发现它更有用,特别是如果您不在子模块中使用master分支 git submodule update --init --recursive
Corey Scott

7

如果使用的是Jenkins Git模块,则可以将其设置为“在构建之前擦除工作空间”,这样,它将始终获得正确的子模块。


2

我在checkout插件中使用脚本化流水线。如果您希望子模块与存储库中的子模块相同,则只需关闭trackingSubmodules选项,如下所示:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.