wake-up-neo.net

Maven Version in Jenkins bekommen

Gibt es eine Möglichkeit, dass ein Jenkins-Build nach der Verarbeitung des POM die Maven-Versionsnummer eines Projekts erkennt?

Ich habe einige Projekte, bei denen die Versionierung von Maven gesteuert wird. In einem Post-Build-Auftrag möchten wir ein Debian-Paket erstellen und einige Shell-Skripts aufrufen. Was ich brauche, ist die Versionsnummer, die Maven früher als Jenkins-Umgebungsvariable zur Verfügung stellte, damit ich sie an Post-Build-Aktionen übergeben kann.

Um klar zu sein, ich bin nicht muss wissen, wie man Jenkins dazu bringt, eine Versionsnummer an Maven zu übergeben; Stattdessen möchte ich, dass Maven Jenkins eine Versionsnummer übergibt!

46

Nach vielem Graben (ich habe nie gedacht, wie schlecht dokumentierte Jenkins ist!), Fand ich eine ziemlich triviale Lösung.

  1. Installieren Sie das Groovy-Plugin 
  2. Füge einen Post Step zu deinem Maven-Build vom Typ Execute **system** Groovy script hinzu.
  3. Einfügen in den folgenden Ausschnitt von Groovy:

Skript:

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

Die Build-Umgebungsvariable mit dem Namen MAVEN_VERSION steht nun in der üblichen Weise (${MAVEN_VERSION}) für die Ersetzung in andere Schritte nach dem Build zur Verfügung. Ich verwende es unter anderem für das Git-Tagging.

21

Sie können die $ {POM_VERSION} Variable verwenden, die mit https://issues.jenkins-ci.org/browse/JENKINS-18272 eingeführt wurde.

59
Nils Breunese

Wie bereits in anderen Antworten erwähnt, haben Sie bei Verwendung des Maven-Projekttyps Zugriff auf die Variable $ POM_VERSION. Wenn dies nicht der Fall ist, können Sie diese Abfolge von Schritten verwenden (hässlich, aber zuverlässig). Um dies auf diese Weise zu tun, muss dieselbe Version von maven die pom-Version ermitteln (während die komplexe Vererbung von Eltern-/Kind-Poms behandelt wird, wobei <version> möglicherweise nicht einmal für das Kind vorhanden ist).

  1. Maven Schritt mit diesem Ziel:

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

  2. Shell-Schritt: (Je nach Hierarchie müssen Sie möglicherweise den Pfad zu version.log anpassen.)

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

  3. Inject Environment Variables Schritt (Environment Injector Plugin):

    Eigenschaftendateipfad: props.properties

Jetzt können Sie $ POM_VERSION verwenden, als wäre dies ein Maven-Projekt.

Was dies bewirkt: Verwendet maven, um die Version zusammen mit einem Durcheinander von Ausgaben auszudrucken, und greift dann auf das Durcheinander von Ausgaben zu, wobei nur die Version übrig bleibt. Schreibt es in eine Datei im Eigenschaftendateiformat und fügt es dann in die Erstellungsumgebung ein. Der Grund, warum dies besser ist als ein Einzeiler wie mvn ..... | grep -v '\[', Ist, dass die Verwendung eines Maven-Schritts keine Annahmen über die installierten Maven-Versionen macht und von derselben automatischen Installation wie alle anderen Maven-Schritte behandelt wird.

9
Akom

Hatte das gleiche Bedürfnis und gelöst, wie mit Groovy beim Poming vorgeschlagen.

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

Fügen Sie dieses Skript als Nachschritt vom Typ "Execute system Groovy script" hinzu (damit Groovy nicht installiert werden muss) und fügen Sie den Code in den "Groovy-Befehl" ein.

3
Sylvain

Wir haben das Groovy Postbuild Plugin verwendet.

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

Jenkins zur späteren Verwendung hinzuzufügen, ist etwas schwierig. Versuchen Sie es einmal, obwohl ich mich erinnere, dass uns dies einige Kopfschmerzen bereitet hat. (Sorry, wir haben das schon vor langer Zeit gemacht)

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

Ich habe Pipeline Utility Steps plugin in einem deklarativen Pipeline-Job verwendet, um die Maven-Version zu erhalten. Im folgenden Beispiel verwende ich eine Skriptvariable anstelle einer Umgebungsvariablen, da diese geändert und zwischen den Stufen übergeben werden kann.

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

Hinweis: Sie müssen die getVersion () -Methode genehmigen, nachdem Sie den Job in Jenkins verwalten> In-Process-Skriptgenehmigung erstellt haben.

Siehe auch:

2
apa64

Führen Sie das Maven Plugin "exec-maven-plugin" in "Execute Shell" als "Bedingter Schritt" für mich aus:

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

Integration in Jenkins:

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

Anmerkungen: 

  • THE_VERSION_TO_BE_MATCHED muss mit Ihrer Version ausgetauscht werden
  • '&& echo "CONDITION_IS_MET"' dient nur zu Debugging-Zwecken. Zu dem gleichen Zweck können Sie nach dem Befehl mvn ein '&& echo "MY_POM_VERSION = $ {MY_POM_VERSION}"' 'hinzufügen, um zu verstehen, was los ist.

Dieser Ansatz ist zuverlässiger als ein "grep" und könnte eine Alternative sein, wenn das Jenkins Ruby Plugin nicht installiert ist.

1
Jan M

Lösung:

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

Erklärung:

Sie können dies in einem Einzeiler mit einem Befehlszeilen-XPath-Tool tun, z. B. den unter " Ausführen von XPath-Einzeilen von der Shell? " genannten. Ich habe XMLStarlet gewählt, aber alle haben eine ähnliche Syntax.

Wenn Sie ein POM analysieren, müssen Sie Namespaces berücksichtigen. Die Dokumente hier haben mir geholfen, das herauszufinden.

Um den Text für ein Element in XPath abzurufen, verwenden Sie die Funktion text () wie unter XPath erläutert: Wählen Sie den Textknoten aus.

Mein POM sieht so aus:

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

Der Nachteil hierbei ist, dass Sie den Befehl ändern müssen, wenn sich der Namespace ändert.

0
John Michelau

Verwenden Sie 'Execute System Groovy Script' wie folgt:

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

Mit dem Script Execute System Groovy haben Sie direkten Zugriff auf das Build, aus dem Sie das Projekt und damit die "Kind" -Datei in diesem Fall pom.xml erhalten.

Sie müssen keine neue Datei erstellen, und wie Sie sehen, bietet sie einen sehr leistungsfähigen Zugriff auf jede Datei innerhalb des Arbeitsbereichs.

0

Basierend auf @ Akoms Antwort sind die vorbereitenden Schritte für POM_VERSION:

  1. "Injizieren Sie Umgebungsvariablen" mit der Eigenschaftendatei your_property_file. Hinweis: Wenn Sie "Umgebungsvariablen in den Erstellungsprozess einfügen" auswählen, muss die Datei im Jenkins-Arbeitsbereich vorhanden sein.
  2. führen Sie in einem Pre-Step das folgende Bash-Skript aus.

Skript

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

Sie könnten auch tun: 

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

Erläuterung: Angenommen, Sie haben Ihren Projektnamen in einer oder zwei Zeilen oberhalb/unterhalb einer Version wie ein normaler Pom: 

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

Dann können Sie leicht für die artefakt-id grep, die "Vorher/Nachher" grep-Aktionen verwenden, um die Version mit einzusaugen, und dann die Version herausgreifen und den einfachen Unix-Befehl "Ausschneiden" verwenden, um den Inhalt zwischen "Version" auszusplitten Stichworte.

Ich mag die Jenkins-groovige Integration, aber das ist viel einfacher und funktioniert sogar auf einem Build-Server, über den Sie keine Kontrolle haben (d. H. Weil bash universal ist). 

0
jayunit100