Verwendung des Artifactory-Plugins in der deklarativen Jenkins-Pipeline


13

Ich verwende Jenkins Declarative Pipeline, um meinen Erstellungsprozess zu automatisieren. Wir möchten unsere Artefakte nur dann in einem Remote-JFrog-Repository veröffentlichen, wenn bestimmte Bedingungen (Sonar, Checkmarx) erfüllt sind.

Nach einigem Nachforschen habe ich festgestellt, dass das Artifactory-Plugin hierfür nützlich ist. Ich kann jedoch kein Dokument zur Integration in deklarative Pipelines finden. Unten ist das Code-Snippet von 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
            }

        }   
    }
}

Das bedingte Veröffentlichen ist mit dem obigen Code nicht möglich, da ich die Servervariable nicht wiederverwenden kann , auch wenn ich das automatische Veröffentlichen deaktiviere.

Antworten:


3

Sie können Bedingungen in Ihre deklarative Pipeline aufnehmen, indem Sie den when- Block innerhalb einer Stufe verwenden. Es gibt ein Plugin namens "Environment Injector", mit dem Sie Variablen außerhalb des Pipeline-Skripts setzen können. Wenn Sie den Schritt unter die anderen Schritte setzen, wird er nicht ausgeführt, wenn sie fehlschlagen.

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

Danke für den Tipp. Wenn ich verstanden habe, dass es richtig ist, muss eine Variable gesetzt werden, nachdem die Bedingungen erfüllt wurden, und dann diese Variable im Schritt vor dem
Erstellen

2

Ich denke, Ihr Problem liegt darin begründet, dass die Servervariable außerhalb des Pre-Build-Stage-Blocks nicht wiederverwendbar ist.

In Jenkins Deklarativ können Sie Variablen wie diese mit dem script { ... }Block definieren, aber sobald Sie die Bühne verlassen, sind diese Variablen für andere Bühnen nicht mehr zugänglich.

Mit den vorherigen Vorschlägen würde ich Folgendes empfehlen:

Platzieren Sie den artifactory-Bereitstellungscode in einer freigegebenen Bibliothek.

gradle_artifactory.groovy

    def call (Map parameters = [:]) {// optionale Parameterzuordnung

        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', Aufgaben: 'clean artifactoryPublish'

    }

Dann behalten Sie Ihre deklarativen Pipelines 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

Wenn Sie Logik in die Jenkins-Datei einbetten möchten, ist die deklarative Syntax möglicherweise nicht die beste Methode, da es nicht immer einfach ist, sie im Code wiederzugeben.

Wenn Sie zur Skript-Pipeline Jenkinsfile wechseln, können Sie Bedingungen auf einfachere Weise definieren und verwenden.


1
Danke für die Antwort. Mir ist die Skript-Pipeline bekannt, aber da dies eine Grundvoraussetzung für jedes Projekt ist, von dem angenommen wird, dass es in der deklarativen Pipeline enthalten ist.
Wechselt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.