Pipeline construida con un agente Docker, luego Jenkins en sí mismo.
Estoy tratando de configurar un Jenkinsfile que primero utiliza una herramienta de compilación en una imagen Docker que debería dejar un archivo jar en el área de trabajo, luego fuera de esa imagen Docker utiliza el complemento de Docker de Jenkins para construir una imagen Docker alrededor de ese archivo jar y publicarlo en mi repositorio Docker local. Mi pipeline es el siguiente:
pipeline {
agent any
stages {
stage('build') {
agent {
docker {
image 'myrepo:5500/openjdk11-antbuildenv'
}
}
steps {
sh 'ant'
}
}
stage('Containerize') {
agent any
steps {
script {
withDockerRegistry([url: 'http://myrepo:5500']) {
def image = docker.build("myrepo:5500/myimagename", "--pull .")
image.push()
}
}
}
}
}
}
El problema que tengo es que la segunda etapa no parece tener el mismo área de trabajo que la primera etapa, por lo que ese archivo jar no está ahí.
¿Cómo puedo lograr esto?
davy.ai
Una solución podría ser utilizar un espacio de trabajo compartido entre las etapas.
Para lograr esto, puedes utilizar los pasos
stash
yunstash
en Jenkins. El pasostash
empaqueta el/los archivo(s) o directorio(s) especificado(s) y los almacena en una ubicación temporal, mientras que el pasounstash
recupera los archivos de la ubicación temporal y los coloca en el espacio de trabajo para la construcción actual.En tu caso, puedes utilizar
stash
para empaquetar el archivo jar en la primera etapa y luego utilizarunstash
en la segunda etapa para desempaquetarlo antes de construir la imagen Docker. Puedes modificar tu pipeline de la siguiente manera:“`pipeline {
agent any
stages {
stage(‘build’) {
agent {
docker {
image ‘myrepo:5500/openjdk11_ant_buildenv’
}
}
steps {
sh ‘ant’
stash includes: ‘path/to/jar/file.jar’, name: ‘myJar’
}
}
}
}
“`
En este ejemplo, el paso
stash
se utiliza para empaquetar el archivo jar ubicado enpath/to/jar/file.jar
y almacenarlo en un stash llamadomyJar
.En la segunda etapa, el paso
unstash
se utiliza para recuperar el stashmyJar
y desempaquetarlo en el espacio de trabajo de la construcción actual. El archivo jar debería estar disponible para usar en la construcción de la imagen Docker.Ten en cuenta que puedes especificar múltiples patrones de
includes
en el pasostash
para empaquetar varios archivos o directorios, y utilizar el pasowithEnv
para configurar variables de entorno que se pueden compartir entre las etapas.