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

Posted

技术标签:

【中文标题】使用 Jenkins 管道将多个 git 存储库签出到同一个作业中【英文标题】:Using a Jenkins pipeline to checkout multiple git repos into same job 【发布时间】:2017-03-06 13:49:55 【问题描述】:

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

Multiple SCM 现已折旧,文中建议移至管道。我试过了,但我不知道如何让它工作。

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

$ ls
Combination
CombinationBuilder
CombinationResults

这三个子目录中的每一个都有一个检出的 git repo。对于 Multiple SCM,我使用了 git,然后添加了“结帐到子目录”行为。这是我对管道脚本的尝试:

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')

但是,git 命令似乎在工作区的***目录中执行(这有点道理),而且根据语法,似乎也没有 checkout-to-sub-directory 行为。

【问题讨论】:

Jenkins 让这个功能变得如此困难,与 TeamCity 相比,它就像锤子和凿子,让这个功能如此优雅。 【参考方案1】:

这是我的

    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'
            
        
    

【讨论】:

对我来说就像一个魅力!谢谢。 非常有帮助的回复 这似乎需要Git Parameter plugin【参考方案2】:

您可以通过使用 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']]
        ])


【讨论】:

对我来说这是一个完美的解决方案,因为我有复杂的选择。 非常感谢! @ngealy 很棒的扩展:[[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CalibrationResults']],这是我需要的,只要说文件夹的名称将放置克隆的 repo,谢谢。 【参考方案3】:

如果您的存储库有子模块,请使用 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']]])


                
            
        

    



使用 Checkout git sn-p 生成器生成

【讨论】:

知道如何检查给定分支的子模块吗?【参考方案4】:

您可以使用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')

【讨论】:

完美,成功了,谢谢!我正在慢慢学习管道。我希望所有软件都只决定使用一种 DSL 来完成工作流。我不得不学习这么多。 :-) 如何回到$WORKSPACE目录/管道目录?我必须返回到全局上下文来执行一些脚本。目录切换上下文并将其保留在那里。最后一个“ls”命令将打印 CombinationBuilder 存储库的内容。 您如何为 repos 使用不同的凭据?即说我的“主要”存储库(Jenkins 正在监视以触发该工作)位于 Bitbucket 中,我想在构建中克隆现有的 Github 存储库,如何为 Bitbucket 指定一组凭据和为 Github 指定不同的凭据? 要使用不同的凭据,请在 git 命令上使用可选参数“credentialsId”。例如git url: 'https://github.com/AtlasBID/CombinationBuilder.git', credentialsId: 'foo' 其中 'foo' 是来自 Jenkins 的凭证 ID。 @haridsv,git 的文档在这里:jenkins.io/doc/pipeline/steps/git

以上是关于使用 Jenkins 管道将多个 git 存储库签出到同一个作业中的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 Git 存储库添加到 Jenkins 时的访问问题

如何使用管道代码覆盖默认的 Jenkins Git 插件检出?

为多个 Git (GitHub) 存储库重用一个 Jenkins 作业

Jenkins:一个项目的多个Git存储库

在带有 ssh、scp 或 sftp 的 jenkins 管道中使用 ssh 凭据

使用多个Jenkins工件创建Xl部署包