358 votes

Comment obtenir la sortie d'une commande shell exécutée en utilisant dans une variable de Jenkinsfile (groovy) ?

J'ai quelque chose comme ça dans un fichier Jenkins (Groovy) et je veux enregistrer le stdout et le code de sortie dans une variable afin d'utiliser ces informations plus tard.

sh "ls -l"

Comment puis-je faire cela, d'autant plus qu'il semble que vous ne pouvez pas vraiment exécuter n'importe quel type de code groovy à l'intérieur de l'application Jenkinsfile ?

3 votes

0 votes

11voto

Nagev Points 658

Pour ceux qui ont besoin d'utiliser la sortie dans des commandes shell ultérieures, plutôt que dans groovy, quelque chose comme cet exemple pourrait être fait :

    stage('Show Files') {
        environment {
          MY_FILES = sh(script: 'cd mydir && ls -l', returnStdout: true)
        }
        steps {
          sh '''
            echo "$MY_FILES"
          '''
        }
    }

J'ai trouvé les exemples sur code maven pour être très utile.

2voto

Toutes les méthodes ci-dessus fonctionnent, mais pour utiliser la variable comme variable env dans votre code, vous devez d'abord exporter la variable.

script{
  sh " 'shell command here' > command"
  command_var = readFile('command').trim()
  sh "export command_var=$command_var"
}

remplacez la commande shell par la commande de votre choix. Maintenant, si vous utilisez du code python, vous pouvez simplement spécifier os.getenv("command_var") qui retournera la sortie de la commande shell exécutée précédemment.

1voto

vartika pandey Points 1

Si vous n'avez pas une seule commande sh mais un bloc de commandes sh, returnstdout ne fonctionnera pas alors.

J'ai eu un problème similaire où j'ai appliqué quelque chose qui n'est pas une manière propre de le faire, mais finalement cela a fonctionné et a servi le but.

Solution - Dans le bloc du shell, affichez la valeur et ajoutez-la dans un fichier. En dehors du bloc shell et à l'intérieur du bloc script , lisez ce fichier, coupez-le et assignez-le à une variable locale/paramétrique/environnementale.

exemple -

steps {
     script {
            sh '''
               echo $PATH>path.txt
               // I am using '>' because I want to create a new file every time to get the newest value of PATH
            '''
            path = readFile(file: 'path.txt')
            path = path.trim() //local groovy variable assignment

            //One  can assign these values to env and params as below  - 
            env.PATH = path  //if you want to assign it to env var
            params.PATH  = path //if you want to assign it to params var

     }
}

0voto

VRPL Points 1

Comment lire la variable shell en groovy / comment assigner la valeur de retour shell à une variable groovy.

Exigence : Ouvrir un fichier texte lire les lignes en utilisant le shell et stocker la valeur dans groovy et obtenir le paramètre pour chaque ligne .

Ici , est le délimiteur

Ex : releaseModule.txt

./APP_TSBASE/app/team/i-home/deployments/ip-cc.war/cs_workflowReport.jar,configurable-wf-report,94,23crb1,artifact

./APP_TSBASE/app/team/i-home/deployments/ip.war/cs_workflowReport.jar,configurable-temppweb-report,394,rvu3crb1,artifact

\========================

Ici, nous voulons obtenir le nom du module, le deuxième paramètre (configurable-wf-report), le numéro de construction, le troisième paramètre (94), l'identifiant de la livraison, le quatrième paramètre (23crb1).

def  module = sh(script: """awk -F',' '{ print \$2 "," \$3 "," \$4 }' releaseModules.txt  | sort -u """, returnStdout: true).trim()

echo module

List lines = module.split( '\n' ).findAll { !it.startsWith( ',' ) }

def buildid

def Modname

lines.each {

List det1 =  it.split(',')

buildid=det1[1].trim() 

Modname = det1[0].trim()

tag= det1[2].trim()

echo Modname               

echo buildid

                echo tag

}

-6voto

Ajay Gadhavana Points 317

Le moyen le plus simple est d'utiliser cette méthode

my_var=`echo 2` echo $my_var sortie : 2

Notez qu'il ne s'agit pas d'une simple citation simple mais d'une citation inversée ( ` ).

1 votes

J'ai voté pour, mais je suggère que vous montriez que ces éléments devraient être enveloppés dans une sh Sinon, les gens pourraient penser que c'est génial, surtout s'ils ne sont pas familiers avec les scripts bash. Je viens juste de l'essayer sur Jenkins, en utilisant ls -l au lieu de echo 2 et ça marche. J'avais déjà utilisé cette approche auparavant, mais je cherchais une alternative car elle n'est pas très fiable. J'ai la sortie d'une commande plus complexe capturée sur un shell standard de cette façon, mais lorsqu'elle est portée sur l'application Jenkins sh la variable ne contient rien, pour une raison inconnue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X