web-dev-qa-db-fra.com

Comment exécuter une commande dans un travail Jenkins 2.0 Pipeline, puis renvoyer la sortie standard

Existe-t-il un meilleur moyen d'exécuter une tâche Shell dans un pipeline Jenkins 2.0, puis de renvoyer le stdout de la commande. La seule façon pour que cela fonctionne est de diriger la sortie de la commande vers un fichier, puis de lire le fichier dans une variable.

sh('git config --get remote.Origin.url > GIT_URL')
def stdout = readFile('GIT_URL').trim()

Cela semble être une très mauvaise façon de renvoyer la sortie. J'espérais pouvoir faire quelque chose comme:

def stdout = sh('git config --get remote.Origin.url').stdout

ou

def exitcode = sh('git config --get remote.Origin.url').exitcode

Est-ce possible?

20
user6253266

Oui car luka5z mentionné, la version 2.4 du plugin Pipelines Nodes and Processes prend désormais en charge ce genre de choses:

def stdout = sh(script: 'git config --get remote.Origin.url', returnStdout: true)
println stdout

def retstat = sh(script: 'git config --get remote.Origin.url', returnStatus: true)
println retstat

Il semble que si vous essayez de renvoyer les deux dans le même script, returnStatus écrasera returnStdout, ce qui est un peu malheureux.

Vous pouvez en lire plus dans la documentation officielle ici

Edit: En outre, il vous permet également un contrôle plus fin des états de build échoués/instables. Vous pouvez voir un exemple dans mon commentaire ici

20
philbert

Mise à jour

Depuis le 6/2016 JENKINS-261 est officiellement marqué comme résolu. Par conséquent, avant d'essayer les solutions de contournement ci-dessous, essayez d'abord de prendre en charge implémentation pour sh/bat qui permet d'utiliser returnStdout et returnStatus paramètres.

Solutions de contournement

Malheureusement, cette fonctionnalité n'est toujours pas prise en charge et est manquante. Pour plus d'informations, veuillez vous référer à l'officiel ticket :

JENKINS-26133 Script shell prenant/retournant la sortie/l'état Statut: Destinataire: Priorité: Résolution: Open Jesse Glick Major Unresolved


La description

Actuellement, sh n'a pas de valeur de retour significative et lève une exception si l'état de sortie n'est pas nul. Ce serait bien d'avoir une option pour qu'il retourne le code de sortie (zéro ou non) comme une valeur entière:

def r = sh script: 'someCommand', returnStatus: true

Solution actuelle:

sh 'someCommand; echo $? > status' 
def r = readFile('status').trim()

Ou pour qu'il retourne sa sortie standard (semblable aux raccourcis Shell):

def lines = sh(script: 'dumpStuff.sh', returnStdout: true).split("\r?\n")

Solution de contournement:

sh 'dumpStuff.sh > result'
def lines = readFile('result').split("\r?\n")

Ou pour qu'il prenne quelque chose sur l'entrée standard:

sh script: 'loadStuff.sh', stdin: someText

Solution de contournement:

writeFile file: 'input', text: someText >     sh 'loadStuff.sh < input'

Nécessite probablement quelques changements d'API dans la tâche durable.

19
luka5z