使用Github组织插件在Jenkins中检出子模块

时间:2016-08-12 15:30:12

标签: git jenkins groovy git-submodules jenkins-pipeline

我在Github Organization plugin创建的Jenkins中有一个构建作业。此构建的Jenkinsfile使用checkout scm签出代码,这很好,因为它在构建PR触发的更改或推送到主分支时计算出要检出的正确分支/修订。

我该怎么做:

node {
  checkout scm 
}

结帐子模块?

4 个答案:

答案 0 :(得分:16)

sh 'git submodule...'解决方案仅适用于没有特殊身份验证的Repositorys。

我们在设置中使用以下解决方案:

node {
    checkout([
        $class: 'GitSCM',
        branches: scm.branches,
        doGenerateSubmoduleConfigurations: true,
        extensions: scm.extensions + [[$class: 'SubmoduleOption', parentCredentials: true]],
        userRemoteConfigs: scm.userRemoteConfigs
    ])
}

答案 1 :(得分:7)

在Github组织插件中,添加高级子模块行为。

Org Setings Page

并按照以下方式配置:

enter image description here

正如@oeuftete指出的那样,你也可能需要通过SSH添加" Checkout"如果子模块使用SSH协议,则行为(并提供密钥凭证)。

如此处所述:https://wiki.jenkins.io/display/JENKINS/Git+Plugin

答案 2 :(得分:2)

将其更改为:

node {
    checkout scm
    sh 'git submodule update --init'
}

如果Jenkins在Windows上运行,请使用bat代替sh

答案 3 :(得分:1)

我们有类似的问题,Jenkin用户正在使用https从Github提取请求,但是子模块正在使用SSH,我们希望通过Jenkins处理提取请求。 我做了以下结帐阶段,希望对您有所帮助:

stage('Checkout') {
  if(env.BRANCH_NAME == "develop" || env.BRANCH_NAME == "master") {
    checkout([
      $class: 'GitSCM',
      branches: scm.branches,
      doGenerateSubmoduleConfigurations: false,
      extensions: [[$class: 'SubmoduleOption',
                    disableSubmodules: false,
                    parentCredentials: true,
                    recursiveSubmodules: true,
                    reference: '',
                    trackingSubmodules: false],
                   [$class: 'CleanBeforeCheckout'], 
                   [$class: 'CleanCheckout']],
      submoduleCfg: [],
      userRemoteConfigs: [[credentialsId: 'jenkins-ssh',
                           url: 'git@github.com:<AccountName>/<RepoName.git>']]
                          ])
  }
  else if (env.CHANGE_ID) {
    checkout([
      $class: 'GitSCM',
      branches: [[name: "FETCH_HEAD"]],
      doGenerateSubmoduleConfigurations: false,
      extensions: [[$class: 'SubmoduleOption',
                    disableSubmodules: false,
                    parentCredentials: true,
                    recursiveSubmodules: true,
                    reference: '',
                    trackingSubmodules: false],
                   [$class: 'CleanBeforeCheckout'], 
                   [$class: 'CleanCheckout']],
      submoduleCfg: [],
      userRemoteConfigs: [[credentialsId: 'jenkins-ssh', 
                           refspec: "+refs/pull/${CHANGE_ID}/head:refs/remotes/origin/${BRANCH_NAME} +refs/heads/${CHANGE_TARGET}:refs/remotes/origin/${CHANGE_TARGET}", 
                           url: 'git@github.com:<AccountName>/<RepoName.git>']]
    ])
  }
}

也许有一种更简单的方法,我很高兴收到您的来信:-)