[PYTHON] Was sind die "Pipeline" und "{...}" in der Jenkins-Pipeline-Pipeline {...} (für Groovy-Anfänger, für erfahrene Sprachen)

Hintergrund

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.

Was sind die Antworten auf "Pipeline" und "{...}"

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)

Mehr Details

grooviger Methodenaufruf

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.

Schließung

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

Wenn Sie versuchen, in einer anderen Sprache zu schreiben

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.

Ergänzung

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.

Referenzmaterial

Nachwort

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

Was sind die "Pipeline" und "{...}" in der Jenkins-Pipeline-Pipeline {...} (für Groovy-Anfänger, für erfahrene Sprachen)
[Für Anfänger] Warum brauchen Sie das "Gewicht" und die "Tendenz" des neuronalen Netzwerks?
[Minecraft] Was sind die wichtigsten Überlebensgegenstände?
Janken Poi in Python für Anfänger (Antworten und Erklärungen)
[Für Anfänger] Installieren Sie das Paket in der Anaconda-Umgebung (Janome)
Feature Engineering für Finanzprognosen: Wie hoch ist der Feature-Betrag in der Finanzprognose?
Durchsuche den pandas.DataFrame mit einer Variablen und erhalte die entsprechende Zeile.
Messen Sie sich mit Datei-E / A in verschiedenen Sprachen und vergleichen Sie die Geschwindigkeiten
Ich habe N-Queen in verschiedenen Sprachen implementiert und die Geschwindigkeit gemessen
Da die Schriftgröße und die Fenstergröße in Zoom für Linux groß sind, habe ich sie kleiner gemacht
Was ist die Schnittstelle für ...
Über die Notwendigkeit eines ersten Schrägstrichs im Abonnenten- und Herausgebernamen
[PyTorch] Überprüfen Sie, ob sich Modell und Datensatz im Cuda-Modus befinden
Welche Automatisierung sollte in der Programmiersprache RPA, VBA durchgeführt werden?
Lerne nicht Java und C ++! !! Sprachen, die Anfänger lernen sollten [sorgfältiger ausgewählt]
Was sind die Verzeichnisse wie Linux, / etc und / var / log?