web-dev-qa-db-fra.com

Jenkins - Comment obtenir et utiliser des informations en amont en aval

Exécution d'un travail en amont appelé "A". En cas de succès de A exécutant des cas de test qui est en aval du projet "B". Mais lors de l'envoi de courrier depuis B, nous devons incorporer les détails du projet en amont (nom du projet en amont, build no) dans le courrier. Nous pouvons donc facilement mapper/corréler le test avec le travail en amont respectif.

Dans le tableau de bord du projet en aval ci-dessous, les détails s'affichent.

Started by upstream project Dev_RM_3.0_CI_Test build number 10
originally caused by:

Je me suis enregistré https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project . mais je n'ai rien trouvé à hériter en aval.

Exemple de travail créé avec les détails ci-dessous pour afficher les détails du travail actuel.

echo $BUILD_NUMBER
echo $JOB_NAME
echo $BUILD_ID

Mais la sortie est

Building on master in workspace /var/lib/jenkins/workspace/env
[env] $ /bin/sh -xe /tmp/hudson970280339057643719.sh
+ echo 1
1
+ echo env
env
+ echo 1
1
Finished: SUCCESS
  1. Une aide pour hériter des détails en amont dans le travail en aval?
  2. Comment obtenir les détails actuels de l'emploi?
14
divakar.scm

Le message que vous référez à votre question "Started by upstream project "Chained/1-First "numéro de build 34" par exemple, est disponible dans jenkins Cause .

Jenkins conserve les informations de construction en amont dans son objet cause. Si vous utilisez build DSL ou Pipelines, vous pouvez l'obtenir dans groovy. Vous pouvez également curl l'url du travail et utiliser jq pour obtenir la cause

Par exemple curl http: // localhost: 8080/job/Chained/job/2-Second/17/api/json

"_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
"actions": [{
  "_class": "hudson.model.CauseAction",
  "causes": [{
    "_class": "hudson.model.Cause$UpstreamCause",
    "shortDescription": "Started by upstream project \"Chained/1-First\" build number 34",
    "upstreamBuild": 34,
    "upstreamProject": "Chained/1-First",
    "upstreamUrl": "job/Chained/job/1-First/"
  }]
}

Ou depuis le pipeline par exemple:

node() {
    stage('downstream') {
        def upstream = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause)
        echo upstream?.shortDescription
    }
}

Vous pouvez obtenir un tas d'informations sur Cause , en attendant toutes les approbations de script ou une étape partagée globale. Vous obtiendrez une valeur nulle si une cause différente déclenche cette génération, par exemple, commit ou user.

14
razboy

Vous pouvez transmettre les variables en amont via des paramètres de génération au travail en aval, puis vous pouvez y accéder (dans le travail en aval) en utilisant des éléments tels que $ {MyParameter1} et $ {MyParameter2}.

Vous devrez:

  1. Ajoutez des paramètres de génération au travail en aval. Par exemple, un paramètre de chaîne nommé "ParentJobName".
  2. Ajoutez un post-build "Déclencher les builds paramétrés en aval sur d'autres projets" au travail en amont.
  3. Ajoutez quelque chose comme "Paramètres de construction actuels" ou "Paramètres prédéfinis" au # 2 et passez tout ce dont vous avez besoin. Par exemple: ParentJobName=${JOB_NAME}
  4. Accédez aux paramètres comme vous le feriez pour d'autres variables de construction. par exemple. $ {ParentJobName}

Vous devriez pouvoir passer les choses de base de cette façon. Quoi de plus compliqué que cela et vous ferez probablement mieux d'utiliser un plugin comme Copy Artifacts Plugin pour copier des fichiers ou utiliser l'API Jenkins dans une étape groovy du système pour obtenir/modifier la construction en amont, etc.

11
Daniel Omoto

Vous pouvez simplement utiliser params.variableName dans votre travail en aval pour récupérer les paramètres transmis à partir de votre travail de paramètre en amont. Votre travail en aval ne doit pas nécessairement être un travail paramétré.

0
MeowRude

Extension de la réponse @razboy: c'est un bon moyen si Cause ne peut pas être ajouté à la liste blanche dans le bac à sable. J'ai oublié l'API Jenkins et utilisé la console de construction actuelle pour rechercher une chaîne sur la cause du déclencheur. Vous pouvez essayer de récupérer des données de l'API en tant que @razboy ou obtenir la console actuelle et la récupérer si vous avez besoin de choses simples. L'API Jenkins est plus flexible pour une logique plus complexe. Pour obtenir de l'aide sur l'API, ajoutez/api à votre URL de génération: <jenkins_url>/job/<buildUrl>/<buildNumber>/api

   def buildUrl = env.BUILD_URL
   sh "wget $buildUrl -O currentConsole.txt"
   statusCode = sh returnStatus: true,script: 'cat currentConsole.txt | grep -q "Started by upstream project"'
   boolean startedByUpstream= statusCode==0
0
jozefow