it-swarm.com.de

übergabe einer Variable an ein Bash-Skript in einem Jenkins-Pipeline-Job

Ich habe einen Jenkins-Pipeline-Job, in dem ich meine Umgebung mit einem Bash-Skript namens setup.sh konfiguriere, das wie folgt aussieht:

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

Im Jenkins-Pipeline-Skript rufe ich das setup.sh-Skript auf mit:

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

leider scheint es, dassNOvariable an das setup.sh-Skript übergeben wird und das Echo $ {Arch} einen leeren String zurückgibt! Ich habe stattdessen versucht: sh "source /opt/setup.sh $ {lib_Arch}" und dies schlägt auch mit der Meldung "source not found" fehl. Ich habe auch versucht, die erste Zeile meines Skripts zu ändern

#!/bin/sh

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

Update: Eine Problemumgehung wurde von Bert Jan Schrijve in diesem Thread vorgeschlagen (siehe unten):

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

Das folgende Beispiel funktioniert:

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

Und ein vollständiges Pipeline-Skript (getestet mit Jenkins 2.7.3):

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

EDIT (nach Kommentaren): Ah, hat noch ein paar mehr getestet und konnte das Problem reproduzieren. Das liegt daran, dass Sie das Skript mit ". /Opt/setup.sh" beziehen. Dies beeinflusst die Shell-Umgebung und unterbricht in diesem Fall die Jenkins-Variableneinspritzung. Interessant. 

EDIT2 (nach Kommentaren): Ich glaube, dies 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 konnte es umgehen explizite Verwendung von bash als Shell:

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

Das letzte Echo enthält nun den Inhalt von testVar, der als Argument an das Skript übergeben wurde und anschließend vom Skript als Umgebungsvariable festgelegt wurde.

2

Wenn Sie ein mehrzeiliges Shell-Skript mit dreifachem Apostroph verwenden, müssen Sie diese Syntax verwenden:

sh '''
 echo '''+varToPrint+'''
 other commands...
'''

(von https: //medium.com/devopslinks/a-hacky-hackers-guide-to-hacking-together-jenkins-scripted-pipelines-part-3-aca73bd33eaa )

2
Tony

Hatte das gleiche Problem und die geposteten Lösungen haben bei mir nicht funktioniert. Die Verwendung von Umgebungsvariablen hat den Trick gemacht:

env.someVar='someVal'
sh "echo  ${env.someVar}"
1
Frankenstein

Ich habe auf andere Weise gelöst:

  1. Erstellen Sie eine Datei mit den gewünschten Variablen
  2. Führen Sie im gleichen Befehl sowohl eine source als auch den Befehl selbst aus

Beispiel:

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'

Die Datei endet mit 

REMOTE=172.16.0.1

Die Ausgabe ist

your ip: 172.16.0.1

Hinweis: Es ist sehr wichtig, dass der letzte Befehl sh einfache Anführungszeichen (') verwendet, nicht double ("). Andernfalls versucht die Pipeline, die Variable zu ersetzen

1
alvaro g

1. Bitte entfernen Sie geschweifte Klammern im Skript.

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
humblebee

Die Verwendung von returnStdout mit env ist eine weitere Möglichkeit, val hin und her zu übergeben. Das Beispiel zeigt, dass eine eindeutige ID von uuidgen über mehrere Phasen hinweg als gemeinsame externe Ressource verwendet wird.

node {
    stage('stage 1') {
        env.UNIQUE = sh(returnStdout: true, script: 'uuidgen').trim()
        sh 'echo "started `date`" > /tmp/$UNIQUE'
    }
    stage('stage 2'){
        sh 'echo "done `date`" >> /tmp/$UNIQUE'
        println sh(returnStdout: true, script: 'cat /tmp/$UNIQUE').trim()
    }
}

dies gibt ein Datum in eine eindeutige Datei aus, die anzeigt, wann es abgeschlossen ist. uuidgen erzeugt jedes Mal eine andere Zeichenfolge, wenn Sie es ausführen.

+ echo 'done Tue Oct 22 10:12:20 CDT 2019'
[Pipeline] sh
+ cat /tmp/d7bdb6a5-badb-474d-95dd-cf831ea88a2a
[Pipeline] echo
started Tue Oct 22 10:12:20 CDT 2019
done Tue Oct 22 10:12:20 CDT 2019
0
Peter Moore