Wie kann ich mit dem GitHub Org Plugin einen anderen Job aus einer Jenkins-Pipeline (Jenkins-Datei) auslösen?

142

Wie kann ich die Erstellung eines anderen Jobs innerhalb von auslösen Jenkinsfile?

Ich gehe davon aus, dass dieser Job ein weiteres Repository unter derselben Github-Organisation ist , das bereits eine eigene Jenkins-Datei hat.

Ich möchte dies auch nur tun, wenn der Filialname Master ist, da es keinen Sinn macht, Downstream-Builds lokaler Filialen auszulösen.

Aktualisieren:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

Trotzdem bekomme ich bei der Ausführung eine Fehlermeldung

Es wurde kein parametrisierter Job mit dem Namen some-downtream-job-name gefunden

Ich bin sicher, dass dieser Job in Jenkins existiert und sich im selben Organisationsordner befindet wie der aktuelle. Es ist ein anderer Job, der seinen eigenen hat Jenkinsfile.

Bitte beachten Sie, dass diese Frage spezifisch für das GitHub Organization Plugin ist, das automatisch Jobs für jedes Repository und jeden Zweig Ihrer GitHub Organization erstellt und verwaltet.

Sorin
quelle

Antworten:

131

Zuallererst ist es eine Verschwendung eines Executor-Slots, den buildSchritt einzuschließen node. Ihr vorgelagerter Testamentsvollstrecker sitzt ohne Grund im Leerlauf.

Zweitens können Sie in einem Mehrzweigprojekt die Umgebungsvariable verwenden BRANCH_NAME, um die Logik vom aktuellen Zweig abhängig zu machen.

Drittens nimmt der jobParameter einen absoluten oder relativen Jobnamen an. Wenn Sie einen Namen ohne Pfadqualifizierung angeben, verweist dies auf einen anderen Job im selben Ordner, was im Fall eines Mehrzweigprojekts einen anderen Zweig desselben Repositorys bedeuten würde.

Sie wollten also wahrscheinlich schreiben

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Jesse Glick
quelle
2
Vielen Dank! Wenn Sie durch irgendeine Änderung auch wissen, wie Sie diesen Build auslösen können, ohne darauf zu warten, dass er fertig ist, wäre das doppelt großartig :)
Sorin
48
Überprüfen Sie Snippet Generator :build job: '../other-repo/master', wait: false
Jesse Glick
3
Gibt es eine Möglichkeit, den Erstellungsschritt mit einem dynamischen Zweignamen aufzurufen? So etwas wie build job: '../other-repo/$BRANCH_NAME'wo $BRANCH_NAMEist die Jenkins-Umgebungsvariable für den Zweig, in dem das Multibranch-Projekt ausgeführt wird?
msteppe91
2
Wenn ${BRANCH_NAME}es als Umgebungsvariable verfügbar ist, reicht eine einfache Zeichenfolgenersetzung aus. Wechseln Sie einfach zu "von, 'um Ihre Zeichenfolge zu zitieren. zBbuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
2
API-Link für build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie
123

Zusätzlich zu den oben genannten Antworten: Ich wollte einen Job mit einem einfachen Parameter starten, der an eine zweite Pipeline übergeben wurde, und fand die Antwort unter https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

Also habe ich verwendet:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
quelle
11
Der Build-Job muss in einen Schritt eingebettet sein (ab Version 0.5)
Rhoerbe
5
Wird die vom buildBefehl aufgerufene BUILD_NUMBER des Jenkins-Jobs zurückgegeben? Wie kann ich in einer der folgenden Phasen auf BUILD_NUMBER zugreifen? Weiß jemand, wo dieser Befehl dokumentiert ist?
user909481
4
Es ist build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]heutzutage von jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Aber wie man diese Parameter verwendet, die im 2. Job übergeben wurden
Sanfter
2
Interessanterweise build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] hat es bei mir nicht funktioniert, aber: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] funktioniert
Alberto C
24

Der Befehl buildin der Pipeline dient dazu, andere Jobs in Jenkins auszulösen.

Beispiel auf Github

Der Job muss in Jenkins vorhanden sein und kann parametrisiert werden. Was den Zweig betrifft, kann man ihn wohl von git lesen

Flo
quelle
3
Ich habe versucht hinzuzufügen, build job: 'jobnameaber ich erhalte diesen Fehler No parameterized job named jobname foundund kann Ihnen versichern, dass im Organisationsordner ein Job mit diesem Namen auf derselben Ebene vorhanden ist.
Sorin
1
Ja, es gibt einen Job, aber dieser Job ist nicht parametrisiert. Ich versuche zu verstehen, wie man einen vom GitHub-Organisations-Plugin erstellten Job parametrisiert
yiwen
6
Das Jobnamenformat ist:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja
2
@SahilAhuja Das ist völlig willkürlich und basiert auf Ihrem Jenkins-Layout. Wenn Sie einen absoluten Pfad verwenden möchten, müssen Sie mit einem beginnen /. Relative Pfade sind in Ordnung; Sorins Problem war wahrscheinlich, dass der Jobaufruf ein Mehrzweigjob war build, was bedeutet, dass ein Pfad wie jobnameder versuchen würde, den Zweig jobnamedesselben Jobs aufzubauen . es muss ../jobname/branchnamestattdessen sein
Michael Mrozek
Dies funktioniert gut, aber was passiert, wenn der angegebene Zweig nicht vorhanden ist?
Jaime Alcántara Arnela
17

Sie können den build jobSchritt aus der Jenkins-Pipeline verwenden (Mindestanforderung an Jenkins: 2.130).

Hier ist die vollständige API für den buildSchritt: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Wie man benutzt build:

  • job: Name eines zu erstellenden Downstream-Jobs. Kann ein anderer Pipeline-Job sein, aber häufiger ein Freestyle- oder ein anderes Projekt.
    • Verwenden Sie einen einfachen Namen, wenn sich der Job im selben Ordner wie dieser Upstream-Pipeline-Job befindet.
    • Sie können stattdessen relative Pfade wie verwenden../sister-folder/downstream
    • Oder Sie können absolute Pfade wie verwenden/top-level-folder/nested-folder/downstream

Lösen Sie einen anderen Job mit einem Zweig als Parameter aus

In meiner Firma enthalten viele unserer Niederlassungen "/". Sie müssen alle Instanzen von "/" durch "% 2F" ersetzen (wie in der URL des Jobs angegeben).

In diesem Beispiel verwenden wir relative Pfade

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

Lösen Sie einen anderen Job mit der Build-Nummer als Parameter aus

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

Lösen Sie viele Jobs parallel aus

Quelle: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Weitere Informationen zu Parallel finden Sie hier: https://jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

Oder alternativ:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }
Katie
quelle
3

Verwenden Sie das Build Job Plugin für diese Aufgabe, um andere Jobs aus der Jenkins-Datei auszulösen. Sie können Ihrer Ausführung eine Vielzahl von Logik hinzufügen, z. B. Optionen für Parallel, Knoten und Agenten sowie Schritte zum Auslösen externer Jobs. Ich habe dafür ein einfach zu lesendes Kochbuchbeispiel gegeben.

1.Beispiel zum Auslösen eines externen Jobs aus einer Jenkins-Datei mit einem bedingten Beispiel:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2.Beispiel zum Auslösen mehrerer Jobs aus einer Jenkins-Datei mit Beispielen für Bedingungen:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}
avivamg
quelle
Aber wie man die Parameter im 2. Job empfängt und verwendet
Sanfter
2
@Sanft. Sie können auf den übergebenen Parameter als params.systemname
Pankaj Shinde