J'essaie de convertir mon flux de travail de base de projet de style ancien en un pipeline basé sur Jenkins. En parcourant docs j'ai découvert deux syntaxes différentes nommées scripted
et declarative
. Tels que la version de la syntaxe de Jenkins web declarative
récemment (fin 2016). Bien qu'il y ait une nouvelle version de syntaxe, Jenkins supporte toujours la syntaxe scriptée.
Maintenant, je ne suis pas sûr dans quelle situation chacun de ces deux types serait le meilleur match. La syntaxe scripted
sera bientôt obsolète? Alors, declarative
sera-t-il l'avenir du pipeline Jenkins?
Tous ceux qui peuvent partager leurs réflexions sur ces deux types de syntaxe.
Lorsque Jenkins Pipeline a été créé, Groovy a été choisi comme fondation. Jenkins propose depuis longtemps un moteur Groovy intégré pour fournir des fonctionnalités de script avancées aux administrateurs et aux utilisateurs. En outre, les développeurs de Jenkins Pipeline ont estimé que Groovy constituait une base solide sur laquelle bâtir ce que l’on appelle maintenant le script "Scripted Pipeline".
Comme il s’agit d’un environnement de programmation complet, Scripted Pipeline offre une grande souplesse et une très grande extensibilité aux utilisateurs de Jenkins. La courbe d’apprentissage Groovy n’est généralement pas souhaitable pour tous les membres d’une équipe donnée. Declarative Pipeline a donc été créé pour offrir une syntaxe plus simple et plus explicite pour la création de Jenkins Pipeline.
Les deux sont fondamentalement le même sous-système Pipeline en dessous. Ce sont toutes deux des implémentations durables de "Pipeline as code". Ils sont tous deux capables d’utiliser des étapes intégrées à Pipeline ou fournies par des plugins. Les deux peuvent utiliser des bibliothèques partagées
Là où ils diffèrent cependant, c'est dans la syntaxe et la flexibilité. Le déclaratif limite ce qui est disponible pour l'utilisateur avec une structure plus stricte et prédéfinie, ce qui en fait le choix idéal pour les pipelines de distribution continue plus simples. Scripted fournit très peu de limites, dans la mesure où Groovy lui-même définit plutôt que les systèmes spécifiques à Pipeline, ce qui en fait un choix idéal pour les utilisateurs expérimentés et ceux dont les exigences sont plus complexes. Comme son nom l’indique, Declarative Pipeline encourage l’utilisation d’un modèle de programmation déclaratif. Considérant que les pipelines scriptés suivent un modèle de programmation plus impératif.
Copié à partir de https://jenkins.io/doc/book/pipeline/syntax/#compare
Une autre chose à considérer est que les pipelines déclaratifs ont une étape script () . Cela peut exécuter n'importe quel pipeline scripté. Donc, ma recommandation serait d'utiliser des pipelines déclaratifs et, si nécessaire, d'utiliser script()
pour les pipelines scriptés. Par conséquent, vous obtenez le meilleur des deux mondes.
déclarative semble être l’option la plus durable et celle que les gens recommandent. c'est le seul que Visual Pipeline Editor peut prendre en charge. il supporte la validation. et il finit par avoir la plus grande partie de la puissance des scripts puisque vous pouvez y revenir dans la plupart des contextes. de temps en temps, quelqu'un propose un cas d'utilisation où il ne peut pas vraiment faire ce qu'il veut faire avec le déclaratif, mais ce sont généralement des personnes qui utilisent un script depuis un certain temps, et ces lacunes de fonctionnalités sont susceptibles de se fermer dans le temps.
plus de contexte: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/
J'ai récemment basculé en déclaratif à partir d'un script avec l'agent kubernetes. Jusqu'en juillet 18, les pipelines déclaratifs ne pouvaient pas spécifier les pods Kubernetes. Cependant, avec l’ajout de l’étape yamlFile
, vous pouvez maintenant lire votre modèle de pod à partir d’un fichier yaml dans votre référentiel.
Cela vous permet ensuite d’utiliser par exemple Le très bon plugin kubernetes de vscode pour valider votre modèle de pod, puis le lire dans votre fichier Jenkins et utiliser les conteneurs par étapes, à votre guise.
pipeline {
agent {
kubernetes {
label 'jenkins-pod'
yamlFile 'jenkinsPodTemplate.yml'
}
}
stages {
stage('Checkout code and parse Jenkinsfile.json') {
steps {
container('jnlp'){
script{
inputFile = readFile('Jenkinsfile.json')
config = new groovy.json.JsonSlurperClassic().parseText(inputFile)
containerTag = env.BRANCH_NAME + '-' + env.GIT_COMMIT.substring(0, 7)
println "pipeline config ==> ${config}"
} // script
} // container('jnlp')
} // steps
} // stage
Comme mentionné ci-dessus, vous pouvez ajouter des blocs de script. Exemple de modèle de pod avec jnlp et docker personnalisés.
apiVersion: v1
kind: Pod
metadata:
name: jenkins-pod
spec:
containers:
- name: jnlp
image: jenkins/jnlp-slave:3.23-1
imagePullPolicy: IfNotPresent
tty: true
- name: rsync
image: mrsixw/concourse-rsync-resource
imagePullPolicy: IfNotPresent
tty: true
volumeMounts:
- name: nfs
mountPath: /dags
- name: docker
image: docker:17.03
imagePullPolicy: IfNotPresent
command:
- cat
tty: true
volumeMounts:
- name: docker
mountPath: /var/run/docker.sock
volumes:
- name: docker
hostPath:
path: /var/run/docker.sock
- name: nfs
nfs:
server: 10.154.0.3
path: /airflow/dags
La documentation Jenkins explique et compare correctement les deux types.
Pour citer: "Scripted Pipeline offre aux utilisateurs de Jenkins une flexibilité et une extensibilité considérables. La courbe d'apprentissage Groovy n'étant généralement pas souhaitable pour tous les membres d'une équipe donnée, Declarative Pipeline a été créé pour offrir une syntaxe plus simple et plus claire pour auteur de Jenkins Pipeline.
Les deux sont fondamentalement le même sous-système Pipeline en dessous. "
Lisez plus ici: https://jenkins.io/doc/book/pipeline/syntax/#compare