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?
Sie verwechseln und mischen Scripted Pipeline
Mit Declarative Pipeline
, Um den vollständigen Unterschied herauszufinden siehe hier . Aber die Kurzgeschichte:
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.
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:
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
}
}
}
}
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:
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.
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
}
}
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.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'
}
}
}