Версия для извлечения pom в трубе дженкинсов

Я создал конвейер и использовал встроенное определение groovy конвейера script и, похоже, не смог получить версию pom. Я пробовал это, который работает в консоли groovy, но включен в конвейере сборки Jenkins script:

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

Согласно документации Jenkins имеет $POM_VERSION, но значение не имеет в ней ничего, когда я назначаю его переменной и эхо-сигнал.

def pomv = "$POM_VERSION"

ИЛИ

def pomv = '$POM_VERSION"

Есть ли у кого-нибудь идеи?

Ответы

Ответ 2

Страница Getting Started with Pipeline показала еще один вариант. Он работает без дополнительных плагинов.

Несколько более надежная версия может быть найдена в общей библиотеке ces-build-lib (у нее также есть некоторые базовые модульные тесты):

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

Это всегда соответствует первому тегу <version>, который можно найти в pom.xml. В большинстве случаев это должна быть версия модуля maven или его родителя.

Ответ 3

Я обычно использую readFile вместо new File(), где это возможно.

Итак, это будет выглядеть так:

def project = new XmlSlurper().parseText(readFile('pom.xml'))
def pomv = project.version.text()

Также убедитесь, что версия не унаследована от родителя. В этом случае вам понадобится:

def pomv = project.parent.version.text()

И последнее, но не менее важное: XmlSlurper не является сериализуемым. Обычно вы хотите использовать

@com.cloudbees.groovy.cps.NonCPS

в этих случаях. Я настоятельно рекомендую прочитать прогиб Учебник Github - Сериализация локальных переменных.

Ответ 5

Похоже, readMavenPom - самый простой ответ, но, поскольку он требовал установки дополнительного конвейерного плагина, здесь есть другой, который использует нативный подход maven вместо загрузки xml (на основе этого ответа)

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

Из-за использования команды grep это может не сработать на некоторых платформах, которые несовместимы с posix, но вы всегда можете обработать вывод в Groovy вместо того, чтобы передавать через grep.

Ответ 6

В Jenkins 2.138.3 есть два разных типа конвейеров.

Декларативные и скриптовые конвейеры.

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

конвейер Дженкинса: агент против узла?

Вот пример декларативного конвейера:

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

        }

    }

}

Пример скриптового конвейера

node('master') {

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

}

Вот несколько хороших ссылок:

Декларативный https://github.com/jenkinsci/pipeline-examples/blob/master/declarative-examples/jenkinsfile-examples/mavenDocker.groovy

Сценарий https://bulldogjob.com/articles/726-exploring-jenkins-pipelines-a-simple-delivery-flow

Ответ 7

Я обычно использую карту для этого.

 def pomFile = readFile(pomName)
 def pom = new XmlParser().parseText(pomFile)
 def gavMap = [:]
 gavMap['groupId'] =  pom['groupId'].text().trim()
 gavMap['artifactId'] =  pom['artifactId'].text().trim()
 gavMap['version'] =  pom['version'].text().trim()

Ответ 8

Я только начинаю с Jenkisfile, и у меня была та же проблема, что и вы. Поскольку XmlSlurper и XmlParser запрещены по умолчанию, у меня есть функция ниже, чтобы извлечь версию maven:

String readProjectVersion(String pom) {
    //Take value of the <project> tag
    def matcher = pom.trim() =~ /(?s)<project[^>]*>(.*)<\/project>/
    def pomWithoutProject = matcher[0][1].trim()

    //remove every tag except <version>, since only project version is not encapsulated in the other tag e.g. dependency, parent, plugin
    def nonVersionMatcher = pomWithoutProject =~ /(?s)\s*(?!<version>)<([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>(.*?)<\/\1>\s*/
    def versionTag = nonVersionMatcher.replaceAll("").trim()
    //Take value of the <version> tag
    def versionTagMatcher = versionTag =~ /<version>(.*)<\/version>/
    if (versionTagMatcher.matches()) {
        return versionTagMatcher[0][1]
    }
    //no version tag, version should be inherited from parent version
    def parentVersionMatcher = pomWithoutProject =~ /(?s)\s*<parent>.*<version>(.*)<\/version>.*<\/parent>\s*/
    return parentVersionMatcher[0][1]
}

Я тестировал это решение против файлов, где был объявлен родительский, версия была первой, версия была последней операцией и с наличием версии во вложенных тегах, например dependency, plugin и т.д.

Ответ 9

Я только что улучшил решение @haridsv без использования grep:

#!/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()
}

Вам лучше не использовать readMavenPom, так как он будет устаревшим (см. PR https://github.com/jenkinsci/pipeline-utility-steps-plugin/pull/47/commits/eeebaa891a006c083ce10f883b7c1264533bb692). Вы можете скопировать и вставить это в файл, такой какvaluMavenPomVersion.groovy :-)