Ответ 1
Используйте readMavenPom
так:
pom = readMavenPom file: 'pom.xml'
pom.version
См. Модель ссылки для свойств (как и выше версия).
Чтобы это работало, нужно установить плагин Pipeline Utility Steps
Я создал конвейер и использовал встроенное определение 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"
Есть ли у кого-нибудь идеи?
Используйте readMavenPom
так:
pom = readMavenPom file: 'pom.xml'
pom.version
См. Модель ссылки для свойств (как и выше версия).
Чтобы это работало, нужно установить плагин Pipeline Utility Steps
Страница 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 или его родителя.
Я обычно использую 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 - Сериализация локальных переменных.
Вы можете попробовать readMavenPom
функцию, которая доступна.
Больше информации здесь: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file
Похоже, 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
.
В 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
Я обычно использую карту для этого.
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()
Я только начинаю с 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
и т.д.
Я только что улучшил решение @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 :-)