Pipeline dengan skrip Jenkins atau pipeline deklaratif

95

Saya mencoba untuk mengubah alur kerja dasar proyek gaya lama saya menjadi pipa berdasarkan Jenkins. Saat menelusuri dokumen, saya menemukan ada dua sintaks berbeda bernama scripteddan declarative. Seperti declarativerilis sintaks web Jenkins baru-baru ini (akhir 2016). Meskipun ada rilis sintaks baru, Jenkins masih mendukung sintaks skrip juga.

Sekarang, saya tidak yakin dalam situasi apa masing-masing dari kedua tipe ini akan menjadi pertandingan terbaik. Jadi akankah declarativemasa depan saluran pipa Jenkins?

Siapapun yang dapat berbagi pemikiran tentang kedua jenis sintaks ini.

Nayana Adassuriya
sumber
2
Saya tidak melihat apa pun tentang scripted menjadi usang, dan itu akan mengkhawatirkan mengingat kesenjangan fitur antara deklaratif dan scripted.
Matt Schuchard
@MattSchuchard Anda tampaknya masih benar, 3 tahun kemudian sekarang. Saya membuat lompatan untuk mengedit itu dari pertanyaan sekarang.
cellepo

Jawaban:

86

Saat Jenkins Pipeline pertama kali dibuat, Groovy dipilih sebagai yayasan. Jenkins telah lama mengirimkan mesin Groovy tertanam untuk memberikan kemampuan skrip tingkat lanjut bagi admin dan pengguna. Selain itu, pelaksana Jenkins Pipeline menemukan Groovy sebagai fondasi yang kokoh untuk membangun apa yang sekarang disebut sebagai DSL "Scripted Pipeline".

Karena merupakan lingkungan pemrograman berfitur lengkap, Scripted Pipeline menawarkan fleksibilitas dan ekstensibilitas yang luar biasa bagi pengguna Jenkins. Kurva pembelajaran Groovy biasanya tidak diinginkan untuk semua anggota tim tertentu, jadi Declarative Pipeline dibuat untuk menawarkan sintaks yang lebih sederhana dan lebih beropini untuk membuat Jenkins Pipeline.

Keduanya pada dasarnya adalah sub-sistem Pipeline yang sama di bawahnya. Keduanya adalah implementasi yang tahan lama dari "Pipeline as code". Keduanya dapat menggunakan langkah-langkah yang dibangun ke dalam Pipeline atau disediakan oleh plugin. Keduanya dapat memanfaatkan Perpustakaan Bersama

Di mana mereka berbeda bagaimanapun adalah dalam sintaks dan fleksibilitas. Deklaratif membatasi apa yang tersedia bagi pengguna dengan struktur yang lebih ketat dan telah ditentukan sebelumnya, menjadikannya pilihan ideal untuk pipeline pengiriman berkelanjutan yang lebih sederhana. Scripted memberikan batasan yang sangat sedikit, sejauh satu-satunya batasan pada struktur dan sintaksis cenderung ditentukan oleh Groovy itu sendiri, daripada sistem khusus Pipeline, menjadikannya pilihan ideal untuk pengguna daya dan mereka yang memiliki persyaratan yang lebih kompleks. Seperti namanya, Declarative Pipeline mendorong model pemrograman deklaratif. Sedangkan Scripted Pipelines mengikuti model pemrograman yang lebih penting.

Disalin dari https://jenkins.io/doc/book/pipeline/syntax/#compare

Nayana Adassuriya
sumber
5
Saya mencoba untuk memindahkan serangkaian pekerjaan pipa deklaratif ke pipa skrip karena mereka adalah "pilihan ideal untuk pengguna listrik dan mereka dengan persyaratan yang lebih kompleks". Hampir tidak ada dokumentasi untuk pipeline dengan skrip. Tidak ada. Hampir tidak berguna seperti ini. Ini adalah perbedaan besar yang harus diperhatikan orang.
cauchy
6
@cauchy terdapat dokumentasi yang sama untuk pipeline yang di-skrip dan deklaratif, tetapi karena skrip ditujukan untuk pengguna tingkat lanjut, ini bukan yang ditampilkan pertama kali, tetapi semua fitur dokumentasi, baik dokumentasi dan contoh pipeline dalam skrip maupun deklaratif. Anda hanya perlu mengaktifkan sintaks scipted di bawah setiap contoh dokumentasi dari pipeline deklaratif
Ilhicas
1
@Ilicas dimana? Tidak ada "matikan" di buku pegangan pengguna. Apakah kamu punya link Bahkan langkah pipeline pada pipeline skrip hanya mengatakan bahwa tidak ada perbedaan dengan pipeline deklaratif dan link ke dokumen pipeline deklaratif, yang menyesatkan.
cauchy
3
@cauchy example jenkins.io/doc/book/pipeline , di bawah ini ada tombol beralih ke jenkins.io/doc/book/pipeline/# , yang memperluas skrip yang setara dengan pipeline deklaratif
Ilhicas
Masalahnya bergantung pada Anda tidak membaca dokumentasi dengan benar, "Berikut adalah contoh Jenkinsfile yang menggunakan sintaks Declarative Pipeline - padanan sintaks Scripted-nya dapat diakses dengan mengklik link Toggle Scripted Pipeline di bawah ini:" Ini ada di Dokumentasi Resmi! Baca, maka Anda dapat membuat pernyataan seperti itu .. jika itu benar ..
Ilhicas
57

Hal lain yang perlu dipertimbangkan adalah pipelines deklaratif memiliki langkah script () . Ini dapat menjalankan pipeline skrip apa pun. Jadi, rekomendasi saya adalah menggunakan pipeline deklaratif, dan jika perlu, gunakan script()pipeline dengan skrip. Oleh karena itu, Anda mendapatkan yang terbaik dari kedua dunia.

CodyK
sumber
3
Apakah Anda memiliki contoh penggunaan blok script () dalam pipeline deklaratif? Tautan itu tidak ada.
pengguna2023861
Jika Anda menemukan diri Anda menggunakan beberapa kali scriptblok dalam pipeline deklaratif, Anda harus mempertimbangkan untuk menggunakan pipeline skrip sepenuhnya.
Kru
Preferensi saya adalah pipa Deklaritif daripada pipa skrip seperti yang disebutkan @CodyK. Ya, saya setuju ada beberapa situasi kompleks di mana kita dapat menggunakan pipeline skrip. Namun, perencanaan yang disederhanakan prope selalu mengurangi kompleksitas dan sebagian besar waktu akan membuka jalan menuju pipeline deklaritif yang lebih sederhana.
NIK
18

Saya beralih ke deklaratif baru-baru ini dari skrip dengan agen kubernetes. Sampai pipeline deklaratif Juli '18 tidak memiliki kemampuan penuh untuk menentukan pod kubernetes. Namun dengan tambahan yamlFilelangkah tersebut Anda sekarang dapat membaca templat pod Anda dari file yaml di repo Anda.

Ini kemudian memungkinkan Anda menggunakan misalnya plugin kubernetes besar vscode untuk memvalidasi template pod Anda, kemudian membacanya ke Jenkinsfile Anda dan menggunakan kontainer dalam langkah-langkah sesuka Anda.

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

Seperti disebutkan di atas, Anda dapat menambahkan blok skrip. Contoh template pod dengan custom jnlp dan 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
eamon1234
sumber
1
Ini adalah jawaban paling bermanfaat yang pernah saya lihat sepanjang tahun: D terima kasih
Trevor Rudolph
14

deklaratif tampaknya menjadi opsi yang lebih tahan masa depan dan yang direkomendasikan orang. itu satu-satunya yang dapat didukung oleh Visual Pipeline Editor. itu mendukung validasi. dan akhirnya memiliki sebagian besar kekuatan skrip karena Anda dapat kembali ke skrip di sebagian besar konteks. kadang-kadang seseorang muncul dengan kasus penggunaan di mana mereka tidak dapat melakukan apa yang ingin mereka lakukan dengan deklaratif, tetapi ini umumnya adalah orang-orang yang telah menggunakan skrip selama beberapa waktu, dan celah fitur ini kemungkinan besar akan tertutup pada waktunya.

konteks lebih lanjut: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/

burnettk.dll
sumber
4
Tidak ada yang namanya lebih bukti masa depan, mereka melayani khalayak dan tujuan yang berbeda dan keduanya memiliki sistem dasar yang sama, seperti yang dinyatakan oleh beberapa jawaban lain di sini. Deklaratif membatasi pengguna, skrip memberi mereka terlalu banyak kebebasan, jadi Anda harus memiliki tingkat pengetahuan jenkins yang berbeda untuk menerapkan masing-masing.
Ilhicas
3
saya setuju denganmu. jawaban ini adalah yang terbaik pada saat saya menulisnya, tetapi saya senang bahwa penulis jenkins telah mendokumentasikan perbedaannya dengan lebih baik sekarang dan menjelaskan bahwa skrip tidak akan hilang dalam waktu dekat. :)
burnettk
7

Dokumentasi Jenkins menjelaskan dan membandingkan kedua jenis dengan tepat.

Mengutip: "Scripted Pipeline menawarkan fleksibilitas dan ekstensibilitas yang luar biasa untuk pengguna Jenkins. Kurva pembelajaran Groovy biasanya tidak diinginkan untuk semua anggota tim tertentu, jadi Declarative Pipeline dibuat untuk menawarkan sintaks yang lebih sederhana dan lebih beropini untuk menulis Jenkins Pipeline.

Keduanya pada dasarnya adalah sub-sistem Pipeline yang sama di bawahnya. "

Baca lebih lanjut di sini: https://jenkins.io/doc/book/pipeline/syntax/#compare

Baghel
sumber
1
  1. Pipeline deklaratif didefinisikan dalam blok berlabel 'pipeline' sedangkan pipeline skrip didefinisikan dalam 'node'.
  2. Sintaks - Pipeline deklaratif memiliki 'Tahapan', 'Langkah'
  3. Jika build gagal, deklaratif memberi Anda opsi untuk memulai ulang build dari tahap itu lagi yang tidak benar dalam opsi skrip
  4. Jika ada masalah dalam pembuatan skrip, deklaratif akan memberi tahu Anda segera setelah Anda membangun pekerjaan tetapi jika ada skrip, itu akan melewati tahap 'Oke' dan melempar kesalahan pada tahap yang 'Tidak ok'

Anda juga bisa merujuk ini. Bacaan yang sangat bagus -> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-declarative-pipeline-the-4-practical-differences/ @ Szymon.Stepniak https://stackoverflow.com/users/ 2194470 / szymon-stepniak? Tab = profile

Ruta Borkar
sumber
0

The deklaratif Pipeline jauh lebih unggul dengan Scripted Pipeline . Declarative Pipeline dapat mengeksekusi semua yang dapat dilakukan oleh Scripted Pipeline dengan menggunakan langkah skrip dan memiliki banyak fitur tambahan.

Selanjutnya, Declarative Pipeline memiliki dukungan untuk berbagai teknologi seperti Docker atau Kubernetes (lihat di sini ).

Pipa Deklaratif juga lebih terbukti di masa depan. Ini masih dalam pengembangan dan fitur baru seperti fitur Matrix yang baru diperkenalkan telah ditambahkan baru-baru ini pada akhir 2019.

tl; dr - Declarative Pipeline dapat melakukan apa saja yang dapat dilakukan Scripted Pipeline dan bahkan lebih.

Michael Kemmerzell
sumber