जेनकींस ने पाइपलाइन या घोषणात्मक पाइपलाइन को स्क्रिप्ट किया


95

मैं अपने पुराने स्टाइल प्रोजेक्ट बेस वर्कफ़्लो को जेनकिंस पर आधारित पाइपलाइन में बदलने की कोशिश कर रहा हूं। डॉक्स से गुजरने के दौरान मैंने पाया कि दो अलग-अलग सिंटैक्स हैं जिनका नाम है scriptedऔर declarative। जैसे कि जेनकिन्स वेब declarativeसिंटैक्स हाल ही में (2016 के अंत में) रिलीज़ हुआ। हालाँकि एक नया सिंटैक्स रिलीज़ है जेनकींस अभी भी स्क्रिप्टेड सिंटैक्स का समर्थन करता है।

अब, मुझे यकीन नहीं है कि इन दो प्रकारों में से प्रत्येक किस स्थिति में सबसे अच्छा मैच होगा। scriptedसिंटेक्स को जल्द ही हटा दिया जाएगा? तो क्या declarativeजेनकींस पाइपलाइन का भविष्य होगा ?

जो कोई भी इन दो वाक्यविन्यास प्रकारों के बारे में कुछ विचार साझा कर सकता है।


1
मुझे स्क्रिप्टेड अपग्रेड होने के बारे में कुछ भी नहीं दिखता है, और यह घोषणात्मक और स्क्रिप्टेड के बीच की सुविधा के अंतर को देखते हुए चिंताजनक होगा।
मैट शुकरड

जवाबों:


86

जब जेनकिन्स पाइपलाइन पहली बार बनाई गई थी, तो ग्रूवी को नींव के रूप में चुना गया था। जेनकिंस ने लंबे समय तक एम्बेडेड ग्रूवी इंजन के साथ एडिंस और उपयोगकर्ताओं के लिए उन्नत स्क्रिप्टिंग क्षमताओं को प्रदान करने के लिए भेज दिया है। इसके अतिरिक्त, जेनकिंस पाइपलाइन के कार्यान्वयनकर्ताओं ने ग्रूवी को एक ठोस आधार पाया, जिस पर निर्माण करने के लिए जिसे अब "स्क्रिप्टेड पाइपलाइन" डीएसएल कहा जाता है।

जैसा कि यह पूरी तरह से चित्रित प्रोग्रामिंग वातावरण है, स्क्रिप्टेड पाइपलाइन, जेनकिंस उपयोगकर्ताओं के लिए लचीलेपन और विस्तार की जबरदस्त पेशकश करता है। ग्रूवी लर्निंग-कर्व आम तौर पर किसी दिए गए टीम के सभी सदस्यों के लिए वांछनीय नहीं है, इसलिए डिक्लेरेटिव पाइपलाइन को जेनकिंस पाइपलाइन को संलेखन के लिए एक सरल और अधिक राय वाले सिंटैक्स की पेशकश करने के लिए बनाया गया था।

दोनों बुनियादी तौर पर एक ही पाइपलाइन सब-सिस्टम के नीचे हैं। वे "कोड के रूप में पाइपलाइन" के दोनों टिकाऊ कार्यान्वयन हैं। वे दोनों पाइपलाइन में निर्मित चरणों का उपयोग करने में सक्षम हैं या प्लगइन्स द्वारा प्रदान किए गए हैं। दोनों साझा पुस्तकालयों का उपयोग करने में सक्षम हैं

हालांकि वे भिन्न होते हैं, लेकिन वाक्य रचना और लचीलेपन में है। घोषणा की सीमा जो उपयोगकर्ता को अधिक सख्त और पूर्व-परिभाषित संरचना के साथ उपलब्ध है, जिससे यह सरल डिलीवरी वितरण पाइपलाइनों के लिए एक आदर्श विकल्प है। स्क्रिप्टेड बहुत कम सीमाएँ प्रदान करता है, यह मानकर कि संरचना और वाक्यविन्यास की एकमात्र सीमा ग्रूवी द्वारा ही परिभाषित की जाती है, किसी भी पाइपलाइन-विशिष्ट प्रणालियों के बजाय, यह शक्ति-उपयोगकर्ताओं और अधिक जटिल आवश्यकताओं वाले लोगों के लिए एक आदर्श विकल्प है। जैसा कि नाम से ही स्पष्ट है, डिक्लेरेटिव पाइपलाइन एक घोषणात्मक प्रोग्रामिंग मॉडल को प्रोत्साहित करता है। जबकि स्क्रिप्टेड पाइपलाइन एक अधिक अनिवार्य प्रोग्रामिंग मॉडल का पालन करती है।

Https://jenkins.io/doc/book/pipeline/syntax/#compare से नकल की गई


5
मैंने स्क्रिप्टेड पाइपलाइन के लिए घोषणात्मक पाइपलाइन नौकरियों की एक श्रृंखला को स्थानांतरित करने की कोशिश की, क्योंकि वे "बिजली-उपयोगकर्ताओं के लिए एक आदर्श विकल्प और अधिक महत्वपूर्ण आवश्यकताओं के साथ" थे। स्क्रिप्टेड पाइपलाइन के लिए लगभग शून्य दस्तावेज है। कोई नहीं। इस तरह इसका लगभग बेकार है। यह एक बड़ा अंतर है जिसके बारे में लोगों को जागरूक होना चाहिए।
caucy

6
@ स्कैची में स्क्रिप्टेड और डिक्लेयर दोनों पाइपलाइनों के लिए एक ही डॉक्यूमेंटेशन है, लेकिन चूंकि स्क्रिप्टेड एडवांस यूजर्स के लिए है, इसलिए इसे पहले नहीं दिखाया जा सकता है, लेकिन सभी डॉक्यूमेंटेशन में स्क्रिप्टेड और डिक्लेयरेटिव पाइपलाइन डॉक्यूमेंटेशन और उदाहरण दोनों शामिल हैं। आपको सिर्फ घोषणात्मक पाइपलाइन के प्रत्येक दस्तावेज़ीकरण उदाहरण के नीचे बिखरे हुए सिंटैक्स को टॉगल करना है
इल्हिकास

1
@ इलहास कहाँ? उपयोगकर्ता पुस्तिका में कोई "टॉगल" नहीं हैं। क्या आपके पास एक लिंक है? यहां तक ​​कि स्क्रिप्टेड पाइपलाइन पर पाइपलाइन के कदम सिर्फ यह कहते हैं कि घोषणात्मक पाइपलाइन और घोषणात्मक पाइपलाइन डॉक्स के लिंक के साथ कोई मतभेद नहीं हैं, जो भ्रामक है।
कोच्ची

3
@ kuchy उदाहरण jenkins.io/doc/book/pipeline , नीचे एक टॉगल है जो jenkins.io/doc/book/pipeline/# पर जाता है , जो घोषणात्मक पाइपलाइन के स्क्रिप्टेड समकक्ष के समान है
इलियाकस

समस्या आप पर निर्भर है कि आप ठीक से डॉक्यूमेंटेशन नहीं पढ़ रहे हैं, "डिक्लेरेटिव पाइप लाइन सिंटैक्स का उपयोग करते हुए जेनकिन्सफाइल का एक उदाहरण है - इसके स्क्रिप्टेड सिंटैक्स समकक्ष को नीचे टॉगल स्क्रिप्टेड पाइपलाइन लिंक पर क्लिक करके एक्सेस किया जा सकता है:" यह आधिकारिक दस्तावेज में है! पढ़िए, फिर आप ऐसे बयान दे सकते हैं .. अगर वे सच मानते हैं ..
इलियास

57

घोषणात्मक पाइपलाइनों पर विचार करने के लिए एक और चीज की एक स्क्रिप्ट () चरण है । यह किसी भी स्क्रिप्टेड पाइपलाइन को चला सकता है। इसलिए मेरी सिफारिश घोषणात्मक पाइपलाइनों का उपयोग करने के लिए होगी, और यदि script()स्क्रिप्टेड पाइपलाइनों के लिए आवश्यक उपयोग किया जाएगा। इसलिए आप दोनों दुनियाओं में सर्वश्रेष्ठ हैं।


3
क्या आपके पास एक घोषणात्मक पाइपलाइन में स्क्रिप्ट () ब्लॉक का उपयोग करने का कोई उदाहरण है? उस लिंक का कोई नहीं है।
user2023861

यदि आप scriptएक घोषणात्मक पाइपलाइन में कुछ बार ब्लॉक का उपयोग करके खुद को पाते हैं , तो आपको सभी तरह से स्क्रिप्टेड पाइपलाइन का उपयोग करने पर विचार करना चाहिए।
क्रु।

मेरी पसंद लिस्टेड पाइपलाइनों पर @ पाइपलाइन के रूप में घोषित पाइपलाइन है। हां, मैं मानता हूं कि कुछ जटिल परिस्थितियां हैं जो हम स्क्रिप्टेड पाइपलाइनों का उपयोग कर सकते हैं। लेकिन, प्रॉपर सरलीकृत योजना हमेशा जटिलता को कम करती है और ज्यादातर समय अधिक सरल घोषित पाइपलाइन की ओर रास्ता प्रशस्त करती है।
NIK

18

मैंने हाल ही में कुबेरनेट्स एजेंट के साथ स्क्रिप्ट से घोषणात्मक पर स्विच किया। जुलाई तक '18 घोषणात्मक पाइपलाइनों में कुबेरनेट्स पॉड्स को निर्दिष्ट करने की पूरी क्षमता नहीं थी। हालाँकि yamlFileकदम के अतिरिक्त के साथ अब आप अपने रेपो में एक यमल फ़ाइल से अपना पॉड टेम्पलेट पढ़ सकते हैं।

इसके बाद आप अपने पॉड टेम्प्लेट को मान्य करने के लिए vs vscode के महान कुबेरनेट प्लग इन का उपयोग करने देते हैं, फिर इसे अपने जेनकिंसफाइल में पढ़ते हैं और कंटेनरों का उपयोग चरणों में करते हैं।

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

जैसा कि ऊपर बताया गया है कि आप स्क्रिप्ट ब्लॉक जोड़ सकते हैं। उदाहरण jnlp और 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

1
यह सबसे उपयोगी उत्तर है जो मैंने पूरे वर्ष देखा है: D धन्यवाद
ट्रेवर रुडोल्फ

14

घोषणात्मक अधिक भविष्य-प्रूफ विकल्प प्रतीत होता है और वह जिसे लोग सुझाते हैं। यह केवल एक ही दृश्य पाइपलाइन संपादक का समर्थन कर सकता है। यह मान्यता का समर्थन करता है। और यह स्क्रिप्टेड की अधिकांश शक्ति को समाप्त करता है क्योंकि आप अधिकांश संदर्भों में स्क्रिप्टेड वापस आ सकते हैं। कभी-कभार कोई व्यक्ति उपयोग के मामले में आता है, जहाँ वे घोषणा के साथ जो करना चाहते हैं, वह नहीं कर सकते हैं, लेकिन यह आम तौर पर ऐसे लोग हैं जो कुछ समय से स्क्रिप्टेड का उपयोग कर रहे हैं, और ये फीचर अंतराल समय में बंद होने की संभावना है।

अधिक संदर्भ: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/


4
अधिक भविष्य के प्रमाण जैसी कोई चीज नहीं है, वे अलग-अलग दर्शकों और उद्देश्यों की सेवा करते हैं और दोनों के पास एक ही अंतर्निहित प्रणाली है, जैसा कि यहां कई जवाबों द्वारा कहा गया है। घोषणाकर्ता उपयोगकर्ता को सीमित कर रहा है, स्क्रिप्टेड उन्हें बहुत अधिक स्वतंत्रता दे रहा है, इसलिए आपको प्रत्येक को लागू करने के लिए जेनकिंस के विभिन्न ज्ञान स्तरों पर होना चाहिए।
इलियास 10

3
मैं आपसे सहमत हुँ। यह उत्तर उस समय सबसे अच्छा था जब मैंने इसे लिखा था, लेकिन मुझे खुशी है कि जेनकिंस लेखकों ने अब मतभेदों को बेहतर ढंग से प्रलेखित किया है और यह स्पष्ट किया है कि स्क्रिप्टेड जल्द ही किसी भी समय दूर नहीं जा रहा है। :)
burnettk

7

जेनकिंस प्रलेखन ठीक से बताता है और दोनों प्रकारों की तुलना करता है।

उद्धृत करने के लिए: "स्क्रिप्टेड पाइपलाइन, जेनकिंस उपयोगकर्ताओं के लिए लचीलेपन और विस्तार की जबरदस्त मात्रा प्रदान करता है। ग्रूवी लर्निंग-कर्व आम तौर पर किसी दिए गए टीम के सभी सदस्यों के लिए वांछनीय नहीं है, इसलिए घोषणात्मक पाइपलाइन के लिए एक सरल और अधिक राय वाले सिंटैक्स की पेशकश करने के लिए बनाया गया था।" जेनकींस पाइपलाइन को संलेखन।

दोनों मूल रूप से एक ही पाइपलाइन सब-सिस्टम के नीचे हैं। "

यहां पढ़ें: https://jenkins.io/doc/book/pipeline/syntax/#compare


1
  1. घोषणात्मक पाइपलाइन को 'पाइपलाइन' लेबल वाले ब्लॉक के भीतर परिभाषित किया गया है जबकि स्क्रिप्टेड पाइपलाइन को 'नोड' के भीतर परिभाषित किया गया है।
  2. सिंटेक्स - घोषणात्मक पाइपलाइन में 'चरण', 'चरण' होते हैं
  3. यदि बिल्ड विफल है, तो घोषणात्मक आपको बिल्ड को उस चरण से फिर से चालू करने का विकल्प देता है जो स्क्रिप्टेड विकल्प में सही नहीं है
  4. यदि स्क्रिप्टिंग में कोई समस्या है, तो घोषणाकर्ता आपको नौकरी बनाते ही सूचित करेगा लेकिन स्क्रिप्टेड होने की स्थिति में, यह उस चरण को पारित कर देगा जो 'ठीक है' और मंच पर त्रुटि फेंकना है जो 'ठीक नहीं है'

आप यह भी संदर्भित कर सकते हैं। एक बहुत अच्छा पढ़ा -> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-declarative-pipeline-the-4-practical-differences/ @ Szymep.Stepniak https://stackoverflow.com/users/users 2194470 / ज़ीमॉन-stepniak? टैब = प्रोफ़ाइल


0

घोषणात्मक पाइपलाइन दूर से बेहतर है पटकथा पाइपलाइन । Declarative Pipeline स्क्रिप्ट-चरण का उपयोग करके स्क्रिप्टेड पाइपलाइन को सब कुछ निष्पादित करने में सक्षम है और इसमें बहुत सारी अतिरिक्त विशेषताएं हैं।

इसके अलावा घोषणात्मक पाइपलाइन जैसे विभिन्न प्रौद्योगिकियों के लिए समर्थन हासिल है डोकर या Kubernetes (देखें यहाँ )।

Declarative Pipeline अधिक भविष्य का प्रमाण है। यह अभी भी विकास में है और हाल ही में 2019 के अंत में नए शुरू किए गए मैट्रिक्स फीचर की तरह नई सुविधाएँ जोड़ी गई हैं।

tl; dr - Declarative पाइपलाइन सब कुछ स्क्रिप्टेड पाइपलाइन कर सकती है और इससे भी ज्यादा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.