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}\""
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.
J'ai résolu d'une autre manière:
source
et la commande elle-mêmeExemple:
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.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