Dans ce pipeline d'intégration de Jenkins, je déclenche différentes constructions en parallèle en utilisant l'étape de construction , comme suit:
stage('trigger all builds')
{
parallel
{
stage('componentA')
{
steps
{
script
{
def myjob=build job: 'componentA', propagate: true, wait: true
}
}
}
stage('componentB')
{
steps
{
script
{
def myjob=build job: 'componentB', propagate: true, wait: true
}
}
}
}
}
J'aimerais accéder à la valeur de retour de l'étape build
afin de savoir dans mes scripts Groovy quel nom de travail, quel numéro a été déclenché.
J'ai trouvé dans les exemples que l'objet renvoyé a des accesseurs tels que getProjectName()
ou getNumber()
que je peux utiliser pour cela.
Mais comment connaître la classe exacte de l'objet renvoyé et la liste des méthodes sur lesquelles je peux l'appeler? Cela semble être absent de la documentation sur le pipeline . Je demande ce cas en particulier, mais de manière générale, comment puis-je connaître la classe de l'objet renvoyé et sa documentation?
La documentation de l'étape est générée à partir de certains fichiers fournis avec le plug-in, ce qui n'est parfois pas suffisant. Un moyen simple serait d’imprimer le class
de l’objet résultat en appelant getClass
:
def myjob=build job: 'componentB', propagate: true, wait: true
echo "${myjob.getClass()}"
Cette sortie vous dira que le résultat (dans ce cas) est un org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
Qui a Javadoc publié .
Pour les autres cas, je dois généralement plonger dans le code source Jenkins. Voici ma stratégie générale:
Recherchez le littéral String du nom de l'étape et recherchez le type d'étape qui le renvoie. Dans ce cas, il semble provenir de la classe BuildTriggerStep
, qui extends AbstractStepImpl
@Override
public String getFunctionName() {
return "build";
}
Regardez le DescriptorImpl
imbriqué pour voir quelle classe d'exécution est retournée
public DescriptorImpl() {
super(BuildTriggerStepExecution.class);
}
Allez à BuildTriggerStepExecution
et regardez le corps de l'exécution dans la méthode start()
La lecture du étape du flux de travail README montre que quelque chose doit appeler context.onSuccess(value)
pour renvoyer un résultat. Il y a une place dans ce fichier, mais ce n'est que sur le cas "no-wait", qui retourne toujours immédiatement et est null
( source ).
if (step.getWait()) {
return false;
} else {
getContext().onSuccess(null);
return true;
}
Ok, donc l'exécution n'est pas terminée, alors ce doit être ailleurs. Nous pouvons également rechercher onSuccess
dans le référentiel et voir ce qui pourrait le déclencher à partir de ce plugin. Nous trouvons qu'une implémentation RunListener
gère le paramétrage du résultat de manière asynchrone pour l'exécution de l'étape si celle-ci a été configurée de cette façon:
for (BuildTriggerAction.Trigger trigger : BuildTriggerAction.triggersFor(run)) {
LOGGER.log(Level.FINE, "completing {0} for {1}", new Object[] {run, trigger.context});
if (!trigger.propagate || run.getResult() == Result.SUCCESS) {
if (trigger.interruption == null) {
trigger.context.onSuccess(new RunWrapper(run, false));
} else {
trigger.context.onFailure(trigger.interruption);
}
} else {
trigger.context.onFailure(new AbortException(run.getFullDisplayName() + " completed with status " + run.getResult() + " (propagate: false to ignore)"));
}
}
run.getActions().removeAll(run.getActions(BuildTriggerAction.class));
La trigger.context.onSuccess(new RunWrapper(run, false));
est d'où le résultat RunWrapper