web-dev-qa-db-fra.com

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

Comment puis-je déclencher la création d'un autre travail à l'intérieur de la Jenkinsfile?

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

Je souhaite également le faire uniquement si le nom de la branche est maître, car il n’a aucun sens de déclencher des versions en aval de toutes les branches locales.

Mise à 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é nom-travail-downtream-trouvé n'a été trouvé

Je suis sûr que ce travail existe dans Jenkins et se trouve dans le même dossier d’organisation que celui en cours. C'est un autre travail qui a son propre Jenkinsfile.

Veuillez noter que cette question est spécifique à plugin d'organisation GitHub , qui crée et gère automatiquement les travaux pour chaque référentiel et branche de votre organisation GitHub.

108
sorin

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

Deuxièmement, à partir d'un projet multibranch, vous pouvez utiliser la variable d'environnement BRANCH_NAME pour rendre la logique conditionnelle à la branche en cours.

Troisièmement, le paramètre job prend un nom de travail absolu ou relatif. Si vous donnez un nom sans 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'
}
113
Jesse Glick

En plus des réponses ci-dessus: je souhaitais démarrer un travail avec un paramètre simple passé à un deuxième pipeline et trouvais la réponse sur https://dzone.com/refcardz/continuous-delivery-with-jenkins- flux de travail .

Donc j'ai utilisé:

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

La commande build in pipeline est là pour déclencher d'autres travaux dans Jenkins.

Exemple sur github

Le travail doit exister à Jenkins et peut être paramétré. En ce qui concerne la branche, je suppose que vous pouvez lisez-le sur git

20
Flo

Vous pouvez utiliser l’étape build job de pipeline Jenkins (Configuration minimale requise pour Jenkins: 2.130).

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

Comment utiliser build:

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

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

Dans mon entreprise, plusieurs de nos succursales incluent "/". Vous devez remplacer toutes les occurrences 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éclencher 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éclencher plusieurs travaux en parallèle

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

Plus d'infos 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
                    }
                }
            }
    }
3
Katie

Vous pouvez ajouter divers types de logique à votre exécution, telles que des options parallèles, des noeuds et des agents, ainsi que des étapes pour déclencher des travaux externes. J'ai donné un exemple de livre de cuisine facile à lire à cet égard.

1.exemple pour déclencher un travail externe à partir d'un fichier jenkins avec un exemple conditionnel:

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

2.exemple déclenchant plusieurs travaux à 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')
     ]
    }
}
2
avivamg