Comment puis-je déclencher un autre travail à partir d'un pipeline jenkins (jenkinsfile) avec le plugin GitHub Org?

142

Comment puis-je déclencher la construction d'un autre travail depuis le Jenkinsfile?

Je suppose que ce travail est un autre référentiel sous la même organisation github , qui a déjà son propre fichier Jenkins.

Je souhaite également le faire uniquement si le nom de la branche est master, car cela n'a pas de sens de déclencher des builds en aval de branches locales.

Mettre à jour:

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

Pourtant, une fois exécuté, j'obtiens une erreur

Aucun travail paramétré nommé some-downtream-job-name trouvé

Je suis sûr que ce travail existe chez jenkins et se trouve dans le même dossier d'organisation que l'actuel. C'est un autre travail qui a le sien Jenkinsfile.

Veuillez noter que cette question est spécifique au plugin d'organisation GitHub qui crée et gère automatiquement des tâches pour chaque référentiel et branche de votre organisation GitHub.

Sorin
la source

Réponses:

131

Tout d'abord, c'est un gaspillage d'un emplacement d'exécuteur pour encapsuler l' buildétape node. Votre exécuteur testamentaire en amont restera inactif sans raison.

Deuxièmement, à partir d'un projet multibranch, vous pouvez utiliser la variable d'environnement BRANCH_NAMEpour rendre la logique conditionnelle à la branche actuelle.

Troisièmement, le jobparamètre prend un nom de travail absolu ou relatif. Si vous donnez un nom sans aucune qualification de chemin, cela ferait référence à un autre travail dans le même dossier, ce qui dans le cas d'un projet multibranch signifierait une autre branche du même référentiel.

Ainsi, ce que vous vouliez écrire est probablement

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Jesse Glick
la source
2
Merci! Si par un changement vous savez également comment déclencher cette construction sans attendre qu'elle se termine, ce serait double génial :)
sorin
48
Vérifiez le générateur d'extraits de code :build job: '../other-repo/master', wait: false
Jesse Glick
3
Existe-t-il un moyen d'appeler l'étape de construction avec un nom de branche dynamique? Quelque chose comme build job: '../other-repo/$BRANCH_NAME'où se $BRANCH_NAMEtrouve la variable d'environnement Jenkins relative à la branche exécutant le projet Multibranch?
msteppe91
2
si ${BRANCH_NAME}est disponible comme variable d'environnement, une simple substitution de chaîne fera l'affaire. Assurez-vous simplement de passer à "from 'pour citer votre chaîne. par exemplebuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
3
Lien API pour build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie
123

En plus des réponses mentionnées ci-dessus: je voulais démarrer un travail avec un simple paramètre passé à un deuxième pipeline et j'ai trouvé la réponse sur https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

J'ai donc utilisé:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
la source
11
Le travail de construction doit être intégré dans une étape (à partir de la version 0.5)
rhoerbe
5
Le BUILD_NUMBER du travail Jenkins appelé par la buildcommande est-il renvoyé? Comment accéder au BUILD_NUMBER dans l'une des étapes suivantes? Quelqu'un sait où cette commande est documentée?
user909481
4
C'est de build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]nos jours, de jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Mais comment utiliser ces paramètres passés en 2ème emploi
Gentle
2
Chose intéressante, cela build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] n'a pas fonctionné pour moi, mais: a build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] travaillé
Alberto C
24

La commande builden pipeline est là pour déclencher d'autres travaux dans jenkins.

Exemple sur github

Le travail doit exister dans Jenkins et peut être paramétré. Quant à la branche, je suppose que vous pouvez la lire à partir de git

Flo
la source
3
J'ai essayé d'ajouter build job: 'jobnamemais j'obtiens cette erreur No parameterized job named jobname foundet je peux vous assurer qu'il y a un travail avec ce nom au même niveau dans le dossier d'organisation.
sorin
1
Oui, il y a un travail, mais ce travail n'est pas paramétré. J'essaie de comprendre comment paramétrer un travail créé par le plugin d'organisation GitHub
yiwen
6
Le format du nom du poste est:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja
2
@SahilAhuja C'est totalement arbitraire et basé sur votre disposition Jenkins, et si vous voulez utiliser un chemin absolu, vous devez commencer par un /. Les chemins relatifs sont bons; Le problème de sorin était probablement que l'appel du travail buildétait un travail multibranch, ce qui signifie qu'un chemin comme jobnameessayerait de construire la branche jobnamedu même travail; il doit l'être à la ../jobname/branchnameplace
Michael Mrozek
Cela fonctionne bien mais que se passe-t-il si la branche spécifiée n'existe pas?
Jaime Alcántara Arnela
17

Vous pouvez utiliser l' build jobétape de Jenkins Pipeline (minimum Jenkins requis: 2.130).

Voici l'API complète pour l' buildétape: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Comment utiliser build:

  • job: Nom d'un travail en aval à générer. Peut-être un autre travail Pipeline, mais plus communément un projet freestyle ou autre.
    • Utilisez un nom simple si le travail se trouve dans le même dossier que ce travail de pipeline en amont;
    • Vous pouvez à la place utiliser des chemins relatifs comme../sister-folder/downstream
    • Ou vous pouvez utiliser des chemins absolus comme/top-level-folder/nested-folder/downstream

Déclenchez un autre travail en utilisant une branche comme paramètre

Dans mon entreprise, plusieurs de nos succursales incluent "/". Vous devez remplacer toutes les instances de "/" par "% 2F" (tel qu'il apparaît dans l'URL du travail).

Dans cet exemple, nous utilisons des chemins relatifs

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

Déclenchez un autre travail en utilisant le numéro de build comme paramètre

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

Déclenchez de nombreux emplois en parallèle

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

Plus d'informations sur Parallel ici: 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)
        }
    }

Ou bien:

    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
la source
3

Utilisez le plugin de travail de construction pour cette tâche afin de déclencher d'autres travaux à partir du fichier jenkins. Vous pouvez ajouter une variété de logique à votre exécution, comme des options parallèles, des nœuds et des agents et des étapes de déclenchement de travaux externes. J'ai donné un exemple de livre de cuisine facile à lire pour cela.

1. exemple de déclenchement d'une tâche externe à partir d'un fichier jenkins avec exemple conditionnel:

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

2. exemple de déclenchement de plusieurs tâches à partir du fichier jenkins avec exemple conditionnel:

 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
la source
Mais comment recevoir et utiliser les paramètres dans 2nd job
Gentle
2
@Doux. Vous pouvez accéder au paramètre passé en tant que params.systemname
Pankaj Shinde