2017-03-02 49 views
6

Tôi đang sử dụng một Jenkinsfile trong một đường ống dẫn trên phiên bản 2.32.2.Đường ống Jenkins sh dường như không tôn trọng đường ống trong lệnh shell

Vì nhiều lý do tôi muốn trích xuất chuỗi phiên bản từ pom. Tôi đã hy vọng tôi sẽ không phải thêm các plugin trợ giúp maven và sử dụng đánh giá.

Tôi nhanh chóng đưa ra một biểu thức nhỏ để có được nó ra khỏi pom sử dụng đường ống và hoạt động trên dòng lệnh trong không gian làm việc jenkins trên người thực thi.

$ sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g' 1.0.0-SNAPSHOT

Nó có thể có thể được tối ưu hóa, nhưng tôi muốn hiểu lý do tại sao các đường ống dẫn có vẻ là không vào lệnh sh máy. Tôi đã chơi với các định dạng chuỗi khác nhau và hiện đang sử dụng chuỗi đô la slashy.

Bước đường ống trông giống như sau để cho phép đầu ra dễ dàng của chuỗi lệnh:

script { 
    def ver_script = $/sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g'/$ 
    echo "${ver_script}" 
    POM_VERSION = sh(script: "${ver_script}", returnStdout: true) 
    echo "${POM_VERSION}" 
} 

Khi chạy trong các đường ống Jenkins tôi nhận được đầu ra giao diện điều khiển sau đây có vẻ như được tách các lệnh bằng đường ống vào các lệnh riêng biệt:

[Pipeline] script 
[Pipeline] { 
[Pipeline] echo 
sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g' 
[Pipeline] sh 
[FRA-198-versioned-artifacts-44SD6DBQOGOI54UEF7NYE4ECARE7RMF7VQYXDPBVFOHS5CMSTFLA] Running shell script 
+ sed -n /<version>/,/<version/p pom.xml 
+ head -1 
+ sed s/[[:blank:]]*<\/*version>//g 
sed: couldn't write 89 items to stdout: Broken pipe 
[Pipeline] } 
[Pipeline] // script 

Bất kỳ hướng dẫn nào về cách sử dụng đúng cách lệnh đường ống trong tệp jenkinsfile?

Trả lời

4

Cuối cùng tôi đã suy nghĩ một chút về nó và nhận ra rằng các vỏ bọc ống có thể gây ra vấn đề. Tôi biết một số trong những tệ nạn của eval nhưng tôi đã kết thúc wrappping này trong một eval:

script { 
    def ver_script = $/eval "sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g'"/$ 
    echo "${ver_script}" 
    POM_VERSION = sh(script: "${ver_script}", returnStdout: true) 
    echo "${POM_VERSION}" 
} 
0

Tôi cũng đang gặp khó khăn với việc sử dụng ống bên trong đường ống Jenkins của tôi, nhưng như một mặt lưu ý, nếu bạn muốn có một cách đơn giản để trích xuất các phiên bản của một pom maven, đây là một trong rất sạch tôi tìm thấy trong bài khác và rằng tôi đang sử dụng:

stage('Preparation') { 
version = getVersion() 
print "version : " + version 
} 
def getVersion() { 
    def matcher = readFile('pom.xml') =~ '<version>(.+)</version>' 
    matcher ? matcher[0][1] : null 
} 

mang đến cho bạn:

[Pipeline] echo 
releaseVersion : 0.1.24 
[Pipeline] sh 
+0

Không cần phải làm điều đó nữa. Xem câu trả lời của tôi bằng cách sử dụng bước 'readMavenPom'. – StephenKing

+0

Tuyệt vời! Tôi sẽ sử dụng nó ngay lập tức. Cảm ơn – mattvbv

0

các pipeline-utility-steps Plugin ngày nay s bao gồm một bước readMavenPom, cho phép truy cập phiên bản như sau:

version = readMavenPom.getVersion() 
+0

Cảm ơn, con trỏ tuyệt vời để hoàn thành mục tiêu cuối cùng, nhưng tôi thường tò mò về hành vi của đường ống trong các bước sh. Đã cho tôi một phút để suy nghĩ về việc bắn phá phụ và không phải là một hình ảnh mà tôi đã đề cập trong tài liệu hoặc xảy ra với tôi ngay lập tức khi cố gắng làm các bước sh nhanh chóng và bẩn thỉu. – sporkthrower

Các vấn đề liên quan