জেনকিনস পাইপলাইন কাজের মধ্যে সমস্ত `env` সম্পত্তি কীভাবে তালিকাভুক্ত করবেন?


105

একটি জেনকিন্সকে দেওয়া 2.1 বিল্ড পাইপলাইন দেওয়া, জেনকিনস একটি envপরিবর্তনশীলকে ইনজেক্টে ইনজেক্ট করে node{}। উদাহরণস্বরূপ, এর BRANCH_NAMEসাথে অ্যাক্সেস করা যেতে পারে

node {
    echo ${env.BRANCH_NAME}
    ...

আমি জেনকিনস পাইপলাইনের মধ্যে সমস্ত env সম্পত্তি প্রতিধ্বনি করতে চাই

... তা বিবেচনা করে আমি সমস্ত বৈশিষ্ট্য সময়ের আগে জানি না ।

আমি কোড মত খুঁজছি

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

যা কিছু মত প্রতিধ্বনিত হবে

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env একটি মানচিত্র। আপনি কি সাধারণ পুনরাবৃত্তি চেষ্টা করেছেন? লাইক - env.each it এটি মুদ্রণ করুন}
জয়ন

3
সদৃশ মত দেখায় stackoverflow.com/questions/36836806/...
Krzysztof Krasoń

3
আফাইক এনভিভ সবেমাত্র পরিবেশের ভেরিয়েবলকে সজ্জিত করে। আমি মনে করি না আপনি এটি লুপ করতে পারেন। উইন্ডোতে লিনাক্স / 'ব্যাট সেট' এ 'শ এনভ' ব্যবহার করে দেখুন।
ডোমিনিক গ্যাভার্ট

1
নিচে আমার মন্তব্য অনুসারে @ রেনাতো @ জয়ান, env.each { name, value -> println "Name: $name -> Value $value" }প্রিন্ট করুন Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
জেমস থমাসমুন 1979 20

1
@ জেমস থমাস মুন ১৯৯৯ এর কারণ পাইপলাইন গ্রোভির বন্ধকে ভেঙেছে। আপনি যদি এটি পুরানো-জাভা শৈলীতে (যেমনটি new ClassName() { ... }) ঠিক করেন তবে এটি কাজ করা উচিত। অথবা আপনি এটিকে ট্যাগ করা পদ্ধতিতে চালান @NonCPS, তারপরে ক্লোজারগুলিও এর ভিতরে কাজ করবে।
ড্যানিয়েল সি

উত্তর:


87

আরেকটি, আরও সংক্ষিপ্ত উপায়:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

cf. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script


21
উইন্ডোজের shসাথে batএবং এর envসাথে প্রতিস্থাপন করুন set
jmkgreen

1
"Sh" মামলার জন্য আমি 'env' ব্যবহার করি সাজান 'কারণ এটি আমাকে পাগল করে তোলে যে এটি কী দ্বারা অর্ডার করা হয়নি।
জেফ হাটন

80

ঘোষিত পাইপলাইনের জন্য জেনকিন্স ডকুমেন্টেশন অনুসারে :

sh 'printenv'

জেনকিন্স স্ক্রিপ্টেড পাইপলাইনের জন্য :

echo sh(script: 'env|sort', returnStdout: true)

উপরেরগুলি সুবিধার্থে আপনার এনভির ভারসগুলিও বাছাই করে।


1
printenvএকটি শেল কমান্ড যা পরিবেশকে মুদ্রণ করে, জেনকিন্সের সাথে সুনির্দিষ্ট কিছু নয়। তর্ক ছাড়াই envএটি যুক্তি ছাড়াই সমান । আমি নিশ্চিত sh 'printenv | sort'যে ডিসিএল বা স্ক্রিপ্টেড পাইপলাইনে কাজ করবে।
সাইমন.ওয়াটস

পরীক্ষিত এবং sh 'printenv | sort'আসলে জেনকিন্স ঘোষিত পাইপলাইনের জন্য কাজ করে; fww sh 'env | sort'এছাড়াও কাজ করে (উভয় জেনকিন্স ভার্চ। 2.46.1 এ পরীক্ষিত)। আমি মূলত উল্লেখ করেছি sh 'printenv'কারণ এটি সরকারী জেনকিনস ডকুমেন্টেশনে উল্লেখ করা হয়েছিল।
উইমাইটেক

1
আপনি যদি রিটার্নসেটআউটটি হারান: সত্য তবে আপনার প্রতিধ্বনি লাগবে না; এটি কেবল শেল স্ক্রিপ্টটি ইতিমধ্যে মুদ্রিত যা মুদ্রণ করছে।
এড র্যান্ডাল

26

নিম্নলিখিত কাজগুলি:

@NonCPS
def printParams() {
  env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()

নোট করুন যে এটি সম্ভবত প্রথম সম্পাদনে ব্যর্থ হবে এবং জেনকিনস স্যান্ডবক্সে চালানোর জন্য আপনাকে বিভিন্ন গ্রোভি পদ্ধতিগুলি অনুমোদনের প্রয়োজন হবে। এটি "জেনকিনগুলি পরিচালনা করতে / প্রক্রিয়াটির স্ক্রিপ্ট অনুমোদনে" করা হয়

আমার যে তালিকাটি অন্তর্ভুক্ত হয়েছে তা:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • কাজের নাম
  • JOB_URL

1
এটি কাজ করে না:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
অক্টাভিয়ান

5
আপনি কি অন্তর্ভুক্ত নিশ্চিত করেছেন @NonCPS?
জো সি 20

1
এটি সেরা উত্তর কারণ এটি কোনও নোড ব্লকের বাইরে কাজ করবে । এই জন্য অনেক ধন্যবাদ.
Gi0rgi0s

15

আপনি sh/ batপদক্ষেপ ব্যবহার করে ফলাফলটি অর্জন করতে পারেন এবং readFile:

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

দুর্ভাগ্যক্রমে env.getEnvironment()পরিবেশের ভেরিয়েবলের সীমিত মানচিত্র ফেরত দেয়।


1
sh 'env > env.txt'ভাল কাজ করে এবং শেল প্রক্রিয়া দ্বারা নির্মিত পরিবেশের ভেরিয়েবল অন্তর্ভুক্ত। env.getEnvironment()কেবল জেনকিন্স সেট পরিবেশের ভেরিয়েবলগুলি দেখায় যা sh 'env'কৌশলতে দেখা একটি উপসেট । এছাড়াও, এটির স্ক্রিপ্ট সুরক্ষার অনুমোদন প্রয়োজন method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironmentenv.each { name, value -> println "Name: $name -> Value $value" }@Renato @Jayan দ্বারা বাঞ্ছনীয় শুধুমাত্র ছাপে Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
জেমস থমাসমুন 1979 21

নিস !!! সমস্ত এনভ ভার্সার মুদ্রণ করতে সক্ষম হওয়ায় আমাকে আবিষ্কার করতে সহায়তা করে যে জেনকিনস 2 একটি JOB_BASE_NAME ভেরি সেট করে যাব নামটির যে ফোল্ডারে এটি বসবাস করে তার মধ্যে রয়েছে
বিল এজী

উইন্ডোতে কাজ করে এমন একটি সংস্করণও দুর্দান্ত থাকবে :)
বাস হামার

উইন্ডোজ সংস্করণের জন্য @ বাস হামার "sh" "ব্যাট" দ্বারা প্রতিস্থাপন করার চেষ্টা করুন
সেবাস্তিয়ান

2
Java.lang.UnsupportedOperationException আমাকে একটি ত্রুটি দেয়: একটি সিপিএস-রুপান্তরিত বন্ধে পাবলিক স্ট্যাটিক java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) কল করা যায় না এখনও সমর্থিত (JENKINS-26481); @ ননসিপিএস পদ্ধতিতে এনক্যাপসুলেট করুন, বা জাভা-স্টাইলের লুপগুলি ব্যবহার করুন
বেন ম্যাথিউজ

12

এত জটিলতা কেন?

sh 'env'

আপনার যা প্রয়োজন তা করেন (* নিক্সের অধীনে)


এটি কার্যকর করতে একটি নোড ব্লক প্রয়োজন। আমার ব্যবহারের ক্ষেত্রে আমাকে নোডের কী পরিবেশ করবে তার নির্দিষ্ট প্রক্রিয়াগুলির উপর ভিত্তি করে নোড স্পিন আপ করতে হবে তা প্রক্রিয়া করা দরকার।
বিল ওয়ার্নার

10

এখানে একটি দ্রুত স্ক্রিপ্ট আপনি সমস্ত পরিবেশের ভেরিয়েবল তালিকাভুক্ত করতে পাইপলাইন কাজ হিসাবে যুক্ত করতে পারেন:

node {
    echo(env.getEnvironment().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
    echo(System.getenv().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
}

এটি সিস্টেম এবং জেনকিনস উভয় ভেরিয়েবলের তালিকা তৈরি করবে।


9

সমস্ত পরিবেশের ভেরিয়েবল তালিকাভুক্ত করার ক্রস প্ল্যাটফর্মের উপায়:

if (isUnix()) {
    sh env
}
else {
    bat set
}

7

আমি নীল মহাসাগর প্লাগইন ব্যবহার করি এবং প্রতিটি পরিবেশ প্রবেশের নিজস্ব ব্লক পেতে পছন্দ করি না। আমি সব লাইন সহ একটি ব্লক চাই ।

প্রিন্টগুলি খারাপভাবে:

sh 'echo `env`'

প্রিন্টগুলি খারাপভাবে:

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

ভালভাবে মুদ্রণ:

sh 'env > env.txt'
sh 'cat env.txt'

ভাল ছাপে: (@mjfroehlich উল্লেখ হিসাবে)

echo sh(script: 'env', returnStdout: true)

3

উপরের উত্তরগুলি, এখন নতুন পাইপলাইন সিনট্যাক্সের কারণে পুরানো। নীচে পরিবেশের ভেরিয়েবল প্রিন্ট করে।

script {
        sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")

        for(String vars: envs){
            println(vars)
        }
    }

1
1. আপনার এটি একটি স্ক্রিপ্ট ব্লকে থাকা দরকার। ২. তারা 'গ্রোভী স্টাইল' লুপকে অবমূল্যায়ন করছে।
এডি

forএকটি বন্ধ সঙ্গে আরো একটি ছাড়া সমস্যার সৃষ্টি হবে @NonCPSটীকা।
অনুপ্রেরণা দিন

2

বিশুদ্ধ খাঁজকাটা সমাধান যে বিশ্ব পড়া envপরিবর্তনশীল সব এনভায়রনমেন্ট ভেরিয়েবল প্রিন্ট না (যেমন তারা ভেরিয়েবল অনুপস্থিত environmentব্লক থেকে, withEnvপ্রসঙ্গ ওএস থেকে মেশিন-নির্দিষ্ট ভেরিয়েবল অধিকাংশ এবং)। শেল স্টেপগুলি ব্যবহার করে আরও সম্পূর্ণ সেট পাওয়া সম্ভব, তবে এর জন্য একটি nodeপ্রসঙ্গ প্রয়োজন , যা সর্বদা চাওয়া হয় না।

এখানে একটি সমাধান যা getContextবর্তমান প্রসঙ্গে পাইপলাইন প্যারামিটার সহ পরিবেশের ভেরিয়েবলগুলির সম্পূর্ণ সেটটি পুনরুদ্ধার এবং মুদ্রণের জন্য পদক্ষেপটি ব্যবহার করে।

ক্যাভ্যাট: গ্রোভি স্যান্ডবক্সে কাজ করে না। আপনি এটি যদিও কোনও বিশ্বস্ত ভাগ করা লাইব্রেরি থেকে ব্যবহার করতে পারেন।

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')

1

আপনি যদি সত্যিই envতালিকার বাইরে চলে যেতে চান তবে কেবল করুন:

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}

0

প্রশ্নে উল্লিখিত আউটপুটটি পাওয়ার আরও একটি উপায়:

envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    println envvar[0]+" is "+envvar[1]
}

এটি সহজেই মানদণ্ডের সাথে মিলিত এনভ ভার্সের উপসেট সহ একটি মানচিত্র তৈরি করতে বাড়ানো যেতে পারে:

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    if (envvar[0].startsWith("GERRIT_"))
        envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}

0

আমি মনে করি যে স্ক্রিপ্ট আকারে আপনার এটির প্রয়োজন ছিল, তবে অন্য কেউ যদি জেনকিনস জিইউআইয়ের মাধ্যমে সন্ধান করতে চান, তবে প্রতিটি বিল্ডের প্রাসঙ্গিক বাম মেনুতে "পরিবেশগত পরিবর্তনগুলি" বিভাগটি নির্বাচন করে সেই তালিকাটি পাওয়া যাবে = > বিল্ড => পরিবেশ পরিবর্তনশীল নির্বাচন করুন

এখানে চিত্র বর্ণনা লিখুন


2
এটি সর্বদা পাওয়া যায় না।
shuckc

1
আমি মনে করি না এটি জেনকিনসফাইলে মোটেই উপলব্ধ। স্ক্রিনশটটি একটি ফ্রিস্টাইল বিল্ডের মতো দেখাচ্ছে।
জাকুব বোচেনস্কি

0

আমি এটি সবচেয়ে সহজ উপায় খুঁজে পেয়েছি:

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}

-1

আপনি আপনার জেনকিন্স উদাহরণ থেকে সমস্ত ভেরিয়েবল পেতে পারেন। শুধু দেখুন:

  • $ {Jenkins_host} /env-vars.html
  • $ {Jenkins_host} / পাইপলাইন-সিনট্যাক্স / globals
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.