2016-10-29 11 views
5

ich einen Jenkins Pipeline Job, in dem ich meine Umgebung mit einem Bash-Skript namens setup.sh konfigurieren, die wie folgt aussieht:Variable vorbei Skript in einem jenkins Pipeline Job einzuschlagen

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

Im Jenkins Pipeline-Skript, icall das setup.sh Skript mit:

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

leider scheint es, dass NO Variable auf den setup.sh Skript übergeben wird, und das Echo $ {ARCH} einen leeren String zurück! Ich habe versucht, stattdessen zu tun: sh "Quelle /opt/setup.sh $ {lib_arch}" und dies schlägt auch gut mit der "Quelle nicht gefunden" Nachricht. Ich habe auch versucht, um die erste Zeile von meinem Skript zu ändern

#!/bin/sh 

aber es hilft nicht. Wie kann ich einen Parameter an mein Bash-Skript in einem Jenkins-Pipeline-Skript übergeben? danke für Ihre Hilfe.

Update: eine Abhilfe von Bert Jan Schrijve in diesem Thread sugggested wurde (siehe unten):

sh "bash -c \" source /opt/setup.sh ${lib_arch}\"" 

Antwort

2

Das folgende Beispiel funktioniert:

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

und eine komplette Pipeline-Skript (getestet auf Jenkins 2.7.3):

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

EDIT (nach Kommentaren): Ah, Test editiert und könnte das Problem reproduzieren. Es liegt daran, dass Sie das Skript mit ".opt/setup.sh" erstellen. Dies beeinflusst die Shell-Umgebung und bricht in diesem Fall die variable Jenkins-Injektion. Interessant.

EDIT2 (nach Kommentaren): Ich glaube, das ist ein Problem mit der Standard-Shell, die verwendet wird (entweder von Jenkins oder vom Betriebssystem). Ich konnte das Problem aus den Kommentaren reproduzieren und war in der Lage, um es zu arbeiten, indem sie explizit bash als Shell verwenden:

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

Das letzte Echo Echos nun den Inhalt von testvar, die als Argument an das Skript übergeben wurde und anschließend vom Skript als Umgebungsvariable festgelegt.

+0

versuchte ich Ihren Vorschlag und es funktioniert nicht. Ich habe sogar versucht einfach zu tun: sh ".opt/setup.sh bla". Offensichtlich wird der Parameter nicht an das Shell-Skript übergeben, da $ # 0 zurückgibt, während ich in der Skriptkonsole [testsh] Running shell script + erhält. /opt/setup.sh linux-ubuntu-14.04-x86_64-gcc4.8.4 –

+0

Das ist seltsam. Ich habe ein kleines Beispiel hinzugefügt und es auf Jenkins 2.7.3 getestet. In welcher Version bist du? –

+0

Ich benutze diese Kriegsversion: 2.19.1. Ich glaube, hier ist etwas merkwürdig. In Ihrem Pipeline-Skript machen Sie nicht das, was ich erreichen möchte. In meinem Fall versuche ich, einen Variablenwert, der mit def (wie dir) definiert ist, einem Bash-Skript zu geben. Wie ich geschrieben habe, wenn ich sh "./Opt/setup.sh bla ", und wenn ich in meinem Skript versuche, $ 1 zu echo, kann ich deutlich sehen, dass der Parameter" bla "nicht auf das Skript gegeben wird. –

0

1.Bitte versuchen Sie, geschweifte Klammern im Skript zu entfernen.

export ARCH=$1 
echo "architecture = " $ARCH 

2.In Jenkins Shell:

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

haben Sie Ihren Vorschlag versucht? Es stürzt ab. java.lang.NullPointerException: Kann nicht die Eigenschaft '$ lib_arch' auf Null-Objekt. Ich glaube, ich habe mit einigen zu tun Einschränkungen für die Pipeline Jenkins Arbeitsplätze. –

Verwandte Themen