es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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 y unstash en Jenkins. El paso stash empaqueta el/los archivo(s) o directorio(s) especificado(s) y los almacena en una ubicación temporal, mientras que el paso unstash 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 utilizar unstash 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’
    }
    }

    stage('Containerize') {
      agent any
      steps {
        script {
          withDockerRegistry([url: 'http://myrepo:5500']) {
            unstash 'myJar'
            def image = docker.build('myrepo:5500/myimagename', '--pull .')
            image.push()
          }
        }
      }
    }
    

    }
    }
    “`

    En este ejemplo, el paso stash se utiliza para empaquetar el archivo jar ubicado en path/to/jar/file.jar y almacenarlo en un stash llamado myJar.

    En la segunda etapa, el paso unstash se utiliza para recuperar el stash myJar 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 paso stash para empaquetar varios archivos o directorios, y utilizar el paso withEnv para configurar variables de entorno que se pueden compartir entre las etapas.

Comments are closed.