জেনকিনসফাইলে (গ্রোভী) ভেরিয়েবল ব্যবহার করে শেল কমান্ডের আউটপুট কীভাবে পাব?


213

জেনকিনসফাইলে (গ্রোভী) আমার কাছে এরকম কিছু রয়েছে এবং পরে তথ্যটি ব্যবহার করার জন্য আমি স্ট্রাউড এবং প্রস্থান কোডটি একটি ভেরিয়েবলের মধ্যে রেকর্ড করতে চাই।

sh "ls -l"

আমি কীভাবে এটি করতে পারি, বিশেষত মনে হচ্ছে যে আপনি সত্যিকার অর্থে কোনও ধরণের গ্রোভি কোড চালাতে পারবেন না Jenkinsfile?



এর সম্ভাব্য
নকলটি কি

উত্তর:


390

পাইপলাইন shপদক্ষেপের সর্বশেষতম সংস্করণ আপনাকে নিম্নলিখিতটি করতে অনুমতি দেয়;

// Git committer email
GIT_COMMIT_EMAIL = sh (
    script: 'git --no-pager show -s --format=\'%ae\'',
    returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"

আর একটি বৈশিষ্ট্য হ'ল returnStatusবিকল্প।

// Test commit message for flags
BUILD_FULL = sh (
    script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
    returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"

এই সমস্যাগুলির ভিত্তিতে এই বিকল্পগুলি যুক্ত করা হয়েছে।

কমান্ডের জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন sh


11
দেখে মনে হচ্ছে এখন এটি নথিভুক্ত করা হয়েছে -> জেনকিনস.আইও
ডক /

যদিও "ওয়ার্স" উপসর্গটি নিয়ে আমার পক্ষে কাজ করে না। আমি যখন GIT_COMMIT_EMAIL প্রিফিক্স ব্যতীত ভের নাম হিসাবে ব্যবহার করি তখন সব ঠিক থাকে।
বাসটিয়ান ভয়েগ্ট

দয়া করে আমাকে
স্ট্যাকওভারফ্লো.

7
আমি যখন ঘোষিত জেনকিনসফাইল সিনট্যাক্স ব্যবহার করি তখন এটি কার্যকর হয় না, ত্রুটির বার্তাটি হ'ল:WorkflowScript: 97: Expected a step @ line 97, column 17.
রেঞ্চ

17
দেখে মনে হচ্ছে এটি কেবলমাত্র একটি scriptপদক্ষেপের ব্লকের ভিতরে কাজ করে । jenkins.io/doc/book/pipline/syntax/#declarative- stepsps
ব্রাস বানর

51

বর্তমান পাইপলাইন সংস্করণ স্থানীয়ভাবে সমর্থন করে returnStdoutএবং returnStatus, যা sh/ batপদক্ষেপগুলি থেকে আউটপুট বা স্থিতি পাওয়া সম্ভব করে ।

একটি উদাহরণ:

def ret = sh(script: 'uname', returnStdout: true)
println ret

একটি অফিসিয়াল ডকুমেন্টেশন


কেউ কি আমাকে স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 40946697/… জন্য সহায়তা করতে পারে ? আগাম ধন্যবাদ!
জিতেশ সোজিত্রা

2
বিবৃতিগুলি একটি script { }পদক্ষেপে আবৃত করা উচিত ।
x-yuri

40

দ্রুত উত্তরটি হ'ল:

sh "ls -l > commandResult"
result = readFile('commandResult').trim()

আমি মনে করি শ পদক্ষেপের ফলাফল পেতে সক্ষম হওয়ার জন্য একটি বৈশিষ্ট্য অনুরোধ উপস্থিত রয়েছে, তবে যতদূর আমি জানি, বর্তমানে অন্য কোনও বিকল্প নেই।

সম্পাদনা: জেনকিনস -26133

সম্পাদনা 2: কোন সংস্করণ থেকে পুরোপুরি নিশ্চিত নয়, তবে sh / bat পদক্ষেপগুলি এখন স্ট্যান্ড আউটপুটটি ফিরে আসতে পারে, কেবল:

def output = sh returnStdout: true, script: 'ls -l'

1
এছাড়াও এফওয়াইআই, ব্যাট স্টেপগুলি চালানো কমান্ডটির প্রতিধ্বনি দেয় যাতে আপনার আউটপুটটি পেতে উদ্বোধন করতে যেমন @ দিয়ে ব্যাট কমান্ড শুরু করতে হবে (উদাঃ "@ ডির")।
রাসেল গ্যালাপ

21

আপনি যদি স্টাডাউট পেতে চান এবং কমান্ডটি সফল হয়েছে কিনা তা জানতে চান, কেবলমাত্র returnStdoutএকটি ব্যতিক্রম হ্যান্ডেলারটিতে এটি ব্যবহার করুন এবং মোড়ক করুন:

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

try {
    // Fails with non-zero exit if dir1 does not exist
    def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
    println("Unable to read dir1: ${ex}")
}

আউটপুট :

[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2

দুর্ভাগ্যক্রমে হডসন.এবার্ট এক্সপ্লেশন সেই প্রস্থান স্থিতিটি পেতে কোনও কার্যকর পদ্ধতি অনুপস্থিত, সুতরাং যদি আসল মান প্রয়োজন হয় তবে আপনাকে বার্তাটি ছাড়িয়ে তা ছড়িয়ে দিতে হবে (উ!)

জাভাডোক https://javadoc.jenkins-ci.org/hudson/AbortException.html এর বিপরীতে এই ব্যতিক্রম ধরা পড়লে বিল্ডটি ব্যর্থ হয় না । ধরা না পড়লে ব্যর্থ হয় !

আপডেট: আপনিও যদি শেল কমান্ড থেকে এসটিডিআরআর আউটপুট চান, জেনকিনস দুর্ভাগ্যক্রমে সেই সাধারণ ব্যবহারের ক্ষেত্রে সঠিকভাবে সমর্থন করতে ব্যর্থ। একটি 2017 টিকিট জেনকিনস -৪৪৯৩০ কোনও সমাধানের দিকে অগ্রগতি না করে মতামতযুক্ত পিং-পং অবস্থায় আটকে আছে - দয়া করে এতে আপনার আপভোট যুক্ত করার বিষয়টি বিবেচনা করুন।

এখনই সমাধান হিসাবে , কয়েকটি সম্ভাব্য পন্থা থাকতে পারে:

ক) STDERR কে STDOUT এ পুনর্নির্দেশ করুন 2>&1 - তবে এটি মূল আউটপুটটি বাইরে রেখে পার্স করা আপনার পক্ষে, এবং কমান্ড ব্যর্থ হলে আপনি আউটপুট পাবেন না - কারণ আপনি ব্যতিক্রম হ্যান্ডলারটিতে রয়েছেন।

খ) এসটিডিআরআরকে একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করুন (যার নামটি আপনি আগে প্রস্তুত করেন) 2>filename(তবে পরে ফাইলটি পরিষ্কার করতে ভুলবেন না) - অর্থাৎ ie প্রধান কোড হয়ে যায়:

def stderrfile = 'stderr.out'
try {
    def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
    def errmsg = readFile(stderrfile)
    println("Unable to read dir1: ${ex} - ${errmsg}")
}

গ) অন্যভাবে যান, returnStatus=trueপরিবর্তে সেট করুন, ব্যতিক্রম হ্যান্ডলারের সাথে বিতরণ করুন এবং সর্বদা একটি ফাইলের আউটপুট ক্যাপচার করুন, যেমন:

def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
    // output is directory listing from stdout
} else {
    // output is error message from stderr
}

ক্যাভ্যাট: উপরের কোডটি ইউনিক্স / লিনাক্স-নির্দিষ্ট - উইন্ডোজের সম্পূর্ণ পৃথক শেল কমান্ড প্রয়োজন।


1
"ls: dir1 অ্যাক্সেস করতে পারে না: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" এবং "hudson.AbortException: স্ক্রিপ্ট ফেরত প্রস্থান কোড 2" হিসাবে আউটপুট পাওয়ার সুযোগ আছে কি?
ব্যবহারকারী 2988257

আমি কখনই এটি কাজ করতে পারে তা দেখছি না। আমার পরীক্ষায় আউটপুট পাঠ্য কখনই বরাদ্দ করা হয় না এবং এটি প্রত্যাশিত। শেল পদক্ষেপ থেকে নিক্ষিপ্ত ব্যতিক্রম ফেরতের মান বরাদ্দ করতে বাধা দেয়
জাকুব বোচেনস্কি

2
রিটার্নস্ট্যাটাস এবং রিটার্নস্টডআউট দুর্ভাগ্যক্রমে একই সময়ে কাজ করে না। এখানে টিকিট দেওয়া আছে। দয়া করে, ভোট দিন: ইস্যু.জেনকিনস-ci.org/ ব্রাউজ / জেনকিনস ৪৪৪০৩০
আলেকজান্ডার সাময়েলভ

1
@ আলেকজান্ডারসাময়লোভ উপরের বিকল্প (সি) হিসাবে আপনাকে একটি ফাইল ব্যবহার করে কাজ করতে হবে। দুর্ভাগ্যক্রমে এই সরঞ্জামগুলির লেখকরা প্রায়শই মতামতযুক্ত হন এবং অন্যান্য সাধারণ ব্যবহারের ক্ষেত্রে আগে ভাবেন না, 'শ' এখানে বিন্যাসের ক্ষেত্রে।
এড র্যান্ডাল

1
@ এড র‌্যান্ডাল, আপনার সাথে পুরোপুরি একমত .. এই কারণেই আমি এই সমস্যাটি পোস্ট করে আশা করি যে বড় সংখ্যক ভোটের কারণে তারা কিছু করতে শুরু করে।
আলেকজান্ডার সাময়লোভ

12

এটি একটি নমুনা কেস, যা আমি বিশ্বাস করি তা বোঝা যাবে!

node('master'){
    stage('stage1'){
    def commit = sh (returnStdout: true, script: '''echo hi
    echo bye | grep -o "e"
    date
    echo lol''').split()


    echo "${commit[-1]} "

    }
}

আমি উপায় জানি না তবে আপনার উত্তর আমাকে খুব সাহায্য করে, ধন্যবাদ :)
শাহরনাকশ

5

যাদের গ্রোভির পরিবর্তে পরবর্তী শেল কমান্ডগুলিতে আউটপুট ব্যবহার করা দরকার, তাদের উদাহরণের মতো এটি করা যেতে পারে:

    stage('Show Files') {
        environment {
          MY_FILES = sh(script: 'cd mydir && ls -l', returnStdout: true)
        }
        steps {
          sh '''
            echo "$MY_FILES"
          '''
        }
    }

আমি কোড মেভেনের উদাহরণগুলি বেশ কার্যকর বলে খুঁজে পেয়েছি ।


-6

সবচেয়ে সহজ উপায় এইভাবে ব্যবহার করা

my_var=`echo 2` echo $my_var আউটপুট: 2

নোট করুন যে সহজ একক উদ্ধৃতি হয় না পিছনে উদ্ধৃতি (`)।


উত্সাহিত, তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এটি দেখান যে এগুলি shঅন্যথায় আবৃত করা উচিত অন্যথায় লোকেরা এটি খাঁজু ভাবতে পারে, বিশেষত যদি তারা বাশ স্ক্রিপ্টিংয়ের সাথে পরিচিত না হয়। আমি জেনকিন্সের ls -lপরিবর্তে echo 2এটি ব্যবহার করে চেষ্টা করেছি এবং এটি কাজ করে। আমি আসলে এই পদ্ধতির আগে ব্যবহার করেছি, তবে বিকল্পের সন্ধান করছি কারণ এটি খুব নির্ভরযোগ্য নয়। আমার কাছে আরও জটিল কমান্ডের আউটপুট এইভাবে স্ট্যান্ডার্ড শেলের সাথে ক্যাপচার হয়েছে, তবে জেনকিন্সের কাছে পোর্ট করা shহলে ভেরিয়েবল কিছুই রাখে না, কোনও অজানা কারণে।
নাগেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.