web-dev-qa-db-fra.com

extraire la version pom dans un pipeline jenkins

J'ai créé un pipeline et j'utilise la définition de script de pipeline groovy intégrée et je n'arrive pas à obtenir la version pom. J'ai essayé ceci qui fonctionne dans une console groovy mais dans le script de pipeline de compilation Jenkins:

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

Selon la documentation, Jenkins a un $POM_VERSION mais la valeur ne contient rien quand je l'assigne à une variable et que je l'exécute en écho.

def pomv = "$POM_VERSION"

OR

def pomv = '$POM_VERSION"

Est-ce que quelqu'un a une idée?

19
user301693

Utilisez readMavenPom comme ceci:

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

Voir Modèle référence pour les propriétés (comme la version ci-dessus).

Pour que cela fonctionne, il faut installer le plug-in Pipeline Utility Steps

61

La page Mise en route avec Pipeline montre une autre option. Cela fonctionne sans plugins supplémentaires. 

Une version légèrement plus robuste peut être trouvée dans la bibliothèque partagée ces-build-lib _ _ (elle contient aussi quelques tests unitaires } _):

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

Cela correspond toujours à la première balise <version> figurant dans le pom.xml. Ce devrait être la version du module maven ou de son parent dans la plupart des cas.

5
schnatterer

Vous pouvez essayer la fonction readMavenPom disponible. 

Plus d'infos ici: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file

3

Dans Jenkins 2.138.3, il existe deux types de pipelines différents.

Pipelines déclaratifs et scriptés.

"Les pipelines déclaratifs sont une nouvelle extension du pipeline DSL (c’est un script de pipeline avec une seule étape, une étape de pipeline avec des arguments (appelés directives), ces directives doivent suivre une syntaxe spécifique. Ce nouveau format a est plus stricte et devrait donc être plus facile pour ceux qui découvrent les pipelines, permettre l’édition graphique et bien plus encore. Les pipelines scriptés sont la solution de rechange pour les exigences avancées. "

Pipeline Jenkins: agent vs noeud?

Voici un exemple de pipeline déclaratif: 

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

        }

    }

}

Exemple de pipeline scripté

node('master') {

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

}

Voici quelques bons liens:

Déclaratif 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

On dirait que readMavenPom est la réponse la plus simple, mais puisqu'elle nécessitait l'installation d'un plug-in de pipeline supplémentaire, voici une autre qui utilise l'approche maven native au lieu de charger xml (basé sur cette réponse )

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

En raison de l'utilisation de la commande grep, il est possible que cela ne fonctionne pas sur certaines plates-formes non compatibles posix, mais vous pouvez toujours traiter la sortie dans Groovy au lieu de passer par grep.

0
haridsv