maven - deploy - Extraiga la ID de versión de POM en una tubería de Jenkins
pipeline maven configuration (8)
He creado una tubería y utilizando la definición de script de canalización groovy incrustada y parece que no puedo obtener la ID de versión del proyecto desde el POM. Intenté esto, que funciona en una consola genial pero en el script de compilación de Jenkins:
def project = new XmlSlurper().parse(new File("pom.xml"))
def pomv = project.version.toString()
Según la documentación, Jenkins tiene un $POM_VERSION
pero el valor no tiene nada cuando lo asigno a una variable y lo hago eco.
def pomv = "$POM_VERSION"
O
def pomv = ''$POM_VERSION"
Acabo de mejorar la solución @haridsv sin usar 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()
}
Es mejor que no use readMavenPom ya que estará en desuso (consulte PR github.com/jenkinsci/pipeline-utility-steps-plugin/pull/47/… ). Puede copiar y pegar esto en un archivo como evalMavenPomVersion.groovy :-)
En Jenkins 2.138.3 hay dos tipos diferentes de tuberías.
Tuberías declarativas y con guión.
"Las tuberías declarativas son una nueva extensión del DSL de la tubería (es básicamente una secuencia de comandos de la tubería con un solo paso, una etapa de la tubería con argumentos (llamadas directivas), estas directivas deben seguir una sintaxis específica. El punto de este nuevo formato es que es más estricto y, por lo tanto, debería ser más fácil para aquellos que son nuevos en las tuberías, permitir la edición gráfica y mucho más. Las tuberías con secuencias de comandos son la alternativa para los requisitos avanzados ".
tubería de Jenkins: agente vs nodo?
Aquí hay un ejemplo de un oleoducto declarativo:
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}"
}
}
}
}
Ejemplo de canalización con guión
node(''master'') {
stage(''Test'') {
IMAGE = readMavenPom().getArtifactId()
VERSION = readMavenPom().getVersion()
echo "IMAGE: ${IMAGE}"
echo "VERSION: ${VERSION}"
}
}
Aquí hay algunos buenos enlaces:
Scripts https://bulldogjob.com/articles/726-exploring-jenkins-pipelines-a-simple-delivery-flow
Estoy empezando con Jenkisfile
y tuve el mismo problema que tú. Dado que XmlSlurper
y XmlParser
están prohibidos por la configuración predeterminada, he creado la siguiente función para extraer la versión de 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]
}
He probado esta solución en comparación con los archivos donde se declaró el padre, la primera declaración de la versión, la última declaración de la versión y con la presencia de la versión en etiquetas anidadas como dependency
, plugin
, etc.
La página de Introducción a la tubería mostró otra opción. Funciona sin complementos adicionales.
Una versión ligeramente más robusta se puede encontrar en la biblioteca compartida ces-build-lib (también tiene algunas pruebas unitarias básicas):
def version() {
def matcher = readFile(''pom.xml'') =~ ''<version>(.+?)</version>''
matcher ? matcher[0][1] : null
}
Esto siempre coincide con la primera etiqueta <version>
que se encuentra en el pom.xml
. Esta debería ser la versión del módulo de Maven o su padre en la mayoría de los casos.
Parece que readMavenPom
es la respuesta más directa, pero como se requirió la instalación de un complemento de tubería adicional, aquí hay otro que utiliza el enfoque de maven nativo en lugar de cargar xml (basado en esta respuesta )
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()
}
Debido al uso del comando grep
esto puede no funcionar en algunas plataformas que no son compatibles con posix, pero siempre puede procesar la salida en Groovy en lugar de canalizar a través de grep
.
Puede probar la función readMavenPom
que está disponible.
Más información está aquí: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file
Usualmente uso el mapa para hacer esto.
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()
Utilice readMavenPom
esta manera:
pom = readMavenPom file: ''pom.xml''
pom.version
Ver referencia del Model para propiedades (como la versión anterior).
Para que esto funcione, uno tiene que instalar el complemento de Pipeline Utility Steps