Ich beschloss, Jenkins Pipeline bei der Arbeit zu schreiben. Ich war froh, das Beispiel zu kopieren und Hello World zu sehen, aber ich habe eine Frage wie diese.
Was sind diese Pipeline
und {...}
? Was für Grammatikregeln sind das?
Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
}
}
}
}
Die Jenkins-Datei selbst sieht aus wie eine Datenstruktur (ein Begleiter von JSON und YAML). Es muss also einige Regeln geben. Aber ich kann die Seite, auf der sie geschrieben ist, nicht finden. Als ich einen Ingenieur bei der Arbeit fragte, stellte ich fest, dass Jenkinsfile ein Groovy-Programm ist.
Danach werde ich aufschreiben, was ich selbst recherchiert habe und wie es mit anderen Sprachen verglichen wird.
Pipeline
ist ** Methodenname **
{...}
ist ** Schließung **
Pipeline {...}
ist eine Syntax, die den Abschluss {...}
als ** Argument ** an die Pipeline
-Methode übergibt.
Da Pipeline
eine Methode ist, wenn Jenkinsfile ausgeführt wird
def pipeline(Closure cl) {
//Vorverarbeitung
//Rufen Sie die Schließung
cl();
//Nachbearbeitung
}
Eine Methode, die als geladen definiert ist (von irgendwoher). (Der obige Code ist etwas anders, um genau zu sein. Siehe Ergänzung)
Wenn Sie den obigen "Pipeline" -Aufruf redundant schreiben,
pipeline({ ->
//wird bearbeitet
})
ist.
Der groovige Abschluss wird wie "{x, y-> x + y}" geschrieben, wie "{argument-> process}". Wenn es kein Argument gibt, kann der Teil argument->
weggelassen werden [^ 1]. Wenn Sie das Argument weglassen
[^ 1]: Um genau zu sein, unterscheidet sich das Verhalten zwischen {-> Verarbeitung}
und {Verarbeitung}
.
pipeline({
//wird bearbeitet
})
Es wird in Form von sein. Außerdem können die Klammern des Methodenaufrufs weggelassen werden, wenn ein Argument vorhanden ist
pipeline {
//wird bearbeitet
}
Wird sein. Es hat die gleiche Form wie die Jenkins-Datei.
Ein Abschluss ist eine anonyme Funktion, die sich so verhält, als würde sie auf dem Aufrufer der Methode arbeiten. Diese Erklärung ist leicht zu verstehen. Croja - Apache Groovy Tutorial
Vergleichen Sie Groovys Abschluss mit anderen Sprachen. (Für Sprachen, die hier nicht geschrieben werden können, bitte in den Kommentaren hinzufügen)
Ruby Groovy
pipeline {
//wird bearbeitet
}
Ist die Notation von Ruby
pipeline {
#wird bearbeitet
}
Entspricht der Notation. Es sieht genauso aus. Sie können sehen, dass Groovy stark von Ruby beeinflusst wird. Rubinblöcke werden in Groovy als Verschlüsse bezeichnet. Der Unterschied zwischen Blöcken und Verschlüssen ist auf dieser Seite leicht zu verstehen. Erkundung anderer Sprachen für Rubyist [5.] Groovy
JavaScript
Groovy
pipeline {
//wird bearbeitet
}
Ist die Notation von JavaScript
pipeline(() => {
//wird bearbeitet
})
Entspricht der Notation. In JavaScript können die Klammern des Methodenaufrufs nicht weggelassen werden, und selbst wenn kein Argument vorhanden ist, können die das Argument umgebenden Klammern nicht weggelassen werden, in Groovy jedoch.
Java Groovy
pipeline {
//wird bearbeitet
}
Ist die Notation von Java
pipeline(() -> {
//wird bearbeitet
})
Entspricht. Wie bei JavaScript können Sie in Java die Klammern für Methodenaufrufe und die Klammern, die die Argumente umgeben, nicht weglassen, wenn keine Argumente vorhanden sind. In Groovy sind diese beiden optional.
Python Groovy
pipeline {
//wird bearbeitet
}
In Python gibt es keine entsprechende Notation, aber wenn Sie es wagen, sie zu schreiben
pipeline(lambda:wird bearbeitet)
ist. In Python können Lambda-Ausdrücke nicht mehrere Zeilen umfassen, in Groovy jedoch.
Oben ist die "Pipeline" -Methode
def pipeline(Closure cl) {
//Vorverarbeitung
//Rufen Sie die Schließung
cl();
//Nachbearbeitung
}
Ich habe geschrieben, dass es so aussieht, aber um genau zu sein, ist es ein bisschen anders. Wir machen "delegieren", um die Funktionen zu begrenzen, die beim Schließen verwendet werden können. Ich konnte die Quelle für die "Pipeline" -Methode nicht finden, aber hier ist der realistischere Code:
def pipeline(@DelegatesTo(PipelineSpec) Closure cl) {
def pipelineSpec = new PipelineSpec()
def code = cl.rehydrate(pipelineSpec, this, this)
code.resolveStrategy = Closure.DELEGATE_ONLY
code()
}
Im Text besteht der Schreibstil darin, den Abschluss so zu nennen, wie er ist, um der Klarheit Vorrang einzuräumen.
Während ich die Jenkins-Datei erstellte, befand ich mich in einem Zustand "Ich arbeite mit Kopieren und Einfügen, aber ich weiß nicht, warum es funktioniert", aber ich verstand, dass es sich um ein Groovy-Programm handelte, und begriff die tatsächliche Situation. Es gibt noch wenige Artikel über Jenkins Pipeline, daher hoffe ich, dass ich weiterhin schreiben kann, was ich gelernt habe.
Recommended Posts