[JAVA] Quels sont le "pipeline" et "{...}" dans le pipeline Jenkins Pipeline {...} (pour les débutants Groovy, pour les langages expérimentés)

Contexte

J'ai décidé d'écrire Jenkins Pipeline au travail. J'étais heureux de copier l'exemple et de voir Hello World, mais j'ai une question comme celle-ci.

Que sont ces "pipeline" et "{...}"? De quel genre de règles de grammaire s'agit-il?

Jenkinsfile


pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'echo "Hello World"'
            }
        }
    }
}

Le Jenkinsfile lui-même ressemble à une simple structure de données (un compagnon de JSON et YAML). Il doit donc y avoir des règles. Mais je ne trouve pas la page où il est écrit. Quand j'ai demandé à un ingénieur au travail, j'ai trouvé que Jenkinsfile était un programme Groovy.

Après cela, j'écrirai ce que j'ai moi-même recherché et comment cela se compare avec d'autres langues.

Quelles sont les réponses à "pipeline" et "{...}"

pipeline est le ** nom de la méthode ** {...} est ** fermeture **

pipeline {...} est une syntaxe qui passe la fermeture {...} comme un ** argument ** à la méthode pipeline.

Puisque pipeline est une méthode, lors de l'exécution de Jenkinsfile

def pipeline(Closure cl) {
    //Prétraitement
    //Appeler la fermeture
    cl();
    //Post-traitement
}

Une méthode définie comme est chargée (de quelque part). (Le code ci-dessus est un peu différent pour être exact. Voir le supplément)

Plus de détails

appel de méthode groovy

Si vous écrivez l'appel pipeline ci-dessus de manière redondante,

pipeline({ ->
    //En traitement
})

est. La fermeture groovy s'écrit {x, y-> x + y} '', comme {argument-> process} ''. S'il n'y a pas d'argument, la partie `` argument-> '' peut être omise [^ 1]. Si vous omettez l'argument

[^ 1]: Pour être précis, le comportement est différent entre {-> processing} '' et {processing} ''.

pipeline({
    //En traitement
})

Ce sera sous la forme de. De plus, les parenthèses de l'appel de méthode peuvent être omises s'il y a un argument, donc

pipeline {
    //En traitement
}

Sera. Il a la même forme que le fichier Jenkins.

fermeture

Une fermeture est une fonction anonyme qui se comporte comme si elle fonctionnait sur l'appelant d'une méthode. Cette explication est facile à comprendre. Croja - Tutoriel Apache Groovy

Si vous essayez d'écrire dans une autre langue

Comparez la fermeture de Groovy avec d'autres langues. (Pour les langues qui ne peuvent pas être écrites ici, veuillez ajouter dans les commentaires)

Ruby Sensationnel

pipeline {
    //En traitement
}

Est la notation de Ruby

pipeline {
  #En traitement
}

Correspond à la notation. C'est pareil. Vous pouvez voir que Groovy est fortement influencé par Ruby. Les blocs rubis sont appelés fermetures dans Groovy. La différence entre les blocages et les fermetures est facile à comprendre sur cette page. Explorer d'autres langages pour Rubyist [5th] Groovy

JavaScript

Sensationnel

pipeline {
    //En traitement
}

Est la notation de JavaScript

pipeline(() => {
    //En traitement
})

Correspond à la notation. En JavaScript, les parenthèses de l'appel de méthode ne peuvent pas être omises, et même s'il n'y a pas d'argument, les parenthèses entourant l'argument ne peuvent pas être omises, mais dans Groovy, elles peuvent être omises.

Java Sensationnel

pipeline {
    //En traitement
}

Est la notation de Java

pipeline(() -> {
    //En traitement
})

Correspond à. Comme JavaScript, en Java, vous ne pouvez pas omettre les parenthèses pour les appels de méthode et les parenthèses entourant les arguments s'il n'y a pas d'arguments. Dans Groovy, ces deux éléments sont facultatifs.

Python Sensationnel

pipeline {
    //En traitement
}

Il n'y a pas de notation correspondante en Python, mais si vous osez l'écrire

pipeline(lambda:En traitement)

est. En Python, les expressions lambda ne peuvent pas s'étendre sur plusieurs lignes, mais dans Groovy, elles le font.

Supplément

Ci-dessus, la méthode pipeline est

def pipeline(Closure cl) {
    //Prétraitement
    //Appeler la fermeture
    cl();
    //Post-traitement
}

J'ai écrit que ça ressemble à ça, mais pour être exact, c'est un peu différent. Nous faisons déléguer pour limiter les fonctions qui peuvent être utilisées dans la fermeture. Je n'ai pas pu trouver la source de la méthode pipeline, mais voici le code le plus réaliste:

def pipeline(@DelegatesTo(PipelineSpec) Closure cl) {
    def pipelineSpec = new PipelineSpec()
    def code = cl.rehydrate(pipelineSpec, this, this)
    code.resolveStrategy = Closure.DELEGATE_ONLY
    code()
}

Dans le texte, pour donner la priorité à la clarté, le style d'écriture consiste à appeler la fermeture telle qu'elle est.

Matériel de référence

Épilogue

Pendant que je créais le Jenkinsfile, j'étais dans un état de "Je travaille avec le copier-coller, mais je ne sais pas pourquoi ça marche", mais j'ai compris que c'était un programme Groovy et j'ai saisi la situation réelle. Il y a encore peu d'articles sur Jenkins Pipeline, donc j'espère pouvoir continuer à écrire ce que j'ai appris.

Recommended Posts

Quels sont le "pipeline" et "{...}" dans le pipeline Jenkins Pipeline {...} (pour les débutants Groovy, pour les langages expérimentés)
[Pour les débutants] Pourquoi avez-vous besoin du «poids» et du «biais» du réseau neuronal?
[Minecraft] Quels sont les éléments importants de la survie?
Janken Poi en Python pour les débutants (réponses et explications)
[Pour les débutants] Installez le package dans l'environnement Anaconda (Janome)
Ingénierie des fonctionnalités des prévisions financières: quelles sont les fonctionnalités des prévisions financières?
Recherchez le pandas.DataFrame avec une variable et obtenez la ligne correspondante.
Rivaliser pour les E / S de fichiers dans différentes langues et comparer les vitesses
J'ai implémenté N-Queen dans différentes langues et mesuré la vitesse
Étant donné que la taille de la police et la taille de la fenêtre sont grandes dans Zoom pour Linux, je l'ai réduite
A quoi sert l'interface ...
À propos de la nécessité d'une première barre oblique dans le nom de l'abonné et le nom de l'éditeur
[PyTorch] Vérifiez si le modèle et l'ensemble de données sont en mode cuda
Quelle automatisation doit être effectuée en RPA, VBA, langage de programmation?
N'apprenez pas Java et C ++! !! Langues que les débutants devraient apprendre [plus soigneusement sélectionnées]
Quels sont les répertoires tels que Linux, / etc et / var / log?