পাইপলাইনে sh DSL কমান্ড থেকে স্ট্যান্ডআউট ক্যাপচার করা কি সম্ভব?


92

উদাহরণ স্বরূপ:

var output=sh "echo foo";
echo "output=$output";

আমি পাবো:

output=0

সুতরাং, স্পষ্টতই আমি স্টডআউটের পরিবর্তে প্রস্থান কোডটি পাই। পাইপলাইন ভেরিয়েবলে স্টাডাউটটি ক্যাপচার করা কী সম্ভব, যেমনটি আমি পেতে পারি: output=foo আমার ফলাফল হিসাবে?

উত্তর:


227

এখন , shপদক্ষেপটি প্যারামিটার সরবরাহ করে stdout ফেরত সমর্থন করে returnStdout

// These should all be performed at the point where you've
// checked out your sources on the slave. A 'git' executable
// must be available.
// Most typical, if you're not cloning into a sub directory
gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
// short SHA, possibly better for chat notifications, etc.
shortCommit = gitCommit.take(6)

এই উদাহরণটি দেখুন ।


10
.trim()এই উত্তরের অংশটি নোট করুন , অন্যথায় আপনি লাইনের শেষে একটি নতুন লাইন চরিত্র পেতে পারেন
মুন

4
পরিশেষে যোগ --shortকরার rev-parseকরতে পারেন সরাসরি অল্প হ্যাশ প্রাপ্ত
লিওন

ব্যর্থতার কারণ কী তা নিশ্চিত নয় তবে আমাকে আউটপুটটিকেও স্ট্রিংয়ে রূপান্তর করতে হয়েছিলgitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').toString().trim()
বালকৃষ্ণ

হাই, '.টাকে (6)' বলতে কী বোঝায়?
ভানো

4
গ্রোভি পদ্ধতির জন্য নির্দেশিত @ ভ্যানো () গ্রহণ করে, যা এই ক্ষেত্রে প্রথম characters টি অক্ষর পাবে। ডকস.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/…
আহিলম্যান 3

47

দ্রষ্টব্য: লিঙ্কযুক্ত জেনকিনস ইস্যুটি তখন থেকেই সমাধান হয়েছে।

জেনকিনস -২13১৩৩ তে উল্লিখিত হিসাবে ভেরিয়েবল হিসাবে শেল আউটপুট পাওয়া সম্ভব ছিল না। অস্থায়ী ফাইল থেকে রিট-রিড ব্যবহার করার পরামর্শ দেওয়া হয়েছে। সুতরাং, আপনার উদাহরণটি দেখতে এমন হত:

sh "echo foo > result";
def output=readFile('result').trim()
echo "output=$output";

21
নতুনদের জন্য, দয়া করে নীচের উত্তরটি stackoverflow.com/a/38912813/345845 দেখুন, যেহেতু নতুন returnStdoutপ্যারামিটারটি shধাপে যাওয়ার পরে এটি সহজ হয়েছে ।
ব্যাপটিস্ট ম্যাথুস

4
"ভেরিয়েবল হিসাবে শেল আউটপুট পাওয়া সম্ভব নয়" - সত্য নয়। এটি হ্যাক, সঠিক উত্তরটি রিটার্নস্টটআউট out
গ্রাহাম

4
শুধুমাত্র সময় আসলে এই একটি ভাল উত্তর হলে আপনার প্রয়োজন হয় উভয়stdout এবং exit statusশেল কমান্ড থেকে। অন্যান্য সময়, returnStdoutপ্যারামিটার ব্যবহার করুন ।
সাইমন ফারসবার্গ

4

এটা চেষ্টা কর:

def get_git_sha(git_dir='') {
    dir(git_dir) {
        return sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
    }
}

node(BUILD_NODE) {
    ...
    repo_SHA = get_git_sha('src/FooBar.git')
    echo repo_SHA
    ...
}

পরীক্ষিত:

  • জেনকিন্স ভার 2.19.1
  • পাইপলাইন 2.4

3

আপনি StdErr StdOut ক্যাপচার এবং রিটার্ন কোডটি এই ফাংশনগুলি পাশাপাশি ব্যবহার করার চেষ্টা করতে পারেন।

def runShell(String command){
    def responseCode = sh returnStatus: true, script: "${command} &> tmp.txt" 
    def output =  readFile(file: "tmp.txt")

    if (responseCode != 0){
      println "[ERROR] ${output}"
      throw new Exception("${output}")
    }else{
      return "${output}"
    }
}

বিজ্ঞপ্তি:

&>name means 1>name 2>name -- redirect stdout and stderr to the file name



0

আমি একই সমস্যাটি পেয়েছিলাম এবং প্রায় সবই চেষ্টা করেছিলাম তখন আমি জানতে পেরেছিলাম যে আমি এটি ভুল ব্লকে চেষ্টা করছি। আমি এটি স্টেপস ব্লকে চেষ্টা করছি যেখানে এটি পরিবেশ ব্লকে থাকা দরকার।

        stage('Release') {
                    environment {
                            my_var = sh(script: "/bin/bash ${assign_version} || ls ", , returnStdout: true).trim()
                                }
                    steps {                                 
                            println my_var
                            }
                }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.