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.