Uso del complemento Artifactory en la tubería declarativa de Jenkins


13

Estoy usando Jenkins Declarative Pipeline para automatizar mi proceso de construcción. Queremos publicar nuestros artefactos en un repositorio remoto de JFrog solo si pasan ciertas condiciones (Sonar, Checkmarx).

Después de un poco de investigación, descubrí que el complemento Artifactory es útil para esto. Pero no puedo encontrar ningún documento sobre cómo integrar en la tubería declarativa. A continuación se muestra el fragmento de código de Jenkinsfile

stages{

    stage('Pre-Build'){
        steps{

             script{
                def server = Artifactory.server 'LocalJfrog'
                def rtGradle = Artifactory.newGradleBuild()
                rtGradle.resolver server: server, repo: 'gradle-dev-local'
                rtGradle.deployer server: server, repo: 'gradle-release-local'
                rtGradle.useWrapper = true
            }

        }   
    }
}

La publicación condicional no es posible con el código anterior ya que no puedo reutilizar la variable del servidor incluso si desactivo la publicación automática.

Respuestas:


3

Usted puede tener condicionales en su tubería declarativa utilizando el cuando -bloque dentro de un escenario. Hay un complemento llamado "inyector de entorno" que le permite establecer variables fuera de la secuencia de comandos de la tubería que es agradable. Además, si coloca el paso debajo de los otros pasos, no se ejecutará si fallan.

 when {
    environment name: 'pushArtifact', value: 'true'
  }
  steps{
     //push artifact  
  }

Gracias por la pista. Si lo entendí bien, se debe establecer una variable después de que se cumplan las condiciones y luego verificar esa variable en el paso
Precompilación

2

Creo que su problema está enraizado en la variable del servidor que no se puede reutilizar fuera del bloque de la etapa previa a la compilación.

En la declaración de Jenkins, puede definir variables como esa usando el script { ... }bloque, pero una vez que abandona la etapa, esas variables son inaccesibles para otras etapas.

Con las sugerencias anteriores, recomendaría esto:

Aloje el código de despliegue de artefacto en una biblioteca compartida.

gradle_artifactory.groovy

    llamada de def (Parámetros de mapa = [:]) {// mapeo de parámetros opcionales

        def server = Artifactory.server 'LocalJfrog'
        def rtGradle = Artifactory.newGradleBuild ()
        rtGradle.resolver server: server, repo: 'gradle-dev-local'
        rtGradle.deployer server: server, repo: 'gradle-release-local'
        rtGradle.useWrapper = true
        def buildInfo = rtGradle.run rootDir: "projectDir /", buildFile: 
            'build.gradle', tareas: 'clean artifactoryPublish'

    }

Luego para mantener sus tuberías declarativas D.R.Y

@Library('my-shared-lib') 
...
stage('Artifactory Upload') {
    when { <some expression with sonarqube/checkmarx> }
    steps {
        script {
            gradle_artifactory()
        }
    }
}

refs:

https://jenkins.io/doc/book/pipeline/syntax/#when

https://jenkins.io/doc/book/pipeline/shared-libraries/


1

Si desea incrustar la lógica en el archivo Jenkins, la sintaxis declarativa puede no ser el mejor método, ya que no siempre es fácil reflejarla en el código.

Si cambia a la canalización con script Jenkinsfile, podrá definir y utilizar las condiciones de una manera más fácil.


1
Gracias por la respuesta. Soy consciente de la canalización programada, pero desde entonces, esta es una necesidad básica para cualquier proyecto que se incluya en la canalización declarativa. Cambiará de nuevo al script con secuencias de comandos o externo maravilloso
Dharanidhar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.