Jenkins管道git命令子模块更新

Jenkins pipeline git command submodule update

我想在Git克隆上更新子模块。

有没有办法用jenkins pipeline git命令来完成这个操作?

目前我正在做这个…

1
2
3
git branch: 'master',
    credentialsId: 'bitbucket',
    url: 'ssh://bitbucket.org/hello.git'

但是,一旦克隆,它就不会更新子模块。


作为管道步骤的git命令非常有限,因为它提供了更复杂的checkout命令的默认实现。对于更高级的配置,您应该使用checkout命令,为此您可以传递大量参数,包括所需的子模块配置。

您想要使用的可能是这样的:

1
2
3
4
5
6
7
8
9
10
11
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非常好的Snippet Generator(YourJenkins>YourProject>PipelineSyntax)来自动生成签出行!


使用当前的Git插件,您甚至不需要它。

The GIT plugin supports repositories with submodules which in turn have submodules themselves.
This must be turned on though:

in Job Configuration -> Section Source Code Management, Git -> Advanced Button (under Branches to build) -> Recursively update submodules

但运营商正在使用管道。

因此,一个简单的第一个构建步骤就足够了:

1
git submodule update --init --recursive

但是,OP补充道:

Yes but if I'm using sh 'git submodule update --init --recursive', this will use $HOME/id_rsa right? I want to pass in my private key for this command if possible.

有可能:在管道语法中,可以定义环境变量。这意味着您可以设置GIT_SSH_COMMAND(使用git 2.10+)。这允许您引用自己的私钥。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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'
            }
        }
    }
}

如果任何克隆涉及到ssh URL,则该ssh克隆将使用正确的私钥。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
checkout([
    $class: 'GitSCM',
    branches: scm.branches,
    doGenerateSubmoduleConfigurations: false,
    extensions: [[
      $class: 'SubmoduleOption',
      disableSubmodules: false,
      parentCredentials: true,
      recursiveSubmodules: true,
      reference: '',
      trackingSubmodules: false
    ]],
    submoduleCfg: [],
    userRemoteConfigs: scm.userRemoteConfigs
  ])