2012-03-27 15 views
44

क्या कोई तरीका है कि जेनकिंस बिल्ड पीओएम को संसाधित करने के बाद एक परियोजना के मेवेन संस्करण संख्या से अवगत हो सकता है?जेनकींस में मेवेन संस्करण प्राप्त करना

मुझे कुछ परियोजनाएं मिली हैं जहां संस्करण मेवेन द्वारा नियंत्रित किया जाता है, और एक पोस्ट-बिल्ड जॉब में हम एक डेबियन पैकेज बनाना चाहते हैं और कुछ खोल स्क्रिप्ट को कॉल करना चाहते हैं। मुझे जो संस्करण चाहिए वह संस्करण संख्या के लिए है जो मैवेन जेनकींस पर्यावरण चर के रूप में उपलब्ध होता था, इसलिए मैं इसे पोस्ट-बिल्ड क्रियाओं में भेज सकता हूं।

स्पष्ट होने के लिए, मैं जानना चाहता हूं कि जेनकिन्स को मेवेन में संस्करण संख्या पास करने के तरीके को कैसे प्राप्त किया जाए; इसके बजाय मैं चाहता हूं कि मैवेन जेनकिन्स को संस्करण संख्या पास कर दें!

+0

बस एक सुझाव: इस बारे में क्या: http://mojo.codehaus.org/deb-maven-plugin/ – khmarbaise

उत्तर

21

चारों ओर से खुदाई का एक बहुत बाद (मैं कभी नहीं पता चला कि खराब से प्रलेखित जेनकींस है!) मैं एक काफी तुच्छ समाधान मिल गया।

  1. स्थापित ग्रूवी प्लगइन
  2. ग्रूवी की निम्नलिखित स्निपेट में प्रकार के अपने Maven निर्माण करने के लिए एक Post Step जोड़े Execute **system** Groovy script
  3. पेस्ट:

स्क्रिप्ट:

import hudson.model.*; 
import hudson.util.*; 

def thr = Thread.currentThread(); 
def currentBuild = thr?.executable; 
def mavenVer = currentBuild.getParent().getModules().toArray()[0].getVersion(); 
def newParamAction = new hudson.model.ParametersAction(new hudson.model.StringParameterValue("MAVEN_VERSION", mavenVer)); 
currentBuild.addAction(newParamAction); 

निर्माण पर्यावरण परिवर्तक कहा जाता है MAVEN_VERSION अब सामान्य रूप से अन्य पोस्ट-बिल्ड चरणों में प्रतिस्थापन के लिए उपलब्ध होगा (${MAVEN_VERSION})। मैं इसे अन्य चीजों के साथ गिट टैगिंग के लिए उपयोग कर रहा हूं।

+2

यह एक आकर्षण की तरह काम करता है, अगर आप अपने [बाद में फॉलोअप] में क्या है 'def mavenVer = 'line को अपडेट करें) (http://stackoverflow.com/a/10205702/487663) -' def mavenVer = currentBuild.getParent() .getModules()। toArray() [0] .getVersion(); ' –

+0

वास्तव में काम करता है जब" def mavenVer ... "को पिछली टिप्पणी से कोड के साथ बदल दिया जाता है। –

+1

इस बग के मुद्दों के कारण, 'POM_VERSION' के समान समस्या है। Jenkins-ci.org/browse/JENKINS-24869 – yegeniy

3

हमने Groovy Postbuild Plugin का उपयोग किया।

String regex = '.*\\[INFO\\] Building .+ (.+)'; 
    def matcher = manager.getLogMatcher(regex); 
    if (matcher == null) { 
     version = null; 
    } else { 
     version = matcher.group(1); 
    } 

इसे बाद में उपयोग के लिए जेनकींस में जोड़ना थोड़ा मुश्किल है। इसे एक शॉट दें, हालांकि मुझे याद है कि यह हमें कुछ सिरदर्द पैदा करता है। (क्षमा करें, हम ऐसा किया एक लंबे समय पहले)

def addBuildParameter(String key, String value) { 
    manager.build.addAction(new hudson.model.ParametersAction(new hudson.model.StringParameterValue(key,value))); 
} 
+0

कैसे आप तो होगा ' संस्करण 'नौकरी में अन्य चीजों के चरणों के लिए उपलब्ध है? –

+0

हाय डीजे, मैंने थोड़ा जवाब दिया। सौभाग्य! –

+0

यह समाधान उन मामलों के लिए सबसे अच्छा काम करता है जहां आपके पास चर का उपयोग करके पीओएम फ़ाइल में गतिशील रूप से आबादी वाला संस्करण संख्या है। POM_VERSION का उपयोग करना या pom.xml फ़ाइल को पार्स करना उन मामलों में काम नहीं करेगा। – swbandit

2

पोरो को पार्सिंग के साथ ग्रोवी के साथ सुझाव के अनुसार वही आवश्यकता और हल किया गया था।

import jenkins.util.*; 
import jenkins.model.*; 

def thr = Thread.currentThread(); 
def currentBuild = thr?.executable; 
def workspace = currentBuild.getModuleRoot().absolutize().toString(); 

def project = new XmlSlurper().parse(new File("$workspace/pom.xml")) 

def param = new hudson.model.StringParameterValue("project.version", project.version.toString()) 
currentBuild.addAction(new hudson.model.ParametersAction(param)); 

प्रकार का एक पद कदम के रूप में इस स्क्रिप्ट जोड़ें "प्रणाली ग्रूवी स्क्रिप्ट निष्पादित" (तो यह ग्रूवी स्थापित करने की जरूरत नहीं है) और 'ग्रूवी आदेश "में कोड पेस्ट करें।

+0

देखें [प्रोजेक्ट-संस्करण-से-मेवेन-टू-सोनार-उपयोग-हडसन] (http://stackoverflow.com/questions/14691818/project-version-from-maven-to-sonar-using-hudson/15879456# 15879456) – Sylvain

+0

मैंने इसके बाद शेल स्क्रिप्ट चरण में '$ {project.version}' का उपयोग करने का प्रयास किया है और यह विफल रहा: 'bad substituion', मैंने' project.version' को 'project_version' नाम दिया है - यह काम करता है । लगता है कि जेनकिंस var नामों में 'dot' की अनुमति नहीं देते हैं? – yetanothercoder

+0

यह जेनकींस 2.46+ में काम नहीं कर रहा है। यद्यपि ग्रोवी संस्करण को ठीक से निकालता है, फिर भी 'project.version' पर्यावरण चर मेरे बाकी फ्रीस्टाइल प्रोजेक्ट में खाली है। क्या जेनकिन्स 2+ में कुछ ऐसा बदल गया है जो इसे अप्रचलित कर देगा? मैं बाद में '$ {project.version} ' –

0

तुम भी कर सकता है:

MAVEN_VERSION=`grep A -2 -B 2 "<your_project_name>" pom.xml | grep version | cut -d\> -f 2 | cut -d\< -f 1`-commit-"`echo $GIT_COMMIT`" 

स्पष्टीकरण: यह सोचते हैं कि आप एक सामान्य पोम तरह के ऊपर एक लाइन या दो के भीतर अपनी परियोजना का नाम है/संस्करण नीचे:

<groupId>org.apache.bigtop</groupId> 
<artifactId>bigpetstore</artifactId> 
<version>1.0-SNAPSHOT</version> 

तो फिर तुम कर सकते हैं आसानी से artifactId के लिए grep, इसके साथ संस्करण में चूसने के लिए "पहले/बाद" grep क्रियाओं का उपयोग करें, और उसके बाद संस्करण को grep करें और "संस्करण" टैग के बीच सामग्री को अलग करने के लिए सरल यूनिक्स "कट" कमांड का उपयोग करें।

मुझे जेनकींस-ग्रोवी एकीकरण पसंद है, लेकिन यह बहुत आसान है और एक ऐसे सर्वर पर भी काम करेगा जिस पर आपका नियंत्रण नहीं है (यानी क्योंकि बैश सार्वभौमिक है)।

+0

के रूप में var तक पहुंचने का प्रयास कर रहा हूं, यह एक आकर्षण की तरह काम करता था लेकिन एकाधिक संस्करण-इंफोस प्राप्त करता था, क्योंकि निर्भरताएं जिनमें एक संस्करण-टैग भी शामिल था। grep और पाइप से पहले एक सिर जोड़ना यह मेरे लिए काम करता है MAVEN_VERSION = 'head" "pom.xml | grep ए -2-बी 2 | grep संस्करण | कट-डी \> -एफ 2 | कट-डी \ <-f 1'-commit- "echo $ GIT_COMMIT'" – JoeDred

+0

@ जोड्रेड मैं अभी भी गुणा संस्करण प्राप्त करता हूं। लेकिन मेरी "एक और संस्करण" नहीं है निर्भरता से, लेकिन गुणों से: ** cz.px.iis \t आईआईएस कोर एनजी \t जार \t 2.1.1-स्नैपशॉट \t \t \t 7.7.5 \t \t UTF-8 \t \t 1.8 \t \t 1.8 \t ** और आउटपुट __2.1.1-स्नैपशॉट है 7.7.5__ – agad

+0

@agad हो सकता है कि आपको उन लाइनों को सीमित करना चाहिए जिन्हें आप पहली grep पर पाइप करते हैं। हेड एक वैकल्पिक तर्क-एन या --लाइन लेता है। ** head --help ** आज़माएं ** जो दिखाता है कि इसका उपयोग कैसे किया जाता है। – JoeDred

56

आप Maven प्लगइन "कार्यकारी-Maven-प्लगइन" "निष्पादित शैल" में निष्पादित एक "सशर्त कदम" के रूप में $ {POM_VERSION} चर, जो https://issues.jenkins-ci.org/browse/JENKINS-18272

+0

बहुत बढ़िया! सत्यापित करें कि आपको जेनकिन्स मेवेन प्लगइन v2.3 या बाद में '$ {POM_VERSION}' के लिए काम करने की आवश्यकता है और मुझे लगता है कि इसे एक मेवेन प्रोजेक्ट प्रकार होना चाहिए। –

+1

यह मेरे लिए काम नहीं किया। जेनकींस में मेवेन इंटरनेशनल प्लगइन संस्करण 2.5 है, फिर भी यह कहता है: $ {ENV, var = "POM_VERSION"}: खराब प्रतिस्थापन यदि मैं इस चर का उपयोग सीधे या ऊपर उल्लिखित तरीके से करने का प्रयास करता हूं। '$ {POM_VERSION} में अपरिचित मैक्रो' POM_VERSION '। बिल्ड नंबर सेट प्लगइन बॉक्स के दौरान $ {BUILD_NUMBER}'। –

+2

ध्यान रखें कि POM_VERSION किसी भी पर्यावरण चर को ध्यान में रखता है जो मैवेन बिल्ड प्रक्रिया में पारित हो सकता है। उदाहरण के लिए: $ {CUSTOM_VERSION} खाली या डिफ़ॉल्ट मान के साथ होगा। – swbandit

1

साथ पेश किया गया था का उपयोग कर सकते मेरे लिए काम किया:

mvn -q -Dexec.executable="echo" -Dexec.args='${projects.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec 

जेनकींस में एकीकृत:

-> "Add post-build step" 
    -> "Conditional steps (single or multiple)" 
     -> "Execute Shell:" 

निर्यात MY_POM_VERSION = `mvn -q -Dexec.executable =" ech ओ " -Dexec.args = '$ {projects.version}' --non-recursive org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec` & & [[ " $ {MY_POM_VERSION} " == "THE_VERSION_TO_BE_MATCHED"]] & & गूंज "CONDITION_IS_MET"

-> "Steps to run if condition is met" 
     -> Add any build step you need 

नोट्स: अपने संस्करण के साथ आदान-प्रदान किया करने के लिए

  • THE_VERSION_TO_BE_MATCHED है
  • '& & "CONDITION_IS_MET" गूंज केवल डीबगिंग उद्देश्यों के लिए है। उसी उद्देश्य के लिए आप क्या समझ रहे हैं कि एमवीएन कमांड के बाद "& & गूंज" MY_POM_VERSION = $ {MY_POM_VERSION} "जोड़ सकते हैं।

यह दृष्टिकोण "grep" से अधिक विश्वसनीय है और यह एक विकल्प हो सकता है यदि जेनकिन्स रूबी प्लगइन स्थापित नहीं है।

6

जैसा कि अन्य उत्तरों पहले से ही इंगित किए गए हैं, यदि आप मेवेन प्रोजेक्ट प्रकार का उपयोग कर रहे हैं, तो आपके पास $ POM_VERSION चर तक पहुंच है। लेकिन यदि आप नहीं हैं, तो आप चरणों के इस अनुक्रम का उपयोग कर सकते हैं (बदसूरत लेकिन भरोसेमंद)। इस तरह से इसे पोम संस्करण निर्धारित करने के लिए मेवेन के एक ही संस्करण पर निर्भर करता है (जटिल माता-पिता/बच्चे पोम विरासत को संभालने के दौरान < संस्करण > बच्चे के लिए भी मौजूद नहीं हो सकता है)।

  1. इस लक्ष्य के साथ Maven कदम:

    org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -l version.log

  2. शैल कदम:

    (आप अपने पदानुक्रम के आधार पर version.log के लिए पथ समायोजित करने की आवश्यकता हो सकती है)

    echo "POM_VERSION=$(grep -v '\[' version.log)" > props.properties

  3. इंजेक्षन पर्यावरण चर कदम (पर्यावरण इंजेक्टर प्लगइन):

    गुण फ़ाइल पथ: props.properties

अब आप $ POM_VERSION के रूप में अगर यह एक Maven परियोजना थे उपयोग कर सकते हैं।

यह क्या करता है: आउटपुट की गड़बड़ी के साथ संस्करण को मुद्रित करने के लिए मेवेन का उपयोग करता है, फिर केवल संस्करण को छोड़कर आउटपुट की गड़बड़ी को बाहर निकाल देता है, इसे गुण फ़ाइल प्रारूप का उपयोग करके फ़ाइल में लिखता है और फिर इसे बिल्ड में इंजेक्ट करता है वातावरण। mvn ..... | grep -v '\[' जैसे एक लाइनर से बेहतर यह कारण यह है कि एक मैवेन चरण का उपयोग स्थापित मैवेन संस्करणों के बारे में धारणा नहीं करता है और उसी ऑटो-इंस्टॉलेशन द्वारा किसी भी अन्य मेवेन चरणों के रूप में संभाला जाएगा।

+0

grep फ़िल्टर के साथ एक समस्या है: यदि आपके पास रिपोजिटरी में प्लगइन्स नहीं हैं, तो आपको मिल जाएगा POM_VERSION में "डाउनलोडिंग ..." पंक्तियां भी। उदा। 'Echo' POM_VERSION = डाउनलोड कर रहा है: ... ' – apa64

0

समाधान:

POM_VERSION=$(\ 
    xmlstarlet sel \ 
    -N x='http://maven.apache.org/POM/4.0.0' \ 
    -t \ 
    -v '//x:project/x:version/text()' \ 
    pom.xml \ 
) 

स्पष्टीकरण:

आप "How to execute XPath one-liners from shell?" में उल्लेख किया है के रूप में एक कमांड लाइन XPath उपकरण, का उपयोग करते हुए एक एक लाइनर से कर सकते हैं। मैंने XMLStarlet चुना है, लेकिन उनमें सभी के समान वाक्यविन्यास है।

एक पीओएम पार्स करते समय, आपको नामस्थानों के लिए खाते हैं। दस्तावेज़ here ने मुझे यह समझने में मदद की।

XPath में किसी तत्व के लिए पाठ प्राप्त करने के लिए, आप पाठ() फ़ंक्शन का उपयोग XPath: select text node पर समझाया गया है।

मेरे पोम इस तरह दिखता है:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.foo.bar</groupId> 
    <artifactId>foobar</artifactId> 
    <version>1.0.6-SNAPSHOT</version> 
    <packaging>jar</packaging> 

नकारात्मक पक्ष यह है कि यहाँ आदेश को बदलने के लिए नाम स्थान परिवर्तन, अगर आपके पास है।

0

मैवेन संस्करण प्राप्त करने के लिए मैंने घोषणात्मक पाइपलाइन नौकरी में Pipeline Utility Steps प्लगइन का उपयोग किया। नीचे दिए गए उदाहरण में मैं पर्यावरण चर के बजाय स्क्रिप्ट वैरिएबल का उपयोग करता हूं, क्योंकि इसे संशोधित किया जा सकता है और चरणों के बीच पारित किया जा सकता है।

def TAG_SELECTOR = "UNINTIALIZED" 
pipeline { 
    agent any 
    stages { 
     stage('Build') { 
      steps { 
       sh "mvn --batch-mode -U deploy" 
       script { 
        TAG_SELECTOR = readMavenPom().getVersion() 
       } 
       echo("TAG_SELECTOR=${TAG_SELECTOR}") 
      } 
     } 
    } 
} 

नोट: आप में काम बनाने के बाद getVersion() विधि स्वीकार करना चाहिए जेनकींस प्रबंधित>इन-प्रक्रिया स्क्रिप्ट स्वीकृति

यह भी देखें:

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