如何在声明式管道中检出具有不同部署密钥的git子模块

时间:2019-04-10 05:56:06

标签: git jenkins jenkins-pipeline git-submodules

我有一个托管在Enterprise GitHub实例中的项目。该项目引用同一实例中的子模块。

  • 为访问主项目,我在Github存储库中配置了“ DeployKey_1”。

  • 为访问子模块项目,我在Github存储库中配置了“ DeployKey_2”。

注意:我不能在GitHub Enterprise上使用相同的部署密钥:Key Already in Use

Jenkins作业定义为多分支管道,我在Jenkinsfile中使用checkout命令:

checkout([
    $class: 'GitSCM',
    branches: scm.branches,
    doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
    extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: false]],
    userRemoteConfigs: scm.userRemoteConfigs
])

我尝试了两个选项:设置parentCredentials: trueparentCredentials: false,但是在执行作业时都导致此错误:

  

hudson.plugins.git.GitException:命令“ git子模块更新--init   --recursive my-submodule“返回状态码1:stdout:stderr:克隆到   '/ private / tmp / workspace / project_develop / my-submodule'...   git@github.mycompany.com:权限被拒绝(公钥)。致命的:不能   从远程存储库读取。

     

请确保您具有正确的访问权限和存储库   存在。致命:克隆   'git@github.mycompany.de:myorga / my-submodule.git'   进入子模块路径   '/ private / tmp / workspace / project_develop / my-submodule'   失败无法克隆“我的子模块”。重试计划的克隆   进入   '/ private / tmp / workspace / project_develop / my-submodule'...   git@github.mycompany.de:权限被拒绝(公钥)。致命的:不能   从远程存储库读取。

     

请确保您具有正确的访问权限

Jenkins均提供了两个部署密钥。那么,如何检出子模块?检出子模块时,如何告诉checkout命令使用特定的credentials-id

1 个答案:

答案 0 :(得分:1)

我认为这完全取决于git配置,并且SCM无法支持太多的边缘用例。

关于submoduleCfg中带有GitSCM的选项,但它只允许您完成设置子模块的名称和分支的工作。

package hudson.plugins.git;

public class SubmoduleConfig implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    String   submoduleName;
    String[] branches;

如果您要从使用密钥转到使用凭据,则可以使用硬编码的用户名/密码来更新子模块配置。

git submodule init
git config submodule.my_submodule.url "https://username:password@url/my_submodule.git"
git submodule update