Получение версии проекта от Maven POM в Дженкинсе - PullRequest
49 голосов
/ 27 марта 2012

Может ли сборка Jenkins узнать номер версии проекта Maven после обработки POM?

У меня есть несколько проектов, в которых управление версиями контролирует Maven, и в пост-сборочной работе мы хотели бы создать пакет Debian и вызвать некоторые сценарии оболочки. Что мне нужно, так это номер версии, которую Maven использовал в качестве переменной среды Jenkins, чтобы я мог передать ее в действия после сборки.

Чтобы было ясно, я не , мне нужно знать, как заставить Дженкинса передать номер версии Maven; вместо этого я хочу, чтобы Мэйвен передал номер версии Дженкинсу!

Ответы [ 11 ]

61 голосов
/ 25 февраля 2014

Вы можете использовать переменную $ {POM_VERSION}, которая была введена в https://issues.jenkins -ci.org / browse / JENKINS-18272

21 голосов
/ 04 апреля 2012

После долгих размышлений (я так и не понял, насколько плохо документирован Дженкинс!) Я нашел довольно тривиальное решение.

  1. Установите плагин Groovy
  2. Добавить Post Step в сборку Maven типа Execute **system** Groovy script
  3. Вставьте следующий фрагмент Groovy:

Сценарий:

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}).Я использую его для пометки Git среди других вещей.

8 голосов
/ 03 февраля 2016

Как уже указывалось в других ответах, если вы используете тип проекта Maven, у вас есть доступ к переменной $ POM_VERSION . Но если нет, вы можете использовать эту последовательность шагов (некрасиво, но надежно). В этом случае для определения версии pom используется одна и та же версия maven (при обработке сложного наследования родительского / дочернего pom, где может даже не присутствовать для дочернего элемента).

  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.

Что это делает: использует maven для распечатки версии вместе с беспорядком вывода, затем вычищает беспорядок вывода, оставляя только версию, записывает его в файл, используя формат файла свойств, и затем внедряет его в среду сборки , Причина, по которой это лучше, чем однострочная, как mvn ..... | grep -v '\[', заключается в том, что использование шага Maven не делает предположений об установленных версиях maven и будет обрабатываться той же автоматической установкой, что и любые другие шаги maven.

3 голосов
/ 16 января 2018

Я использовал плагин Pipeline Utility Steps в декларативном конвейерном задании, чтобы получить версию Maven. В приведенном ниже примере я использую переменную сценария вместо переменной среды, потому что она может быть изменена и передана между этапами.

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 () после создания задания в Управление jenkins > Утверждение сценариев в процессе .

Смотри также:

3 голосов
/ 08 апреля 2013

Была такая же необходимость и решена, как предложено с анализом Groovy pom.

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

Добавьте этот сценарий в качестве шага публикации типа «Выполнить системный сценарий Groovy» (поэтому он не требуется для установки Groovy)и вставьте код в "Groovy команда".

3 голосов
/ 28 марта 2012

Мы использовали Groovy Postbuild Plugin .

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

Добавить его в Jenkins для последующего использования немного сложно.Дайте этому шанс, хотя я помню, что это вызывает у нас некоторые головные боли.(К сожалению, мы сделали это давно)

def addBuildParameter(String key, String value) {
    manager.build.addAction(new hudson.model.ParametersAction(new hudson.model.StringParameterValue(key,value))); 
}
1 голос
/ 25 августа 2015

Выполнить плагин Maven "exec-maven-plugin" в "Execute Shell", как "Условный шаг" работал для меня:

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

export 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"]] && echo "CONDITION_IS_MET"

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

Примечания:

  • THE_VERSION_TO_BE_MATCHED должен быть заменен вашей версией
  • '&& echo "CONDITION_IS_MET"' только для целей отладки. Для этой же цели вы можете добавить '&& echo "MY_POM_VERSION = $ {MY_POM_VERSION}" "после команды mvn, чтобы понять, что происходит.

Этот подход более надежен, чем "grep", и может быть альтернативой, если не установлен плагин Jenkins Ruby.

0 голосов
/ 29 апреля 2019

На основе @ Akom`s ответа предварительные шаги для получения POM_VERSION:

  1. «Ввод переменных среды» со свойством файл your_property_file. Обратите внимание, если вы выбрали «Внедрить переменные среды в процесс сборки», файл должен существовать в рабочей области jenkins.
  2. запустить в предварительном шаге выполнить оболочку скрипт bash.

Сценарий

mvn org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -l project_version
# grep for the version pattern rather than not mentioning '\['
echo "POM_VERSION=$(grep -E  '^[0-9.]+(-SNAPSHOT)?$' project_version)" > your_property_file
0 голосов
/ 24 апреля 2018

Использование «Выполнить системный скрипт Groovy» следующим образом:

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.

Вам не нужно создавать новый файл, и, как вы можете видеть, он предлагает очень мощный доступ к каждому файлу в рабочей области.

0 голосов
/ 01 марта 2017

Решение:

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 из оболочки? ".Я выбрал XMLStarlet , но все они имеют одинаковый синтаксис.

При синтаксическом анализе POM необходимо учитывать пространства имен.Документы здесь помогли мне разобраться в этом.

Чтобы получить текст для элемента в XPath, вы используете функцию text (), как описано в XPath: выберите текстузел .

Мой POM выглядит следующим образом:

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

Недостатком здесь является то, что если пространство имен изменяется, вы должны изменить команду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...