2016-06-02 4 views
15

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

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

Согласно документации Дженкинс имеет $POM_VERSION но значение не имеет ничего в нем, когда я присвоить его переменной и повторить это.

def pomv = "$POM_VERSION" 

ИЛИ

def pomv = '$POM_VERSION" 

Кто-нибудь есть идеи?

ответ

4

Обычно я использую 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 tutorial - Serializing Local Variables.

+0

Я использую декларативные трубопроводы, и получить 'org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Сценарии не разрешаются использовать новый groovy.util.XmlSlurper' –

+0

Это скорее всего, из-за песочницы, посмотрите, как его утвердить здесь: https: // stackov erflow.com/questions/33573568/sandbox-is-preventing-me-from-formatting-a-string/33707113#33707113 – vehovmar

3

Вы можете попробовать readMavenPom функция, которая доступна.

Больше информации здесь: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file

+0

Обратите внимание, что вам нужно установить плагин «Шаги трубопровода», чтобы получить этот шаг. –

+0

Плагин «Утилита для трубопроводов» говорит, что ему нужен Pipeline: Groovy plugin 1.11, который почти 2 года и отстает от текущего 2,30 (или около того). Это заставляет меня нервничать. –

47

Использование readmavenPom так:

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

См Model ссылку на свойства (как показано выше версии).

Для этой работы, необходимо установить Pipeline Utility Steps plugin

+0

Это работает ... Необходимо установить плагин Pipeline Utility, хотя для его работы – user301693

5

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

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

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

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

+0

Если вы зависите от родительского POM, используйте matcher [1] [1], потому что matcher [0] [1] соответствует родительской версии POM , –

+0

Этот ответ не работает ни в одном из моих POM, потому что всегда есть более одного тега . – Jolta

+0

@Jolta спасибо за подсказку. Я редактировал сообщение. Это работает для вас сейчас? – schnatterer

0

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

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

Я только начинаю с 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 и т.д.