Có thể nắm bắt stdout từ lệnh sh DSL trong đường ống không


92

Ví dụ:

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

Tôi sẽ nhận:

output=0

Vì vậy, rõ ràng là tôi nhận được mã thoát chứ không phải là stdout. Có thể nắm bắt stdout thành một biến đường ống, như vậy tôi có thể nhận được: output=foo như kết quả của tôi không?

Câu trả lời:


227

Bây giờ , shbước này hỗ trợ trả về stdout bằng cách cung cấp tham số 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)

Hãy xem ví dụ này .


10
lưu ý các .trim()phần của câu trả lời này, nếu không bạn có thể có được một ký tự xuống dòng ở cuối dòng
Will Munn

2
chắp thêm --shortvào rev-parsecó thể chỉ trực tiếp lấy một mã băm ngắn
Leon

không chắc chắn những gì gây ra thất bại nhưng tôi đã phải chuyển đổi đầu ra cho chuỗi cũng như thế nàygitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').toString().trim()
Balkrishna

xin chào, '.take (6)' là viết tắt của gì?
Vano

1
@Vano đề cập đến phương thức Groovy take (), sẽ nhận được 6 ký tự đầu tiên trong trường hợp này. docs.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/…
ahillman3

47

Lưu ý: Vấn đề Jenkins được liên kết đã được giải quyết.

Như đã đề cập trong JENKINS-26133 , không thể lấy đầu ra shell dưới dạng một biến. Như một giải pháp được đề xuất sử dụng tính năng ghi đọc từ tệp tạm thời. Vì vậy, ví dụ của bạn sẽ trông giống như:

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

21
Đối với người mới, vui lòng xem câu trả lời stackoverflow.com/a/38912813/345845 bên dưới, điều này đã được thực hiện dễ dàng hơn với returnStdoutthông số mới được chuyển đến shbước.
Baptiste Mathus

2
"không thể lấy đầu ra shell dưới dạng một biến" - không đúng. Đây là một bản hack, câu trả lời chính xác là returnStdout.
Graham

4
Thời gian duy nhất này thực sự là một câu trả lời tốt là nếu bạn cần cả sự stdoutexit statustừ lệnh shell. Những lần khác, hãy sử dụng returnStdouttham số.
Simon Forsberg

4

Thử đi:

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
    ...
}

Đã thử nghiệm trên:

  • Jenkins ver. 2.19.1
  • Đường ống 2.4

3

Bạn cũng có thể thử sử dụng các chức năng này để nắm bắt StdErr StdOut và trả về mã.

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

1

Một phiên bản ngắn sẽ là:

echo sh(script: 'ls -al', returnStdout: true).result


0

Tôi đã gặp vấn đề tương tự và đã thử hầu hết mọi thứ sau đó tìm thấy sau khi tôi biết rằng tôi đã thử nó không đúng khối. Tôi đã thử nó trong khối bước trong khi nó cần phải ở khối môi trường.

        stage('Release') {
                    environment {
                            my_var = sh(script: "/bin/bash ${assign_version} || ls ", , returnStdout: true).trim()
                                }
                    steps {                                 
                            println my_var
                            }
                }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.