web-dev-qa-db-ger.com

So setzen und referenzieren Sie eine Variable in einer Jenkins-Datei

Ich habe ein deklaratives Pipelineskript für mein Multibranch-Projekt, in dem ich eine Textdatei lesen und das Ergebnis als Zeichenfolgenvariable speichern möchte, auf die ein späterer Schritt in der Pipeline zugreifen soll. Mit dem Snippet-Generator habe ich Folgendes versucht:

filename = readFile 'output.txt'

Für welches filename wäre mein String.

Ich erhalte einen Fehler in der Jenkins-Konsolenausgabe:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
            filename = readFile 'output.txt'

Muss ich einen withEnv -Schritt verwenden, um die Ausgabe von readFile auf eine Jenkins-Umgebungsvariable festzulegen? Wenn das so ist, wie?

Vielen Dank

25
Dalton Sweeney

Der Fehler liegt daran, dass Sie nur Pipeline-Schritte innerhalb der Anweisung steps verwenden dürfen. Eine mir bekannte Problemumgehung besteht darin, den Schritt script zu verwenden und darin ein beliebiges Pipelineskript einzubinden und das Ergebnis in der Umgebungsvariablen zu speichern, damit es später verwendet werden kann.

Also in deinem Fall:

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.FILENAME = readFile 'output.txt'
                }
                echo "${env.FILENAME}"
            }
        }
    }
}
41
Jon S

Gemäß der Dokumentation Sie können auch globale Umgebungsvariablen festlegen, wenn Sie den Wert der Variablen später in anderen Teilen Ihres Skripts verwenden möchten. In Ihrem Fall wird es in der Root-Pipeline festgelegt:

pipeline {
  ...
  environment {
    FILENAME = readFile ...
  }
  ...
}
18
Adam Link

Wir haben dies umgangen, indem wir dem Schritt environment Funktionen hinzugefügt haben, d. H .:

environment {
    ENVIRONMENT_NAME = defineEnvironment() 
}
...
def defineEnvironment() {
    def branchName = "${env.BRANCH_NAME}"
    if (branchName == "master") {
        return 'staging'
    }
    else {
        return 'test'
    }
}
2
Jansky

Ich kann noch keinen Kommentar abgeben, aber nur ein Hinweis: Verwenden Sie try/catch-Klauseln, um eine Unterbrechung der Pipeline zu vermeiden (wenn Sie sicher sind, dass die Datei existiert, ignorieren Sie sie).

    pipeline {
        agent any
            stages {
                stage("foo") {
                    steps {
                        script {
                            try {                    
                                env.FILENAME = readFile 'output.txt'
                                echo "${env.FILENAME}"
                            }
                            catch(Exception e) {
                                //do something i.e echo 'File not found'
                            }
                        }
                   }
    }

Ein weiterer Hinweis (dies wurde von @hao kommentiert, und ich denke, es lohnt sich, ihn zu teilen): Vielleicht möchten Sie wie folgt schneiden readFile ('output.txt'). Trim ()

1
Paulo Vinícius

Ein vollständiges Beispiel für eine Skript-Pipeline:

       stage('Build'){
            withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
                sh 'bash build.sh'
            }
        }
0
Qiang Li