জেনকিনস: পাইপলাইন পর্যায়ে পরিবর্তনশীল সংজ্ঞায়িত করা যায় না


106

আমি একটি ঘোষিত জেনকিনস পাইপলাইন স্ক্রিপ্ট তৈরি করার চেষ্টা করছি তবে সাধারণ ভেরিয়েবল ঘোষণার সাথে সমস্যা রয়েছে।

আমার লিপিটি এখানে:

pipeline {
   agent none
   stages {
       stage("first") {
           def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
           sh "echo ${foo}"
       }
   }
}

তবে, আমি এই ত্রুটিটি পেয়েছি:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^

আমি জেনকিন্স ২.7.৪ এবং পাইপলাইন ২.৪ এ আছি।

উত্তর:


101

জেনকিনস পাইপলাইনের জন্য ঘোষিত মডেলটিতে সিনট্যাক্সের একটি সীমিত উপসেট রয়েছে যা এটি stageব্লকগুলিতে অনুমতি দেয় - আরও তথ্যের জন্য সিনট্যাক্স গাইডটি দেখুন । আপনি আপনার পদক্ষেপগুলিকে একটি script { ... }ব্লকে মোড়ানো দ্বারা এই সীমাবদ্ধতাটিকে বাইপাস করতে পারেন , তবে ফলস্বরূপ, আপনি scriptব্লকের মধ্যে সিনট্যাক্স, পরামিতি ইত্যাদির বৈধতা হারাবেন ।


5
আমি যদি স্ক্রিপ্ট ব্লকের বাইরে সেই পরিবর্তনশীলটি ব্যবহার করতে চাই?
জান স্টেঙ্ক

3
স্ক্রিপ্ট ব্লকের বাইরে ভেরিয়েবল ব্যবহারের জন্য এই স্ট্যাকওভারফ্লো.com
জিজ্ঞাসাগুলি /

56

আমি মনে করি ত্রুটি নির্দিষ্ট রেখা থেকে আসছে না তবে প্রথম 3 লাইন থেকে আসছে। পরিবর্তে এটি চেষ্টা করুন:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}

আমি মনে করি আপনার কাছে কিছু অতিরিক্ত লাইন রয়েছে যা বৈধ নয় ...

সম্পাদনা

ঘোষিত পাইপলাইনের মডেল ডকুমেন্টেশন থেকে মনে environmentহয় আপনার ভেরিয়েবলগুলি ঘোষণার জন্য আপনাকে একটি ডিক্লেয়ারেশন ব্লক ব্যবহার করতে হবে , যেমন:

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}

1
আপনি একটি পর্যায়ে একটি পরিবেশের ব্লকও যুক্ত করতে পারেন (উদাহরণস্বরূপ যদি আপনার ভেরিয়েবলটি কোনও পূর্ববর্তী পদক্ষেপের কোনও কিছুর উপর নির্ভর করে)।
তেরেজা টমকোভা

34

@ পোম 12, @ বায়ের সাথে সম্মত হন উত্তরটি সম্পূর্ণ করতে আপনাকে স্ক্রিপ্ট ব্লক যুক্ত করতে হবে

এরকম কিছু চেষ্টা করুন:

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME}"
    }

    // ----------------

    stages {
        stage('Build Container') {
            steps {
                echo 'Building Container..'

                script {
                    if (ENVIRONMENT_NAME == 'development') {
                        ENV_NAME = 'Development'
                    } else if (ENVIRONMENT_NAME == 'release') {
                        ENV_NAME = 'Production'
                    }
                }
                echo 'Building Branch: ' + env.BRANCH_NAME
                echo 'Build Number: ' + env.BUILD_NUMBER
                echo 'Building Environment: ' + ENV_NAME

                echo "Running your service with environemnt ${ENV_NAME} now"
            }
        }
    }
}

4
লক্ষ্য করুন যে এই উদাহরণটি ধরে নিয়েছে যে ইতিমধ্যে একটি সংজ্ঞায়িত পরিবেশ পরিবর্তনশীল "ENVIRONMENT_NAME" জেনকিন্সে অ্যাক্সেসযোগ্য is
আলবার্তো

1
স্ক্রিপ্ট ব্লক পরিবেশের মান পরিবর্তন করতে পারে?
পিচব্ল্যাক 408

হ্যাঁ, আপনি ডি স্ক্রিপ্ট ব্লকের মধ্যে পরিবেশের মানটি পরিবর্তন করতে পারেন।
নিকোপেজ

8

জেনকিন্স 2.138.3 এ দুটি ভিন্ন ধরণের পাইপলাইন রয়েছে।

ঘোষণামূলক এবং স্ক্রিপ্টড পাইপলাইন।

"ডিক্লারেটিভ পাইপলাইনগুলি পাইপলাইন ডিএসএল-এর একটি নতুন এক্সটেনশন (এটি মূলত কেবলমাত্র এক ধাপের পাইপলাইন স্ক্রিপ্ট, আর্গুমেন্টগুলির সাথে একটি পাইপলাইন ধাপ (ডাইরেক্টিভ নামে পরিচিত), এই নির্দেশাবলীর একটি নির্দিষ্ট বাক্য গঠন অনুসরণ করা উচিত this এই নতুন ফর্ম্যাটের মূল বিষয়টি এটি হ'ল) আরও কঠোর এবং তাই সেই নতুন পাইপলাইনগুলির পক্ষে সহজ হওয়া উচিত, গ্রাফিকাল সম্পাদনার অনুমতি দেওয়া এবং আরও অনেক কিছু sc

জেনকিনস পাইপলাইন: এজেন্ট বনাম নোড?

এখানে ডিক্লারেটিভ পাইপলাইনে পরিবেশ এবং বৈশ্বিক ভেরিয়েবলগুলি ব্যবহার করার একটি উদাহরণ। আমি যা বলতে পারি পরিবেশগত সেগুলি স্থির হওয়ার পরে স্থির।

def  browser = 'Unknown'

pipeline {
    agent any
    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()


    }
    stages {
        stage('Example') {
            steps {
                script {
                    browser = sh(returnStdout: true, script: 'echo Chrome')
                }
            }
        }
        stage('SNAPSHOT') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "SNAPSHOT"
                    echo "${browser}"
                }
            }
            stage('RELEASE') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "RELEASE"
                    echo "${browser}"
                }
            }
    }//end of stages 
}//end of pipeline

উপরের কোড থেকে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: [পাইপলাইন] পাইপলাইন শুরু [পাইপলাইন] পঠন মেনপোম [পাইপলাইন] পাইপলাইন org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: প্রাসঙ্গিক শ্রেণি হাডসন অনুপস্থিত সম্ভবত অনুভূত আপনি ভুলে গেছেন একটি পদক্ষেপ সহ কোড যা এটি সরবরাহ করে, যেমন: নোড
মানকোক্যাপ্যাক

না, এটি যেমন কাজ করেছে এটি একটি ঘোষিত পাইপলাইন। এজেন্টের কোনও উপায়ে এটি কোনও নোডে কাজ করতে পারে
পিচব্ল্যাক 408

@ পিচব্ল্যাক ৪০৮, আপনি ঠিক বলেছেন আমার পাইপলাইনের শীর্ষে আমার [এজেন্ট কেউ নেই] ছিল। আপনি কী বলতে চাইছেন তা নিশ্চিত নন: সেগুলি সেট আপ হওয়ার পরে পরিবেশ স্থির হয়? এগুলিকে কোনও স্ক্রিপ্টের মধ্যে পরিবর্তন করা যেতে পারে, যেমন স্ক্রিপ্ট {IMAGE = "newVal}
mancocapac

উদাহরণস্বরূপ, চিত্র দেখুন। এটি পরিবর্তনশীল নয় যা পাইপলাইনগুলির দ্বারা পরিবর্তন করা যেতে পারে বা করা উচিত। এটি আমার বোঝার বিষয় যে এটি পরিবেশের অংশ হিসাবে সংজ্ঞার পরে স্থির মান হিসাবে বিবেচিত হবে।
পিচব্ল্যাক 408

0

আপনি একটি ঘোষিত পাইপলাইন ব্যবহার করছেন যা গ্রোভি কোড কার্যকর করতে স্ক্রিপ্ট-পদক্ষেপের প্রয়োজন step স্ক্রিপ্টেড পাইপলাইনের তুলনায় এটি একটি বিশাল পার্থক্য যেখানে এটি প্রয়োজনীয় নয়।

সরকারী ডকুমেন্টেশন নিম্নলিখিত বলেছেন:

স্ক্রিপ্ট পদক্ষেপটি স্ক্রিপ্টেড পাইপলাইনের একটি ব্লক নেয় এবং এটি ডিক্লারেটিভ পাইপলাইনে কার্যকর করে।

pipeline {
   agent none
   stages {
       stage("first") {
           script {
               def foo = "foo" 
               sh "echo ${foo}"
           }
       }
   }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.