Jenkins pipeline git命令子模块更新
我想更新git clone上的子模块 有没有办法用Jenkins管道Git命令实现这一点 目前我正在做这个Jenkins pipeline git命令子模块更新,git,jenkins,jenkins-pipeline,Git,Jenkins,Jenkins Pipeline,我想更新git clone上的子模块 有没有办法用Jenkins管道Git命令实现这一点 目前我正在做这个 git branch: 'master', credentialsId: 'bitbucket', url: 'ssh://bitbucket.org/hello.git' 然而,一旦克隆了当前子模块,它就不会更新子模块,您甚至不需要它 GIT插件支持具有子模块的存储库,而子模块本身又具有子模块。 但必须启用此选项: 在作业配置->源代码管理部分,Git->高级按钮(在要
git branch: 'master',
credentialsId: 'bitbucket',
url: 'ssh://bitbucket.org/hello.git'
然而,一旦克隆了当前子模块,它就不会更新子模块,您甚至不需要它
GIT插件支持具有子模块的存储库,而子模块本身又具有子模块。但必须启用此选项: 在作业配置->源代码管理部分,Git->高级按钮(在要构建的分支下)->递归更新子模块 但OP正在使用管道 因此,简单的第一个构建步骤就足够了:
git submodule update --init --recursive
然而,OP补充道:
是的,但是如果我使用的是
sh'git子模块update--init--recursive'
,这将使用$HOME/id\u rsa
对吗?如果可能的话,我想为这个命令传递我的私钥
这是可能的:在中,您可以。这意味着您可以设置
GIT\u SSH\u命令()。
这让你可以
如果任何克隆涉及ssh url,则该ssh克隆将使用正确的私钥。作为管道步骤是相当有限的,因为它提供了更复杂的url的默认实现。对于更高级的配置,您应该使用,您可以为其传递大量参数,包括所需的子模块配置
您想要使用的可能是这样的:
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 scm
正在使用的凭证名称,还可以显式地将其传递给git命令以更新子模块:
checkout([
$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: false,
extensions: [[
$class: 'SubmoduleOption',
disableSubmodules: false,
parentCredentials: true,
recursiveSubmodules: true,
reference: '',
trackingSubmodules: false
]],
submoduleCfg: [],
userRemoteConfigs: scm.userRemoteConfigs
])
stage ('Clone') {
steps {
checkout scm
withCredentials([sshUserPrivateKey(credentialsId: 'bitbucket_ssh', keyFileVariable: 'SSH_KEY')]) {
sh 'GIT_SSH_COMMAND="ssh -i $SSH_KEY" git submodule update --init'
}
}
}
不过这是git管道的问题。如何配置Pipeline project?@激情开发者无需管道:常规Git插件就足够了。我使用的是管道脚本,它在里面调用Git
命令。我没有更改作业配置->部分源代码管理的选项。是的,但是如果我使用sh'git子模块更新--init--recursive'
这将使用$HOME/id\u rsa,对吗?如果可能的话,我想为这个命令传递我的私钥…@daitienshi不确定:这最好作为一个单独的问题,添加了OS、Git和Jenkins的版本。我刚刚运行了上面的代码,得到了hudson.plugins.Git.Git异常:命令“Git submodule update--init--recursive common”返回状态代码1:
控制台日志中没有其他输出吗?如果您没有,您可能应该直接在Jenkins实例上尝试失败的命令(如果您有访问权限),以确保您的子模块“common”可以手动更新,因此这是另一个问题:您没有克隆子模块存储库的权限。子模块存储库应该在Bitbucket中配置相同的公共SSH密钥,以便您可以签出它。是的,但是您正在为声明性管道语法提供答案和代码示例,而@PicturateDeveloper似乎在使用jenkins pipelines标准语法,用于那些获得权限拒绝(publickey)
的人。您的凭据必须与URL位于同一行,例如:userRemoteConfigs:[[CredentialId:'45345trete-92eb-4eb0-8844-1fd7ghj76',URL:'ssh://git@bitbucket……git']]])
。要获取凭证ID,请单击Jenkins主页右侧工具栏中的凭证。您将看到一个凭证表,ID是该表的一个字段。
stage ('Clone') {
steps {
checkout scm
withCredentials([sshUserPrivateKey(credentialsId: 'bitbucket_ssh', keyFileVariable: 'SSH_KEY')]) {
sh 'GIT_SSH_COMMAND="ssh -i $SSH_KEY" git submodule update --init'
}
}
}