使用Jenkins管道将多个git repos签出到同一个作业中

Gor*_*don 55 git jenkins jenkins-pipeline

我正在使用Jenkins Multiple SCM插件在我的Jenkins作业中将三个git存储库检入三个子目录.然后,我执行一组命令来构建一组工件,其中包含从所有三个存储库中提取的信息和代码.

现在折旧了多个SCM,文本建议移动到管道.我试过了,但我无法弄清楚如何让它发挥作用.

这是我有兴趣从Jenkins作业目录的顶层看到的目录结构:

$ ls
Combination
CombinationBuilder
CombinationResults
Run Code Online (Sandbox Code Playgroud)

这三个子目录中的每一个都签出了一个git repo.使用多个SCM,我使用git,然后添加"checkout to a subdirectory"行为.这是我尝试使用管道脚本:

node('ATLAS && Linux') {
    sh('[ -e CalibrationResults ] || mkdir CalibrationResults')
    sh('cd CalibrationResults')
    git url: 'https://github.com/AtlasBID/CalibrationResults.git'
    sh('cd ..')
    sh('[ -e Combination ] || mkdir Combination')
    sh('cd Combination')
    git url: 'https://github.com/AtlasBID/Combination.git'
    sh('cd ..')
    sh('[ -e CombinationBuilder ] || mkdir CombinationBuilder')
    sh('cd CombinationBuilder')
    git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
    sh 'cd ..'

    sh('ls')
    sh('. CombinationBuilder/build.sh')
}
Run Code Online (Sandbox Code Playgroud)

但是,git命令似乎在工作区的顶级目录中执行(这有一定意义),并且根据语法,似乎没有checkout-to-sub-directory行为.

Wil*_*ven 80

您可以使用该dir命令在子目录中执行管道步骤:

node('ATLAS && Linux') {
    dir('CalibrationResults') {
        git url: 'https://github.com/AtlasBID/CalibrationResults.git'
    }
    dir('Combination') {
        git url: 'https://github.com/AtlasBID/Combination.git'
    }
    dir('CombinationBuilder') {
        git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
    }

    sh('ls')
    sh('. CombinationBuilder/build.sh')
}
Run Code Online (Sandbox Code Playgroud)

  • 要使用不同的凭据,请在git命令中使用可选参数'credentialsId'.例如`git url:'https://github.com/AtlasBID/CombinationBuilder.git',credentialsId:'foo'`其中'foo'是来自Jenkins的凭证ID. (11认同)
  • 完美,这就是诀窍,谢谢!我正在慢慢学习管道.我希望所有的软件都能决定使用一个DSL来完成工作流程.我必须学到很多东西.:-) (5认同)
  • 如何返回$ WORKSPACE目录/管道目录?我必须返回全局上下文来执行一些脚本。目录切换上下文并将其留在那里。最后一个“ ls”命令将打印CombinationBuilder存储库的内容。 (2认同)
  • 你如何使用不同的凭证进行回购?也就是说我的"主要"仓库(Jenkins正在监控以触发工作)生活在Bitbucket中,我想在构建中克隆现有的Github仓库,我如何为Bitbucket指定一组信用卡,为Github指定另一套信用卡? (2认同)
  • @haridsv,“git”的文档位于:https://jenkins.io/doc/pipeline/steps/git/ (2认同)

小智 17

您可以使用checkout SCM步骤将这三个git存储库签出到三个子目录中,如下所示:

stage('Checkout') {
 // Get CalibrationResults from GitHub
 checkout([  
            $class: 'GitSCM', 
            branches: [[name: 'refs/heads/master']], 
            doGenerateSubmoduleConfigurations: false, 
            extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CalibrationResults']], 
            submoduleCfg: [], 
            userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CalibrationResults.git']]
        ])
 // Get Combination from GitHub
 checkout([  
            $class: 'GitSCM', 
            branches: [[name: 'refs/heads/master']], 
            doGenerateSubmoduleConfigurations: false, 
            extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'Combination']], 
            submoduleCfg: [], 
            userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/Combination.git']]
        ])
 // Get CombinationBuilder from GitHub
 checkout([  
            $class: 'GitSCM', 
            branches: [[name: 'refs/heads/master']], 
            doGenerateSubmoduleConfigurations: false, 
            extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CombinationBuilder']], 
            submoduleCfg: [], 
            userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CombinationBuilder.git']]
        ])

}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您的存储库有子模块,请使用 git checkout

pipeline {
agent {label 'master'}
stages{
    stage("Demo"){
        steps{

            echo 'Hello World'
        }
    }
    stage("Source"){
        parallel{
            stage('CalibrationResults'){
                steps{
                    echo 'Checking out CalibrationResults'
                    checkout([$class: 'GitSCM', branches: [[name: '*/CI-CD-Demo']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-core'],[$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CalibrationResults.git']]])
                }
            }
            stage('Combination'){

                steps{
                    echo 'Checking out server spoke'
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-spoke'], [$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CombinationBuilder.git']]])


                }
            }
        }

    }

}
}
Run Code Online (Sandbox Code Playgroud)

使用 Checkout git 片段生成器生成


小智 6

Here's Mine

    stage('CheckoutModule1') {
        steps {
            sh 'mkdir -p Module1'
            dir("Module1")
            {
                git branch: "develop",
                credentialsId: 'aaa',
                url: 'git@a.com:b/module1.git'
            }
        }
    }

    stage('CheckoutModule2') {
        steps {
            sh 'mkdir -p Module2'
            dir("Module2")
            {
                git branch: "develop",
                credentialsId: 'aaa',
                url: 'git@a.com:b/module2.git'
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这似乎需要 [Git Parameter 插件](https://plugins.jenkins.io/git-parameter/) (3认同)