en passant la variable de script bash dans un jenkins pipeline d'emploi
J'ai un Jenkins pipeline de travail dans lequel j'ai configurer mon environnement avec un script bash nommé setup.sh ce qui ressemble à:
#!/bin/bash
export ARCH=$1
echo "architecture = " ${ARCH}
Dans le Jenkins pipeline script, skype, Icall l'setup.sh script avec:
def lib_arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh ${lib_arch}"
malheureusement, il semble que PAS variable est passé à la setup.sh script, et le echo ${ARCH} renvoie une chaîne vide!
J'ai essayé de faire au lieu de:
sh "source /opt/setup.sh ${lib_arch}"
et cela échoue ainsi à la "source not found" message.
J'ai aussi essayé de changer la première ligne de mon script
#!/bin/sh
mais ça n'aide pas. Alors, comment puis-je passer un paramètre à mon script bash dans un Jenkins pipeline script?
merci pour votre aide.
Mise à jour:
une solution de contournement a été sugggested par Bert Jan Schrijve dans ce fil de discussion (voir ci-dessous):
sh "bash -c \" source /opt/setup.sh ${lib_arch}\""
OriginalL'auteur Nabil Ghodbane | 2016-10-29
Vous devez vous connecter pour publier un commentaire.
L'exemple ci-dessous fonctionne:
Et un pipeline de script (testé sur Jenkins 2.7.3):
EDIT (après les commentaires): Ah, testé un peu plus et pourrait reproduire le problème. C'est parce que vous êtes à la recherche de script avec ". /opt/setup.sh". Ceci a une influence sur l'environnement du shell, et dans ce cas les pauses le Jenkins variable d'injection. Intéressant.
EDIT2 (après les commentaires): je crois que c'est un problème avec le shell par défaut qui est utilisé (par Jenkins ou par le système d'exploitation).
J'ai pu reproduire le problème à partir des commentaires et a été en mesure de le contourner en utilisant explicitement bash est un shell:
La dernière echo maintenant les echos le contenu de testVar qui a été passé en argument au script, et par la suite définie par le script comme une variable d'environnement.
C'est bizarre. J'ai ajouté un petit exemple et l'a testé sur Jenkins 2.7.3. Quelle version es-tu?
Je suis à l'aide de cette guerre version: articles 2.19.1. Je crois qu'il existe quelque chose de bizarre ici. Dans votre pipeline de script, vous ne faites pas ce que je suis en train de réaliser. Dans mon cas, j'essaie de donner la valeur d'une variable définie avec def (comme vous) à un script bash. Comme je l'ai écrit, si je ne sh " . /opt/setup.sh bla", et si dans mon script j'essaie d'echo $1, je peux clairement voir que le paramètre "bla" n'est pas donné pour le script.
Oui, j'ai testé le même (avec un script). Si vous appelez le script avec /opt/setup.sh (sans la source le point), cela devrait fonctionner.
bien sûr, mais la variable définie dans le setup.sh ne sont pas accessibles de l'extérieur. Je ne peux pas faire sh "/opt/setup.sh bla && echo \$ARCH".
OriginalL'auteur Bert Jan Schrijver
J'ai résolu d'une autre manière:
source
et la commande elle-mêmeExemple:
Le fichier se termine avec
La sortie est
Remarque: il est très important que le dernier
sh
commande utilise des guillemets simples ('
), pas de double ("
), sinon le pipeline essaie de remplacer cette variableOriginalL'auteur alvaro g
1.Essayez d'enlever des accolades dans le script.
2.Dans Jenkins shell:
OriginalL'auteur humblebee
Si vous utilisez plusieurs lignes de script shell avec triple apostrophe, vous devez utiliser cette syntaxe:
(à partir de https://medium.com/devopslinks/a-hacky-hackers-guide-to-hacking-together-jenkins-scripted-pipelines-part-3-aca73bd33eaa)
OriginalL'auteur Tony
Eu le même problème et l'a posté solutions n'ont pas fonctionné pour moi. À l'aide de variables d'environnement a fait le tour:
OriginalL'auteur Frankenstein