Jenkins pipeline git 命令 submodule update

8 浏览
0 Comments

Jenkins pipeline git 命令 submodule update

我想在 git clone 的时候更新子模块。

是否有一种方法可以使用 Jenkins pipeline Git 命令来实现这一点?

目前我正在执行以下操作...

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

然而它不会在克隆后更新子模块。

admin 更改状态以发布 2023年5月21日
0
0 Comments

使用当前的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将使用正确的私钥。


请注意,sancelot评论中指出

不幸地,这并不起作用: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

0
0 Comments

作为管道步骤的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命令!

0