webentwicklung-frage-antwort-db.com.de

keine solche DSL-Methode "Stufen"

Ich versuche, mein erstes Groovy-Skript für Jenkins zu erstellen:

Nachdem ich hier nachgesehen habe https://jenkins.io/doc/book/pipeline/ , habe ich Folgendes erstellt:

node {
  stages {

    stage('HelloWorld') {
      echo 'Hello World'
    }

    stage('git clone') {
      git clone "ssh://[email protected]/myrepo.git"
    }

  }
}

Ich bekomme jedoch:

Java.lang.NoSuchMethodError: No such DSL method "stages" found among steps

Was vermisse ich?

Wie kann ich meine Anmeldeinformationen auch an das Git Repository übergeben, ohne das Kennwort im Klartext zu schreiben?

22
octavian

Sie verwechseln und mischen Scripted Pipeline Mit Declarative Pipeline, Um den vollständigen Unterschied herauszufinden siehe hier . Aber die Kurzgeschichte:

  • deklarative Pipelines ist eine neue Erweiterung der Pipeline-DSL (es ist im Grunde ein Pipelineskript mit nur einem Schritt, ein Pipelineschritt mit Argumenten (Direktiven genannt), Diese Direktiven sollten einer bestimmten Syntax folgen. Der Sinn dieses neuen Formats ist, dass es strenger ist und daher für diejenigen, die noch keine Pipelines haben, einfacher sein sollte, grafische Bearbeitung zulassen und vieles mehr.
  • Skript-Pipelines sind der Fallback für erweiterte Anforderungen.

Wenn wir uns also Ihr Skript ansehen, öffnen Sie zuerst einen node -Schritt, der aus Skript-Pipelines stammt. Dann verwenden Sie stages, eine der Anweisungen des in declarative pipeline Definierten Schritts pipeline. So können Sie zum Beispiel schreiben:

pipeline {
  ...
  stages {
    stage('HelloWorld') {
      steps {
        echo 'Hello World'
      }
    }
    stage('git clone') {
      steps {
        git clone "ssh://[email protected]/myrepo.git"
      }
    }
  }
}

Wenn Sie also declarative pipeline Verwenden möchten, ist dies der richtige Weg.

Wenn Sie scripted pipeline Wollen, schreiben Sie:

node {
  stage('HelloWorld') {
    echo 'Hello World'
  }

  stage('git clone') {
    git clone "ssh://[email protected]/myrepo.git"
  }
}

Zum Beispiel: Überspringen Sie den Stages-Block.

57
Jon S

Ein Jenkinsfile kann mit zwei Arten von Syntax geschrieben werden - Deklarativ und Skripted .

Deklarative und skriptbasierte Pipelines sind grundsätzlich unterschiedlich aufgebaut. Declarative Pipeline ist eine neuere Funktion der Jenkins-Pipeline, die:

  • bietet umfassendere syntaktische Funktionen im Vergleich zur Skript-Pipeline-Syntax

  • soll das Schreiben und Lesen von Pipeline-Code erleichtern.

Viele der einzelnen syntaktischen Komponenten (oder "Schritte"), die in eine Jenkins-Datei geschrieben wurden, sind jedoch sowohl in der deklarativen als auch in der skriptgesteuerten Pipeline enthalten. Beispiel:

Deklarative Pipeline-Grundlagen

In der deklarativen Pipeline-Syntax definiert der Block pipeline die gesamte Arbeit, die in der gesamten Pipeline ausgeführt wird.

Jenkinsfile (deklarative Pipeline):

pipeline {
    agent any 1
    stages { 
        stage('Build') { 2
            steps { 
                // 3
            }
        }
        stage('Test') { 4
            steps { 
                // 5
            }
        }
        stage('Deploy') { 6
            steps {
                // 7
            }
        }
    }
}
  1. Führen Sie diese Pipeline oder eine ihrer Phasen auf einem beliebigen verfügbaren Agenten aus.
  2. Definiert die "Build" -Stufe.
  3. Führen Sie einige Schritte im Zusammenhang mit der Phase "Erstellen" aus.
  4. Definiert die "Test" -Stufe.
  5. Führen Sie einige Schritte im Zusammenhang mit der Phase "Test" aus.
  6. Definiert die Phase "Bereitstellen".
  7. Führen Sie einige Schritte im Zusammenhang mit der Phase "Bereitstellen" aus.

Skriptbasierte Pipeline-Grundlagen

In der Skript-Pipeline-Syntax erledigen ein oder mehrere node Blöcke die Kernarbeit in der gesamten Pipeline. Dies ist zwar keine zwingende Voraussetzung für die Syntax der Skript-Pipeline, aber das Einschränken der Pipeline-Arbeit in einem node -Block führt zwei Dinge aus:

  1. Plant die Ausführung der im Block enthaltenen Schritte, indem der Jenkins-Warteschlange ein Element hinzugefügt wird. Sobald ein Executor auf einem Knoten frei ist, werden die Schritte ausgeführt.

  2. Erstellt einen Arbeitsbereich (ein für diese bestimmte Pipeline spezifisches Verzeichnis), in dem Dateien bearbeitet werden können, die aus der Quellcodeverwaltung ausgecheckt wurden.
    Achtung: Abhängig von Ihrer Jenkins-Konfiguration werden einige Arbeitsbereiche nach einer gewissen Zeit der Inaktivität möglicherweise nicht automatisch bereinigt. Siehe Tickets und Diskussion verlinkt von JENKINS-2111 für weitere Informationen.

Jenkinsfile (Scripted Pipeline):

node { 1
    stage('Build') { 2
        // 3
    }
    stage('Test') { 4
        // 5
    }
    stage('Deploy') { 6
        // 7
    }
}
  1. Führen Sie diese Pipeline oder eine ihrer Phasen auf einem beliebigen verfügbaren Agenten aus.
  2. Definiert die "Build" -Stufe. stage Blöcke sind in der Skript-Pipeline-Syntax optional. Das Implementieren von stage -Blöcken in einer Skript-Pipeline bietet jedoch eine klarere Visualisierung der Teilmenge der Aufgaben/Schritte jeder Stufe in der Jenkins-Benutzeroberfläche.
  3. Führen Sie einige Schritte im Zusammenhang mit der Phase "Erstellen" aus.
  4. Definiert die "Test" -Stufe. 5
  5. Führen Sie einige Schritte im Zusammenhang mit der Phase "Test" aus.
  6. Definiert die Phase "Bereitstellen".
  7. Führen Sie einige Schritte im Zusammenhang mit der Phase "Bereitstellen" aus.

Pipeline-Beispiel

Hier ist ein Beispiel für ein Jenkinsfile mit Declarative und der entsprechenden Skript-Pipeline-Syntax:

Jenkinsfile (deklarative Pipeline):

pipeline {
    agent any
    options {
        skipStagesAfterUnstable()
    }
    stages {
        stage('Build') {
            steps {
                sh 'make'
            }
        }
        stage('Test'){
            steps {
                sh 'make check'
                junit 'reports/**/*.xml'
            }
        }
        stage('Deploy') {
            steps {
                sh 'make publish'
            }
        }
    }
}

Jenkinsfile (Scripted Pipeline):

node {
    stage('Build') {
        sh 'make'
    }
    stage('Test') {
        sh 'make check'
        junit 'reports/**/*.xml'
    }
    if (currentBuild.currentResult == 'SUCCESS') {
        stage('Deploy') {
            sh 'make publish'
        }
    }
}
0
M-Razavi