2017-03-02 22 views
6

में पाइप का सम्मान नहीं करता प्रतीत होता है मैं संस्करण 2.32.2 पर एक पाइपलाइन में जेनकिन्सफाइल का उपयोग कर रहा हूं।जेनकींस पाइपलाइन sh खोल कमांड

विभिन्न कारणों से मैं पोम से संस्करण स्ट्रिंग निकालना चाहता हूं। मैं उम्मीद कर रहा था कि मुझे मेवेन हेल्प प्लगइन जोड़ने और मूल्यांकन का उपयोग करने की आवश्यकता नहीं है।

मैं तुरंत पोम से बाहर निकलने के लिए थोड़ा सा अभिव्यक्ति के साथ आया जो निष्पादक पर जेनकिंस वर्कस्पेस में कमांडलाइन पर पाइप और काम करता है।

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

यह शायद अनुकूलित किया जा सकता है, लेकिन मैं समझने के लिए क्यों पाइपलाइन पाइप श आदेशों पर विफल रहने के किया जा रहा है चाहता हूँ। मैंने विभिन्न स्ट्रिंग प्रारूपों के साथ खेला है और वर्तमान में एक डॉलर स्लैश स्ट्रिंग का उपयोग कर रहा हूं।

पाइपलाइन कदम कमांड स्ट्रिंग की आसान उत्पादन के लिए अनुमति देने के लिए ऐसा दिखाई देता है:

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

जब जेनकींस पाइपलाइन मैं निम्नलिखित सांत्वना उत्पादन जहां इसे में पाइप्ड आदेशों को अलग किया जा रहा है मिल में चला अलग-अलग कमांड:

[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 

जेनकिन्सफाइल में पाइप किए गए कमांड का सही तरीके से उपयोग करने के तरीके पर कोई मार्गदर्शन क्या है?

उत्तर

4

मैंने अंततः इसमें कुछ विचार डाला और महसूस किया कि पाइप सबहेल शायद इस मुद्दे को जन्म दे रहे हैं। मैं eval की बुराइयों में से कुछ पता है, लेकिन मैं एक eval में इस wrappping समाप्त हो गया:

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

मैं अपने जेनकींस पाइप लाइन के अंदर लेकिन एक पक्ष नोट के रूप में पाइप के उपयोग के साथ संघर्ष कर रहा हूँ, यदि आप एक आसान तरीका चाहते हैं एक Maven पोम के संस्करण निकालने के लिए, यहाँ एक बहुत साफ एक मैं एक और पोस्ट में पाया है और यह है कि मैं उपयोग कर रहा हूँ:

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

ऐसी कोई चीज़ नहीं है। 'ReadMavenPom' चरण का उपयोग करके मेरा जवाब देखें। – StephenKing

+0

बढ़िया! मैं तुरंत इसका उपयोग करूंगा। धन्यवाद – mattvbv

0

pipeline-utility-steps प्लगइन अब का:

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

आप देता है एस में readMavenPom चरण शामिल है, जो निम्न संस्करण को निम्न तक पहुंचने की अनुमति देता है:

version = readMavenPom.getVersion() 
+0

धन्यवाद, अंतिम लक्ष्य पूरा करने के लिए महान सूचक, लेकिन मैं आमतौर पर sh चरणों में पाइप के व्यवहार के बारे में उत्सुक था। उप-शेलिंग के बारे में सोचने के लिए मुझे एक मिनट लगा और न कि गॉचा में मैंने देखा कि डॉक्स में उल्लेख किया गया था या त्वरित और गंदे sh कदम करने की कोशिश करते समय तुरंत मेरे पास हुआ था। – sporkthrower

संबंधित मुद्दे