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.
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)
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.
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
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.
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.
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.