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

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

目前我正在做这个…

git branch: 'master',

credentialsId: 'bitbucket',

url: 'ssh://bitbucket.org/hello.git'

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

作为管道步骤的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非常好的Snippet Generator(YourJenkins>YourProject>PipelineSyntax)来自动生成签出行!

我刚才跟上面的跑了,得到了埃多克斯1〔14〕。

控制台日志中没有其他输出吗?如果没有,您应该直接在Jenkins实例上尝试失败的命令(如果您有访问权限),以确保子模块"common"可以手动更新。

我已经在我的Jenkins实例上手动尝试过了,但它也不起作用。与Permission denied (publickey).基本相同的错误

好吧,这是另一个问题:您没有克隆子模块存储库的权限。子模块存储库应该在bitback中配置相同的公共ssh密钥,这样您就可以签出它了。

不错的命令(+1),但正如我在回答中提到的,这更多的是关于ssh配置问题。

是的,但是您正在给出声明性管道语法的答案和代码示例,而@simpartatedeveloper似乎使用的是Jenkins管道标准语法。

通过添加"checkout",它是替换管道所做的默认"general scm",还是除了它之外?

对于那些得到一个Permission denied (publickey)的人。您的凭证必须与URL位于同一行,例如:userRemoteConfigs: [[credentialsId: '45345trete-92eb-4eb0-8844-1fd7ghj76', url: 'ssh://git@bitbucket.....git']]])。要获取凭证ID,请单击Jenkins主页右侧工具栏中的凭证。您将看到一个凭证表,ID是该表的一个字段。

使用当前的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

但运营商正在使用管道。

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

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+)。这允许您引用自己的私钥。

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

不过,这是Git管道。如何配置管道项目?

@不需要管道:常规的Git插件就足够了。

我正在使用管道脚本,它在里面调用git命令。我没有更改作业配置->节源代码管理的选项。

@激情开发人员那么在管道脚本中的一个构建步骤就足够了:git子模块更新--ini--recursive as above"ed

是的,但如果我使用的是sh 'git submodule update --init --recursive',这将使用$home/id_rsa,对吗?如果可能的话,我想输入这个命令的私钥…

@激情开发人员,好吧,我已经编辑了我的答案,以解决詹金斯管道的具体用例。

谢谢。是否有方法使用凭据ID?

@激情开发人员"凭证ID"是什么意思?凭据用于https url(用户名/密码)。或者您是指密码短语protexted private ssh key?

对。在管道中执行Git克隆时,可以通过CredentialSid检索在Jenkins中存储为"ssh用户名和私钥"的凭据。我正试图找到一种干净的方法来在管道内部执行sh 'git submodule update --init'

@我不知道激情开发人员:我在issues.jenkins-ci.org/browse/jenkins-26085中看到了credentialsId,所以检查在git克隆之后使用的构建步骤是否仍然使用它。如果没有,可以使用wiki.jenkins ci.org/display/jenkins/credentials+binding+plug‌&误8203;来支持.cloudbees.com/hc/en-us/articles/…。

在jenkins slave的$HOME/id_rsa中添加id_rsa怎么样?我这样做了,但我做的时候,它仍然与permission denied错误。

@然后,我的答案仍然是最简单的方式:确保可以从发生Git克隆的代理访问私钥,并且Git_ssh_命令将使其工作。

@热情的开发者,如果你在任何地方加上id_rsa,只需简单地引用它的完整路径(不是~/...,而是/full/complete/path/to/id_rsa和GIT_SSH_COMMAND,这就行了。

刚试过这个,但不起作用。我也犯了同样的错误

你的詹金斯经纪人有2.10吉特或更多吗?

这是2.1.4,所以这就是原因。我刚刚把私钥保存到根用户/root/.ssh/id_rsa的主目录,有趣的是,根用户$HOME的/home/jenkins是我保存该私钥的/home/jenkins,以前不工作。所以我觉得现在还可以。

好啊。但如果可以,请升级到Git 2.11.1。

@VONC令人印象深刻的答案-我喜欢你处理所有问题后的方式。谢谢您!

@古斯冈内特,非常欢迎你。

checkout([

$class: 'GitSCM',

branches: scm.branches,

doGenerateSubmoduleConfigurations: false,

extensions: [[

$class: 'SubmoduleOption',

disableSubmodules: false,

parentCredentials: true,

recursiveSubmodules: true,

reference: '',

trackingSubmodules: false

]],

submoduleCfg: [],

userRemoteConfigs: scm.userRemoteConfigs

])

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐