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




maven-2 hudson (7)

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

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

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



आप यह भी कर सकते हैं:

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 करें और "संस्करण" के बीच सामग्री को अलग करने के लिए सरल यूनिक्स "कट" कमांड का उपयोग करें टैग।

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


एक "सशर्त कदम" के रूप में मेरे लिए काम करने के लिए "निष्पादन शैल" में मेवेन प्लगइन "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 '\[' यह है कि एक मैवेन चरण का उपयोग स्थापित मैवेन संस्करणों के बारे में धारणा नहीं करता है और उसी ऑटो-इंस्टॉलेशन द्वारा किसी भी अन्य मेवेन चरणों के रूप में संभाला जाएगा।


बहुत खुदाई के बाद (मुझे कभी एहसास नहीं हुआ कि जेनकिन्स कितनी खराब दस्तावेज है!) मुझे एक बहुत ही छोटा समाधान मिला।

  1. ग्रोवी प्लगइन स्थापित करें
  2. अपने मेवेन के प्रकार के लिए एक 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} )। मैं इसे अन्य चीजों के साथ गिट टैगिंग के लिए उपयोग कर रहा हूं।


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

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

यह भी देखें:


उपाय:

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