Jenkins pipeline git 命令 submodule update
Jenkins pipeline git 命令 submodule update
我想在 git clone 的时候更新子模块。
是否有一种方法可以使用 Jenkins pipeline Git 命令来实现这一点?
目前我正在执行以下操作...
git branch: 'master', credentialsId: 'bitbucket', url: 'ssh://bitbucket.org/hello.git'
然而它不会在克隆后更新子模块。
使用当前的Git插件,您甚至都不需要那个(shell脚本)。
Git插件支持具有子模块的仓库,这些仓库本身又具有子模块。
需要打开这个设置才能使用:在作业配置->源代码管理部分,Git->高级按钮(在要构建的分支下)->递归更新子模块
但是,OP(原帖发表者)正在使用流水线。
因此,简单的第一个构建步骤就足够了:
git submodule update --init --recursive
然而,OP补充说:
是的,但是如果我使用
sh 'git submodule update --init --recursive'
,这将使用$HOME/id_rsa
,对吗?如果可能的话,我想为此命令传递我的私钥。
这是可能的:在流水线语法中,您可以定义环境变量。
这意味着您可以设置GIT_SSH_COMMAND
(使用Git 2.10+)。
这允许您引用您自己的私钥。
pipeline { agent any environment { GIT_SSH_COMMAND = 'ssh -i /path/to/my/private/key' } stages { stage('Build') { steps { sh 'printenv' sh 'git submodule update --init --recursive' } } } }
如果有任何clone涉及ssh url,那么该ssh clone将使用正确的私钥。
不幸地,这并不起作用:
JENKINS-38860
上面报告的错误:
FATAL: Command "git config --get submodule.MySubModule.url" returned status code 1
只要您有嵌套的子模块,我就会遇到这个错误。
考虑这样的场景,repo
A
包含子模块B
,它包含子模块C
。如果未启用 "
高级子模块行为
" 中的 "递归更新子模块
",Jenkins 将克隆A
,检出/克隆B
,并且无法初始化/克隆C
。
这可能是预期的行为。如果启用 "
递归更新子模块
",您将收到以下错误:FATAL: Command "git config --get submodule.C.url" returned status code 1
作为管道步骤的git命令相当有限,因为它提供了更复杂的checkout命令的默认实现。要进行更高级的配置,应该使用checkout命令,其中可以传递许多参数,包括所需子模块配置。
您可能想要使用的是这样的内容:
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[url: 'your-git-server/your-git-repository']]])
从文档中编写这些代码行通常很麻烦,我建议您改用Jenkins的非常好的“代码片段生成器”(YourJenkins>yourProject>PipelineSyntax)自动生成checkout命令!