Come posso innescare un altro lavoro da una pipeline jenkins (jenkinsfile) con il plug-in GitHub Org?


142

Come posso attivare la creazione di un altro lavoro dall'interno di Jenkinsfile ?

Presumo che questo lavoro sia un altro repository all'interno della stessa organizzazione github , uno che ha già il proprio file Jenkins.

Voglio anche farlo solo se il nome del ramo è master, poiché non ha senso innescare build downstream di tutti i rami locali.

Aggiornare:

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

Tuttavia, quando eseguito ottengo un errore

Nessun lavoro con parametri denominato some-downtream-job-name trovato

Sono sicuro che questo lavoro esiste in jenkins e si trova nella stessa cartella dell'organizzazione di quella corrente. È un altro lavoro che ha il suo Jenkinsfile.

Si noti che questa domanda è specifica per il plugin dell'organizzazione GitHub che crea e mantiene automaticamente i lavori per ciascun repository e ramo della propria organizzazione GitHub.

Risposte:


131

Prima di tutto, è uno spreco di slot per esecutori concludere il buildpasso node. Il tuo esecutore a monte resterà inattivo senza motivo.

In secondo luogo, da un progetto multibranch, è possibile utilizzare la variabile di ambiente BRANCH_NAMEper subordinare la logica al ramo corrente.

In terzo luogo, il jobparametro accetta un nome lavoro assoluto o relativo. Se si assegna un nome senza qualifica di percorso, si farebbe riferimento a un altro lavoro nella stessa cartella, che nel caso di un progetto multibranch significherebbe un altro ramo dello stesso repository.

Quindi probabilmente intendevi scrivere

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
Grazie! Se per caso sapessi anche come attivare questa build senza aspettare che finisca, sarebbe fantastico doppio :)
sorin

48
Controlla Snippet Generator :build job: '../other-repo/master', wait: false
Jesse Glick

3
C'è un modo per chiamare il passo di compilazione con un nome di ramo dinamico? Qualcosa di simile a build job: '../other-repo/$BRANCH_NAME'dove si $BRANCH_NAMEtrova la variabile d'ambiente Jenkins relativa al ramo che esegue il progetto Multibranch?
msteppe91,

2
se ${BRANCH_NAME}è disponibile come variabile d'ambiente, lo farà la semplice sostituzione della stringa. Assicurati di passare a" da 'per citare la tua stringa. ad es.build job: "../other-repo/${BRANCH_NAME}"
Cenerentola,


123

Oltre alle risposte di cui sopra: volevo iniziare un lavoro con un semplice parametro passato a una seconda pipeline e ho trovato la risposta su https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

Quindi ho usato:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
Il processo di compilazione deve essere incorporato in un passaggio (a partire dalla versione 0.5)
rhoerbe,

5
Il BUILD_NUMBER del lavoro Jenkins richiamato dal buildcomando viene restituito? Come accedere a BUILD_NUMBER in una delle seguenti fasi? Qualcuno sa dove è documentato quel comando?
user909481

4
È build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]oggi, da jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży

Ma come utilizzare questi parametri passati nel 2 ° lavoro
Gentle

2
È interessante notare che build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] non ha funzionato per me ma: ha build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] funzionato
Alberto C

24

Il comando buildin pipeline è lì per innescare altri lavori in jenkins.

Esempio su github

Il lavoro deve esistere in Jenkins e può essere parametrizzato. Per quanto riguarda il ramo, immagino che tu possa leggerlo da Git


3
Ho provato ad aggiungere build job: 'jobnamema ricevo questo errore No parameterized job named jobname founde posso assicurarti che esiste un lavoro con questo nome allo stesso livello nella cartella dell'organizzazione.
sorin,

1
Sì, esiste un lavoro, ma quel lavoro non è parametrizzato. Sto cercando di capire come parametrizzare un lavoro creato dal plug-in dell'organizzazione GitHub
yiwen

6
Il formato del nome del lavoro è:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja

2
@SahilAhuja È del tutto arbitrario e basato sul layout di Jenkins, e se vuoi usare un percorso assoluto devi iniziare con un /. I percorsi relativi vanno bene; Il problema di Sorin era probabilmente che la chiamata di lavoro buildera un lavoro multibranch, il che significa che un percorso come jobnameavrebbe cercato di costruire il ramo jobnamedello stesso lavoro; deve essere ../jobname/branchnameinvece
Michael Mrozek,

Funziona bene, ma cosa succede se il ramo specificato non esiste?
Jaime Alcántara Arnela,

17

È possibile utilizzare il build jobpassaggio dalla pipeline Jenkins (requisito minimo Jenkins: 2.130).

Ecco l'API completa per il buildpassaggio: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Come usare build:

  • job: Nome di un lavoro a valle da compilare. Potrebbe essere un altro lavoro Pipeline, ma più comunemente un freestyle o un altro progetto.
    • Utilizzare un nome semplice se il lavoro si trova nella stessa cartella di questo lavoro Pipeline a monte;
    • Puoi invece usare percorsi relativi come../sister-folder/downstream
    • Oppure puoi usare percorsi assoluti come/top-level-folder/nested-folder/downstream

Attiva un altro lavoro usando un ramo come parametro

Nella mia azienda molte delle nostre filiali includono "/". È necessario sostituire qualsiasi istanza di "/" con "% 2F" (come appare nell'URL del lavoro).

In questo esempio stiamo usando percorsi relativi

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

Attiva un altro lavoro utilizzando il numero di build come parametro

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

Attiva molti lavori in parallelo

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

Maggiori informazioni su Parallel qui: 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)
        }
    }

O in alternativa:

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

3

Utilizzare il plug-in di compilazione lavoro per tale attività al fine di attivare altri lavori dal file jenkins. È possibile aggiungere una varietà di logica all'esecuzione come opzioni parallele, di nodi e agenti e passaggi per l'attivazione di lavori esterni. Ho dato alcuni esempi di libri di cucina di facile lettura per questo.

1.esempio per l'attivazione di un lavoro esterno dal file jenkins con un esempio condizionale:

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

2.esempio innescare più lavori dal file jenkins con un esempio di condizionali:

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

Ma come ricevere e utilizzare i parametri nel secondo lavoro
Gentle

2
@Gentle. Puoi accedere al paramater passato come params.systemname
Pankaj Shinde il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.