web-dev-qa-db-fra.com

passage de variable à un script bash dans un travail de pipeline jenkins

J'ai un travail de pipeline Jenkins dans lequel je configure mon environnement avec un script bash nommé setup.sh qui ressemble à:

#!/bin/bash
export Arch=$1
echo "architecture = " ${Arch}

Dans le script de pipeline Jenkins, appelez le script setup.sh avec:

def lib_Arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh ${lib_Arch}"

malheureusement, il semble que la variableNOsoit transmise au script setup.sh, et echo $ {Arch} renvoie une chaîne vide! J'ai essayé de faire plutôt: sh "source /opt/setup.sh $ {lib_Arch}" et échoue également avec le message "source non trouvée". J'ai également essayé de modifier la première ligne de mon script en

#!/bin/sh

mais ça n'aide pas. Alors, comment puis-je passer un paramètre à mon script bash dans un script de pipeline Jenkins? Merci pour votre aide.

Mise à jour: Une solution de contournement a été suggérée par Bert Jan Schrijve dans ce fil de discussion (voir ci-dessous):

sh "bash -c \" source /opt/setup.sh ${lib_Arch}\"" 
5
Nabil Ghodbane

L'exemple ci-dessous fonctionne:

void updateApplicationVersionMaven(String version) {
    sh "mvn -B versions:set -DnewVersion=$version"
}

Et un script de pipeline complet (testé sur Jenkins 2.7.3):

node {
    stage('test') {
        def testVar='foo'
        sh "echo $testVar"    
    }
}

EDIT (après les commentaires): Ah, testé encore et pourrait reproduire le problème. C'est parce que vous recherchez le script avec ".opt/setup.sh". Cela influence l'environnement Shell et, dans ce cas, interrompt l'injection de variable Jenkins. Intéressant. 

EDIT2 (après les commentaires): Je crois qu’il s’agit d’un problème avec le shell par défaut utilisé (par Jenkins ou par le système d’exploitation). Je pouvais reproduire le problème à partir des commentaires et je pouvais le contourner en explicitement en utilisant bash en tant que shell:

def testVar='foo3'
sh "bash -c \". /var/jenkins_home/test.sh $testVar && echo \$Arch\""

Le dernier écho renvoie maintenant le contenu de testVar qui a été transmis en tant qu'argument au script et ensuite défini par le script en tant que variable d'environnement.

2
Bert Jan Schrijver

J'ai résolu d'une autre manière:

  1. Créer un fichier avec les variables souhaitées
  2. Exécuter, dans la même commande, une source et la commande elle-même

Exemple:

sh 'echo -n Host_IP= > Host_ip.var'
sh '/sbin/ip route|awk \'/default/ { print $3 }\' >> Host_ip.var'
sh 'source Host_ip.var && echo your ip: $Host_IP'

Le fichier se termine avec 

REMOTE=172.16.0.1

La sortie est

your ip: 172.16.0.1

Remarque: il est très important que la dernière commande sh utilise des guillemets simples (') et non des doubles ("), sinon le pipeline tente de remplacer ladite variable.

1
alvaro g

1.Veuillez essayer de supprimer les accolades dans le script.

export Arch=$1
echo "architecture = " $Arch

2. Dans Jenkins Shell:

def lib_Arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh" $lib_Arch
0
humblebee