wake-up-neo.com

extrahieren Sie die Pom-Version in einer Jenkins-Pipeline

Ich habe eine Pipeline erstellt und die eingebettete groovige Pipeline-Skriptdefinition verwendet und kann die Pom-Version nicht zu erhalten. Ich habe dies ausprobiert, was in einer groovigen Konsole funktioniert, aber im Jenkins-Build-Pipeline-Skript weitergeht:

def project = new XmlSlurper().parse(new File("pom.xml"))
def pomv = project.version.toString()

Laut der Dokumentation hat Jenkins einen $POM_VERSION, aber der Wert enthält nichts, wenn ich ihn einer Variablen zuweise und ihn auschecke.

def pomv = "$POM_VERSION"

OR

def pomv = '$POM_VERSION"

Hat jemand eine Idee?

19
user301693

Verwenden Sie readMavenPom wie folgt:

pom = readMavenPom file: 'pom.xml'
pom.version

Siehe Model - Referenz für Eigenschaften (wie in der obigen Version).

Damit dies funktioniert, muss das Plugin Pipeline Utility Steps installiert werden. 

61

Auf der Seite Erste Schritte mit Pipeline wurde eine weitere Option angezeigt. Es funktioniert ohne zusätzliche Plugins. 

Eine etwas robustere Version finden Sie in der gemeinsam genutzten Bibliothek ces-build-lib (sie enthält auch einige grundlegende unit-Tests ):

def version() {
    def matcher = readFile('pom.xml') =~ '<version>(.+?)</version>'
    matcher ? matcher[0][1] : null
}

Dies stimmt immer mit dem ersten <version>-Tag überein, das im pom.xml gefunden wird. In den meisten Fällen ist dies sollte die Version des Maven-Moduls oder seines übergeordneten Elements.

5
schnatterer

Sie können die readMavenPom-Funktion ausprobieren, die verfügbar ist. 

Weitere Informationen finden Sie hier: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file

3

In Jenkins 2.138.3 gibt es zwei verschiedene Arten von Pipelines.

Deklarative und Skript-Pipelines.

"Deklarative Pipelines sind eine neue Erweiterung der Pipeline-DSL (es handelt sich im Wesentlichen um ein Pipeline-Skript mit nur einem Schritt, einem Pipeline-Schritt mit Argumenten (Direktiven genannt)). Diese Direktiven sollten einer bestimmten Syntax folgen ist strenger und sollte daher für diejenigen, die neu in Pipelines einsteigen, einfacher sein, grafische Bearbeitung ermöglichen und vieles mehr . Skript-Pipelines sind der Rückfall für erweiterte Anforderungen. "

Jenkins Pipeline: Agent vs. Knoten?

Hier ist ein Beispiel für eine deklarative Pipeline: 

pipeline {

    agent any


    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()
    }


    stages {

        stage('Test') {
            steps {
                echo "${VERSION}"
            }

        }

    }

}

Beispiel für eine Skriptpipeline

node('master') {

  stage('Test') {
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()
    echo "IMAGE: ${IMAGE}"
    echo "VERSION: ${VERSION}"
  }

}

Hier sind einige gute Links:

Deklarativ https://github.com/jenkinsci/pipeline-examples/blob/master/declarative-examples/jenkinsfile-examples/mavenDocker.groovy

Scripted https://bulldogjob.com/articles/726-exploring-jenkins-pipelines-a-simple-delivery-flow

2
pitchblack408

Es scheint so, als wäre readMavenPom die einfachste Antwort, aber da es die Installation eines zusätzlichen Pipeline-Plugins erfordert, wird hier ein weiterer Ansatz verwendet, der den nativen Maven-Ansatz verwendet, anstatt xml zu laden (basierend auf dieser Antwort ).

def mvn_project_version(pom_file) {
    return sh(
        script: """mvn -N -f $pom_file org.Apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version |
                   grep -Ev '(^\\s*\\[|Download\\w+:)'""",
        returnStdout: true).trim()
}

Aufgrund der Verwendung des grep-Befehls kann dies auf einigen Plattformen, die nicht posix-kompatibel sind, möglicherweise nicht funktionieren. Sie können die Ausgabe jedoch immer in Groovy verarbeiten, anstatt über grep zu paspeln.

0
haridsv

Ich habe gerade die @ haridsv-Lösung verbessert, ohne grep zu verwenden:

#!/usr/bin/env
def call(String mvnBin = 'mvn',String pom_file = 'pom.xml') {

return sh(
        script: mvnBin+''' -N -f '''+pom_file+''' org.Apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -q -DforceStdout''',
        returnStdout: true).trim()
}

Sie sollten readMavenPom nicht verwenden, da es veraltet sein wird (siehe PR https://github.com/jenkinsci/pipeline-utility-steps-plugin/pull/47/commits/eeebaa891a006c083ce10f883b7c1264533bb692 ). Sie können dies kopieren und in eine Datei einfügen, z. B. evaluationMavenPomVersion.groovy :-).

0