Verwenden einer Jenkins-Pipeline zum Auschecken mehrerer Git-Repos in denselben Job


76

Ich verwende das Jenkins Multiple SCM-Plugin, um drei Git-Repositorys in drei Unterverzeichnissen in meinem Jenkins-Job auszuchecken. Ich führe dann einen Befehlssatz aus, um einen einzelnen Satz von Artefakten mit Informationen und Code zu erstellen, die aus allen drei Repositorys stammen.

Mehrere SCM werden jetzt abgeschrieben, und im Text wird empfohlen, auf Pipelines umzusteigen. Ich habe es versucht, aber ich kann nicht herausfinden, wie es funktioniert.

Hier ist die Verzeichnisstruktur, die ich von der obersten Ebene meines Jenkins-Jobverzeichnisses aus sehen möchte:

$ ls
Combination
CombinationBuilder
CombinationResults

In jedem dieser drei Unterverzeichnisse ist ein einzelnes Git-Repo ausgecheckt. Beim Multiple SCM habe ich git verwendet und dann das Verhalten "Auschecken in ein Unterverzeichnis" hinzugefügt. Hier war mein Versuch mit einem Pipeline-Skript:

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

Der Befehl git scheint jedoch im obersten Verzeichnis des Arbeitsbereichs ausgeführt zu werden (was sinnvoll ist), und auch gemäß der Syntax scheint es kein Verhalten beim Auschecken in Unterverzeichnisse zu geben.


Jenkins macht das so schwer, es ist wie Hammer und Meißel im Vergleich zu TeamCity, was diese Funktion so elegant macht.
C Johnson

Antworten:


100

Mit dem dirBefehl können Sie einen Pipeline-Schritt in einem Unterverzeichnis ausführen:

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

8
Perfekt, das hat den Trick gemacht, danke! Ich lerne langsam die Pipelines. Ich wünschte, die gesamte Software würde sich nur für ein DSL für den Workflow entscheiden. Ich musste so viele lernen. :-)
Gordon

3
Wie kehren Sie zum Verzeichnis $ WORKSPACE / zum Pipeline-Verzeichnis zurück? Ich muss zum globalen Kontext zurückkehren, um einige Skripte auszuführen. Das Verzeichnis wechselt den Kontext und lässt ihn dort. Der letzte Befehl 'ls' druckt den Inhalt des CombinationBuilder-Repos.
Daniel Colceag

2
Wie verwenden Sie unterschiedliche Anmeldeinformationen für die Repos? Das heißt, mein "Haupt" -Repo (das Jenkins überwacht, um den Job auszulösen) befindet sich in Bitbucket, und ich möchte ein vorhandenes Github-Repo innerhalb des Builds klonen. Wie gebe ich einen Satz von Creds für Bitbucket und einen anderen für Github an? ?
Adam Parkin

11
Um verschiedene Anmeldeinformationen zu verwenden, verwenden Sie den optionalen Parameter 'credentialsId' im Befehl git. zB git url: 'https://github.com/AtlasBID/CombinationBuilder.git', credentialsId: 'foo'wo 'foo' eine Berechtigungsnachweis-ID von Jenkins ist.
Magneon

1
@haridsv, Dokumentation für gitist hier: jenkins.io/doc/pipeline/steps/git
Nick Jones

26

Sie können diese drei Git-Repositorys in drei Unterverzeichnisse auschecken, indem Sie den SCM-Schritt zum Auschecken dreimal wie folgt ausführen:

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

}

1
Für mich war dies die perfekte Lösung, da ich komplexe Optionen habe.
Sean83

10

Hier ist meins

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

Arbeitete wie ein Zauber für mich! Vielen Dank.
MeowRude

sehr hilfreiche Antwort
Imran

1
Dies scheint das Git-Parameter-Plugin
SyntaxRules

3

Wenn Ihr Repository über Submodule verfügt, verwenden Sie 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']]])


                }
            }
        }

    }

}
}

Generiert mit dem Checkout Git Snippet Generator

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.