it-swarm.com.de

Jenkins Skript-Pipeline oder deklarative Pipeline

Ich versuche, meinen Projektbasis-Workflow im alten Stil in eine Pipeline zu konvertieren, die auf Jenkins basiert. Beim Durchlaufen von docs habe ich festgestellt, dass es zwei verschiedene Syntaxen mit den Namen scripted und declarative gibt. Wie zum Beispiel die Syntax-Veröffentlichung von Jenkins Web declarative (Ende 2016). Obwohl es ein neues Syntax-Release gibt, unterstützt Jenkins auch weiterhin Skriptsyntax.

Ich bin mir nicht sicher, in welcher Situation diese beiden Typen am besten zusammenpassen würden. scripted Syntax wird bald veraltet sein? Wird declarative die Zukunft der Jenkins-Pipeline sein?

Jeder, der sich Gedanken über diese beiden Syntaxtypen machen kann.

76

Bei der ersten Erstellung der Jenkins-Pipeline wurde Groovy als Grundlage ausgewählt. Jenkins wird seit langem mit einer eingebetteten Groovy-Engine ausgeliefert, die sowohl Administratoren als auch Benutzern erweiterte Skriptfunktionen bietet. Darüber hinaus stellten die Implementierer von Jenkins Pipeline fest, dass Groovy eine solide Grundlage für den Aufbau des so genannten "Scripted Pipeline" -DSL darstellt.

Da es sich um eine voll funktionsfähige Programmierumgebung handelt, bietet Scripted Pipeline Jenkins-Benutzern eine enorme Flexibilität und Erweiterbarkeit. Die Groovy-Lernkurve ist in der Regel nicht für alle Mitglieder eines bestimmten Teams wünschenswert. Daher wurde Declarative Pipeline entwickelt, um eine einfachere und fundiertere Syntax für die Erstellung der Jenkins-Pipeline zu bieten.

Die beiden sind im Grunde genommen dasselbe Pipeline-Subsystem. Sie sind beide dauerhafte Implementierungen von "Pipeline als Code". Beide können Schritte verwenden, die in Pipeline integriert sind oder von Plugins bereitgestellt werden. Beide können Shared Libraries nutzen

Wo sie sich jedoch unterscheiden, liegt in der Syntax und Flexibilität. Durch die Deklaration wird die dem Benutzer zur Verfügung stehende Kapazität durch eine strengere und vordefinierte Struktur begrenzt. Dies macht sie zur idealen Wahl für einfachere Pipelines mit kontinuierlicher Lieferung. Scripted bietet nur sehr wenige Grenzen, da die einzigen Grenzen für Struktur und Syntax eher von Groovy selbst als von Pipeline-spezifischen Systemen definiert werden. Dies macht es zu einer idealen Wahl für Power-User und solche mit komplexeren Anforderungen. Wie der Name schon sagt, empfiehlt Declarative Pipeline ein deklaratives Programmiermodell. Während geskriptete Pipelines einem zwingenderen Programmiermodell folgen.

Kopiert von https://jenkins.io/doc/book/pipeline/syntax/#compare

68

Eine andere zu berücksichtigende Sache ist, dass deklarative Pipelines einen script () - Schritt haben. Dies kann jede skriptbasierte Pipeline ausführen. Daher würde ich empfehlen, deklarative Pipelines zu verwenden und bei Bedarf script() für skriptbasierte Pipelines zu verwenden. So bekommen Sie das Beste aus beiden Welten.

40
CodyK

deklarativ scheint die zukunftssicherere und von den Leuten empfohlene Option zu sein. Es ist das einzige, das der Visual Pipeline Editor unterstützen kann. es unterstützt die Validierung. und es hat letztendlich die meiste Leistung von Skript, da Sie in den meisten Kontexten auf Skript zurückgreifen können. Gelegentlich kommt jemand mit einem Anwendungsfall, bei dem er nicht ganz das tun kann, was er mit deklarativem Code tun möchte. Dies sind jedoch im Allgemeinen Personen, die seit einiger Zeit Skripte verwenden, und diese Funktionslücken werden sich wahrscheinlich mit der Zeit schließen.

mehr Kontext: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/

12
burnettk

Ich habe kürzlich von Scripted mit dem kubernetes-Agenten auf deklarativ umgestellt. Bis Juli 18 hatten deklarative Pipelines nicht die volle Fähigkeit, Kubernetes-Pods zu spezifizieren. Mit dem Schritt yamlFile können Sie jetzt Ihre Pod-Vorlage aus einer Yaml-Datei in Ihrem Repo lesen.

Auf diese Weise können Sie z. Das großartige Kubernetes-Plug-In von vscode validiert Ihre Pod-Vorlage, liest sie dann in Ihr Jenkins-File ein und verwendet die Container nach Belieben in Schritten.

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

Wie oben erwähnt, können Sie Skriptblöcke hinzufügen. Beispiel für eine Pod-Vorlage mit benutzerdefiniertem JNLP und Docker.

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
11
eamon1234

In der Jenkins-Dokumentation werden beide Typen richtig erklärt und verglichen.

Zitat: "Scripted Pipeline bietet Jenkins-Benutzern ein enormes Maß an Flexibilität und Erweiterbarkeit. Die Groovy-Lernkurve ist in der Regel nicht für alle Mitglieder eines bestimmten Teams wünschenswert. Deshalb wurde Declarative Pipeline entwickelt, um eine einfachere und einfühlsamere Syntax für zu bieten Autor Jenkins Pipeline.

Die beiden sind im Grunde genommen dasselbe Pipeline-Subsystem. "

Lesen Sie hier mehr: https://jenkins.io/doc/book/pipeline/syntax/#compare

6
Baghel