webentwicklung-frage-antwort-db.com.de

Jenkins Pipeline ist ein schlechter Ersatz

Ein Schritt in meiner Pipeline lädt eine .tar auf einen Artifactory-Server hoch. Bei der Übergabe in env.BUILD_NUMBER wird ein Fehler beim Ersetzen des Typs "Bad" angezeigt. Die gleichen Befehle funktionieren jedoch, wenn die Nummer hartcodiert ist. Das Skript ist in Groovy durch Jenkins geschrieben und läuft im Jenkins-Arbeitsbereich.

sh 'curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar"'

gibt die Fehler zurück:

[Pipeline] sh
[Package_Deploy_Pipeline] Running Shell script
/var/lib/jenkins/workspace/[email protected]/durable-4c8b7958/script.sh: 2: 
/var/lib/jenkins/workspace/[email protected]/durable-4c8b7958/script.sh: Bad substitution
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
ERROR: script returned exit code 2

Wenn Hardcode in einer Build-Nummer ${env.BUILD_NUMBER} ausgetauscht wird, erhalte ich keine Fehler und der Code wird erfolgreich ausgeführt.

sh 'curl -v --user user:password --data-binary ${buildDir}package113.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package113.tar"'

Ich verwende $ {env.BUILD_NUMBER} innerhalb anderer sh-Befehle innerhalb desselben Skripts und habe an anderen Stellen keine Probleme.

17
Stephen Nichols

Dies stellte sich als Syntaxproblem heraus. Durch das Umschließen des Befehls in 's wurde ${env.BUILD_NUMBER anstelle seines Werts übergeben. Ich wickelte den gesamten Befehl in "s ein und entging den verschachtelten. Funktioniert jetzt gut.

sh "curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT \"http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar\""
44
Stephen Nichols

Normalerweise das häufigste Problem für:

Schlechter Ersatz

fehler ist die Verwendung von sh anstelle von bash.

Insbesondere bei Verwendung von Jenkins, wenn Sie Execute Shell verwenden, stellen Sie sicher, dass Ihr Command mit Shebang beginnt, z. #!/bin/bash -xe oder #!/usr/bin/env bash.

13
kenorb

Sie scheinen die Variable env falsch verstanden zu haben. In Ihrem sh-Block sollten Sie direkt auf ${BUILD_NUMBER} zugreifen.

Grund/Erklärung: env steht für die Umgebung innerhalb des Skripts. Diese Umgebung wird direkt für alles verwendet/verfügbar, z. Shell-Skripte.

Bitte beachten Sie auch, dass Sie nichts in env.* schreiben, sondern stattdessen withEnv{}-Blöcke verwenden.

12
patric.schenke

Ich kann Ihnen definitiv sagen, es geht um Sh Shell und Bash Shell. Ich habe dieses Problem durch Angabe von #!/bin/bash -xe wie folgt behoben:

node {
    stage("Preparing"){
        sh'''#!/bin/bash -xe
            colls=( col1 col2 col3 )
            for eachCol in ${colls[@]}
            do
              echo $eachCol
            done
        '''
    }      
}
8
Gary Gan

Ich hatte das Problem, dass der {env.MAJOR_VERSION} in einer Artifactory von JAR-Datei angezeigt wurde. zeige ich Ansätze, indem ich in Jenkinsfile den Umgebungsschritt halte.

pipeline {
agent any
environment {
MAJOR_VERSION = 1
}

stages {
stage('build') {
  steps {
      sh 'ant -f build.xml -v'
 }
}
}
post {
 always{
   archiveArtifacts artifacts: 'dist/*.jar', fingerprint: true
 }
}
}

Ich habe das Problem behoben und es wurde mir kein schlechter Ersatz in meiner Jenkins-Build-Ausgabe angezeigt. Daher spielt der Umgebungsschritt in Jenkinsfile eine größere Rolle.

1
Aamir Meman