it-swarm.com.ru

Получение Maven версии в Дженкинс

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

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

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

46
EngineerBetter_DJ

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

  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 среди других вещей.

21
EngineerBetter_DJ

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

59
Nils Breunese

Как уже указывалось в других ответах, если вы используете тип проекта Maven, у вас есть доступ к переменной $ POM_VERSION . Но если нет, вы можете использовать эту последовательность шагов (некрасиво, но надежно). Выполнение этого способа зависит от той же версии maven, которая определяет версию pom (при обработке сложного наследования 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.

7
Akom

Была такая же необходимость и решена, как и предполагалось, с 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
Sylvain

Мы использовали 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))); 
}
3
Roy Truelove

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

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

2
apa64

Выполнить плагин 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.

1
Jan M

Решение:

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>

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

0
John Michelau

Используя «Выполнить системный скрипт 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
LawrenceMouarkach

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

  1. «Введите переменные среды» с помощью файла свойств your_property_file. Обратите внимание, что если вы выберете «Внедрить переменные среды в процесс сборки», файл должен существовать в рабочей области jenkins.
  2. выполнить в предварительном шаге выполнить Shell следующий сценарий 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
Adam

Вы также можете сделать: 

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

Объяснение: при условии, что у вас есть имя проекта в строке или двух над/под версией, как у обычного pom: 

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

Затем вы легко можете использовать grep для artifactId, использовать действия grep «before/after» для добавления версии к нему, а затем grep версии и использовать простую команду unix «cut» для разделения содержимого между «version» теги.

Мне нравится интеграция Jenkins-groovy, но это намного проще и будет работать даже на сервере сборки, который вы не можете контролировать (т. Е. Потому что bash универсален). 

0
jayunit100