Pipeline scripté Jenkins ou pipeline déclaratif

95

J'essaie de convertir mon flux de travail de base de projet à l'ancienne en un pipeline basé sur Jenkins. En parcourant la documentation, j'ai trouvé qu'il y avait deux syntaxes différentes nommées scriptedet declarative. Comme la declarativeversion récente de la syntaxe Web Jenkins (fin 2016). Bien qu'il existe une nouvelle version de syntaxe, Jenkins prend également en charge la syntaxe scriptée.

Maintenant, je ne suis pas sûr dans quelle situation chacun de ces deux types serait le meilleur match. scriptedla syntaxe sera bientôt obsolète? Alors, sera declarativel'avenir du pipeline Jenkins?

Quiconque peut partager quelques réflexions sur ces deux types de syntaxe.

Nayana Adassuriya
la source
1
Je ne vois rien sur le fait que le script devienne obsolète, et ce serait alarmant compte tenu de l'écart de fonctionnalités entre déclaratif et scripté.
Matt Schuchard

Réponses:

86

Lorsque Jenkins Pipeline a été créé pour la première fois, Groovy a été choisi comme fondation. Jenkins est depuis longtemps livré avec un moteur Groovy intégré pour fournir des capacités de script avancées pour les administrateurs et les utilisateurs. De plus, les réalisateurs de Jenkins Pipeline ont trouvé que Groovy était une base solide sur laquelle construire ce que l'on appelle maintenant le DSL «Scripted Pipeline».

Comme il s'agit d'un environnement de programmation complet, Scripted Pipeline offre une énorme flexibilité et une 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, c'est pourquoi le Pipeline déclaratif a été créé pour offrir une syntaxe plus simple et plus avisée pour la création de Jenkins Pipeline.

Les deux sont fondamentalement le même sous-système de pipeline en dessous. Ce sont tous 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é. La déclaration limite ce qui est disponible pour l'utilisateur avec une structure plus stricte et prédéfinie, ce qui en fait un choix idéal pour des pipelines de livraison continue plus simples. Scripted fournit très peu de limites, dans la mesure où les seules limites sur la structure et la syntaxe ont tendance à être définies par Groovy lui-même, plutôt que par tout système spécifique à Pipeline, ce qui en fait un choix idéal pour les utilisateurs expérimentés et ceux qui ont des exigences plus complexes. Comme son nom l'indique, Declarative Pipeline encourage un modèle de programmation déclarative. Alors que les pipelines scriptés suivent un modèle de programmation plus impératif.

Copié de https://jenkins.io/doc/book/pipeline/syntax/#compare

Nayana Adassuriya
la source
5
J'ai essayé de déplacer une série de travaux de pipeline déclaratifs vers un pipeline scripté parce qu'ils étaient "un choix idéal pour les utilisateurs expérimentés et ceux avec des exigences plus complexes". Il n'y a presque aucune documentation pour le pipeline scripté. Aucun. C'est presque inutile comme ça. C'est une grande différence dont les gens devraient être conscients.
cauchy
6
@cauchy, il existe la même documentation pour les pipelines scriptés et déclaratifs, mais comme le script est destiné aux utilisateurs avancés, ce n'est pas celui qui est affiché en premier, mais toute la documentation contient à la fois une documentation et des exemples de pipelines scriptés et déclaratifs. Il vous suffit de basculer la syntaxe sciptée sous chaque exemple de documentation de pipeline déclaratif
Ilhicas
1
@Ilhicas où? Il n'y a pas de "bascule" dans le manuel de l'utilisateur. avez vous un lien? Même les étapes du pipeline sur le pipeline scripté indiquent simplement qu'il n'y a aucune différence avec le pipeline déclaratif et les liens vers les documents du pipeline déclaratif, ce qui est trompeur.
cauchy
3
@cauchy exemple jenkins.io/doc/book/pipeline , ci-dessous il y a une bascule qui va à jenkins.io/doc/book/pipeline/# , qui étend l'équivalent scripté du pipeline déclaratif
Ilhicas
Le problème repose sur le fait que vous ne lisez pas correctement la documentation, "Voici un exemple de fichier Jenkins utilisant la syntaxe Declarative Pipeline - son équivalent de syntaxe scriptée est accessible en cliquant sur le lien Toggle Scripted Pipeline ci-dessous:" Ceci est dans la documentation officielle! Lisez, alors vous pouvez faire de telles déclarations .. si elles sont vraies ..
Ilhicas
57

Une autre chose à considérer est que les pipelines déclaratifs ont une étape script () . Cela peut exécuter n'importe quel pipeline scripté. Ma recommandation serait donc d'utiliser des pipelines déclaratifs et, si nécessaire, script()des pipelines scriptés. Par conséquent, vous obtenez le meilleur des deux mondes.

CodyK
la source
3
Avez-vous des exemples d'utilisation d'un bloc script () dans un pipeline déclaratif? Ce lien n'en a pas.
user2023861
Si vous vous retrouvez à utiliser plusieurs fois un scriptbloc dans un pipeline déclaratif, vous devriez envisager d'utiliser un pipeline scripté jusqu'au bout.
Kru
Ma préférence est le pipeline déclaratif par rapport aux pipelines scriptés, comme @CodyK l'a mentionné. Oui, je suis d'accord qu'il existe des situations complexes dans lesquelles nous pouvons utiliser des pipelines scriptés. Mais, la planification simplifiée prope réduit toujours la complexité et la plupart du temps ouvrira la voie à un pipeline déclaritif plus simple.
NIK
18

J'ai récemment basculé en déclaratif à partir d'un script avec l'agent kubernetes. Jusqu'en juillet 18, les pipelines déclaratifs n'avaient pas la pleine capacité de spécifier des pods kubernetes. Cependant, avec l'ajout de l' yamlFileétape, vous pouvez maintenant lire votre modèle de pod à partir d'un fichier yaml dans votre dépôt.

Cela vous permet ensuite d'utiliser par exemple l'excellent plugin kubernetes de vscode pour valider votre modèle de pod, puis de le lire dans votre fichier Jenkins et d'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
eamon1234
la source
1
C'est la réponse la plus utile que j'ai vue toute l'année: D merci
Trevor Rudolph
14

déclarative semble être l'option la plus pérenne et celle que les gens recommandent. c'est le seul que Visual Pipeline Editor puisse prendre en charge. il prend en charge la validation. et il finit par avoir la plupart de la puissance du script puisque vous pouvez revenir au script dans la plupart des contextes. Parfois, quelqu'un propose un cas d'utilisation où il ne peut pas tout à fait faire ce qu'il veut faire avec déclaratif, mais il s'agit généralement de personnes qui utilisent des scripts depuis un certain temps, et ces lacunes de fonctionnalités sont susceptibles de se combler avec le temps.

plus de contexte: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/

Burnettk
la source
4
Il n'y a rien de plus à l'épreuve du temps, ils servent des publics et des objectifs différents et tous deux ont le même système sous-jacent, comme indiqué par plusieurs autres réponses ici. Le déclaratif limite l'utilisateur, le script leur donne trop de liberté, vous devez donc être à différents niveaux de connaissance de jenkins pour appliquer chacun.
Ilhicas
3
je suis d'accord avec toi. cette réponse était la meilleure au moment où je l'ai écrite, mais je suis heureux que les auteurs jenkins aient mieux documenté les différences maintenant et ont clairement indiqué que le script ne disparaîtra pas de si tôt. :)
burnettk
7

La documentation Jenkins explique et compare correctement les deux types.

Pour citer: "Scripted Pipeline offre une énorme flexibilité et 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, donc Declarative Pipeline a été créé pour offrir une syntaxe plus simple et plus avisée pour création de Jenkins Pipeline.

Les deux sont fondamentalement le même sous-système Pipeline en dessous. "

En savoir plus ici: https://jenkins.io/doc/book/pipeline/syntax/#compare

Baghel
la source
1
  1. Le pipeline déclaratif est défini dans un bloc intitulé «pipeline» tandis que le pipeline scripté est défini dans un «nœud».
  2. Syntaxe - Le pipeline déclaratif a des «étapes», des «étapes»
  3. Si la construction échoue, la version déclarative vous donne la possibilité de redémarrer la construction à partir de cette étape, ce qui n'est pas vrai dans l'option script
  4. S'il y a un problème dans le script, le déclaratif vous en informera dès que vous construisez le travail mais en cas de script, il passera l'étape qui est `` OK '' et lancera une erreur sur la scène qui est `` Pas ok ''

Vous pouvez également le référer. Une très bonne lecture -> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-declarative-pipeline-the-4-practical-differences/ @ Szymon.Stepniak https://stackoverflow.com/users/ 2194470 / szymon-stepniak? Tab = profil

Ruta Borkar
la source
0

Le pipeline déclaratif est bien supérieur au pipeline scripté . Le pipeline déclaratif est capable d'exécuter tout ce que le pipeline scripté peut en utilisant l'action de script et dispose de nombreuses fonctionnalités supplémentaires.

De plus, le pipeline déclaratif prend en charge diverses technologies telles que Docker ou Kubernetes (voir ici ).

Le pipeline déclaratif est également plus évolutif. Il est toujours en développement et de nouvelles fonctionnalités telles que la nouvelle fonctionnalité Matrix ont été ajoutées récemment à la fin de 2019.

tl; dr - Le pipeline déclaratif peut faire tout ce que le pipeline scripté peut et même plus.

Michael Kemmerzell
la source