maven जेनकींस में मेवेन संस्करण प्राप्त करना




maven-2 hudson (8)

एक "सशर्त कदम" के रूप में मेरे लिए काम करने के लिए "निष्पादन शैल" में मेवेन प्लगइन "exec-maven-plugin" निष्पादित करें:

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 =" echo "-Dexec.args = '$ {projects.version}' --non-recursive org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec `&& [[" $ {MY_POM_VERSION} "==" THE_VERSION_TO_BE_MATCHED "]] &&cho" CONDITION_IS_MET "

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

टिप्पणियाँ:

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

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

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

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

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



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

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

    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 का उपयोग कर सकते हैं जैसे कि यह एक मेवेन प्रोजेक्ट था।

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


हमने ग्रोवी पोस्टबिल्ड प्लगइन का इस्तेमाल किया।

    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))); 
}

इस प्रकार 'सिस्टम ग्रोवी स्क्रिप्ट निष्पादित करें' का उपयोग करना:

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

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def projectManager = build.getProject()
def file = projectManager.getWorkspace().child("pom.xml");
def project = new XmlSlurper().parseText(file.readToString())

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

Execute System Groovy स्क्रिप्ट का उपयोग करके आपके पास निर्माण के लिए सीधे पहुंच है, जिससे आप प्रोजेक्ट प्राप्त कर सकते हैं और इस प्रकार इस मामले में "बच्चे" फ़ाइल pom.xml।

आपको एक नई फाइल बनाने की आवश्यकता नहीं होगी और जैसा कि आप देख सकते हैं कि यह कार्यक्षेत्र के भीतर प्रत्येक फ़ाइल में बहुत शक्तिशाली पहुंच प्रदान करता है।


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

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 () विधि को स्वीकृति देना होगा

यह भी देखें:


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

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));

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


उपाय:

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

स्पष्टीकरण:

आप कमांड-लाइन XPath टूल का उपयोग करके एक-लाइनर में ऐसा कर सकते हैं, जैसे कि " XPath One-liners को खोल से कैसे निष्पादित करें? " में उल्लिखित है। मैंने XMLStarlet चुना है, लेकिन उनमें सभी समान वाक्यविन्यास हैं।

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

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

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

<?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>

यहां नकारात्मकता यह है कि यदि नामस्थान बदलता है, तो आपको कमांड बदलना होगा।







maven-3