我在Jenkins项目中有一个子模块。我已启用递归更新子模块的高级设置。
当我运行构建时,我发现工作区有来自子模块的文件。问题是,它似乎是子模块的第一个版本。当我推送更改(存储在GitHub上的仓库)时,Jenkins似乎没有更新子模块以获取正确的更改。是否有人见过这种情况?
我在Jenkins项目中有一个子模块。我已启用递归更新子模块的高级设置。
当我运行构建时,我发现工作区有来自子模块的文件。问题是,它似乎是子模块的第一个版本。当我推送更改(存储在GitHub上的仓库)时,Jenkins似乎没有更新子模块以获取正确的更改。是否有人见过这种情况?
高级子模块行为
> 在该字段 "Path of the reference repo to use during submodule update
" 中,添加子模块 git url。
对于认证问题,现在有一个“使用父仓库的默认远程凭据”选项
在JENKINS-20941中可以看到:
GIT插件支持具有子模块的存储库,这些子模块本身又具有子模块。不过必须开启此功能:在作业配置 -> 源代码管理部分,Git -> 高级按钮(在要构建的分支下) -> 递归更新子模块。
从作业的配置屏幕中,在源代码管理部分,拉动添加按钮并选择“高级子模块行为”。
您是否知道,您的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
最终我找到了一个简单的方法来解决这个问题。
使用凭据进行的初始克隆正常工作,但随后的submodule
克隆会因凭证不正确而失败。
源代码管理 >>其他行为 >>高级子模块行为
:导致凭证错误。Execute Shell
部分中的git submodule update --init
也会因凭证错误而失败。我正在使用jenkins-1.574
。
Build Environment >> SSH代理
框。 源代码管理
部分中选择的凭证相同)在Execute Shell
部分更新子模块
git submodule sync
git submodule update --init --recursive
这是一个屏幕截图
看起来我找到了一个解决办法:
我添加了一个构建步骤来执行以下 shell 命令:
git submodule foreach git checkout master
git submodule foreach git pull
git submodule update --init --recursive
。 - Corey Scott如果您正在使用Jenkins Git模块,可以将其设置为“在构建之前清除工作区”,这样它就始终可以获取正确的子模块。
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']]])
scmGit ...
sh 'git submodule add --force "<sub-path>" "<sub-name>"'