Jenkins pipeline 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 clone上的子模块

有没有办法用Jenkins管道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'
            }
        }
    }