Utilisation du plugin Artifactory dans le pipeline déclaratif Jenkins


13

J'utilise Jenkins Declarative Pipeline pour automatiser mon processus de construction. Nous voulons publier nos artefacts dans un référentiel JFrog distant uniquement si certaines conditions (Sonar, Checkmarx) sont remplies.

Après un peu de recherche, j'ai trouvé que le plugin Artifactory est utile pour cela. Mais je ne trouve aucun document sur la façon de s'intégrer dans le pipeline déclaratif. Ci-dessous, l'extrait de code 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 publication conditionnelle n'est pas possible avec le code ci-dessus car je ne peux pas réutiliser la variable serveur même si je désactive la publication automatique.

Réponses:


3

Vous pouvez avoir des conditions dans votre pipeline déclaratif en utilisant le bloc- quand à l' intérieur d'une étape. Il existe un plugin appelé "injecteur d'environnement" qui vous permet de définir des variables en dehors du script de pipeline, ce qui est bien. De plus, si vous placez l'étape en dessous des autres étapes, elle ne s'exécutera pas si elles échouent.

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

Merci pour l'astuce. Si j'ai bien compris, une variable doit être définie une fois les conditions remplies, puis vérifiez cette variable à l'étape de pré-
génération

2

Je pense que votre problème est lié au serveur variable n'est pas réutilisable en dehors du bloc d'étape de pré-construction.

Dans Jenkins déclarative, vous pouvez définir des variables comme celle-ci en utilisant le script { ... }bloc, mais une fois que vous quittez l'étape, ces variables sont inaccessibles aux autres aux étapes.

Avec les suggestions précédentes, je recommanderais ceci:

Logez le code de déploiement artificiel dans une bibliothèque partagée.

gradle_artifactory.groovy

    appel def (Map parameters = [:]) {// mappage des paramètres facultatifs

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

    }

Ensuite pour garder vos pipelines déclaratifs 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 vous souhaitez incorporer de la logique dans le fichier Jenkins, la syntaxe déclarative n'est peut-être pas la meilleure méthode car il n'est pas toujours facile de la refléter dans le code.

Si vous passiez au pipeline scripté Jenkinsfile, vous seriez en mesure de définir et d'utiliser les conditions de manière plus simple.


1
Merci pour la réponse. Je connais le pipeline scripté mais depuis, c'est une nécessité de base pour tout projet pensé qu'il serait inclus dans le pipeline déclaratif. Reviendra ensuite au script groovy
scripté
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.