Korzystanie z wtyczki Artifactory w potoku deklaracyjnym Jenkinsa


13

Używam deklaratywnego potoku Jenkins do automatyzacji procesu kompilacji. Chcemy opublikować nasze artefakty w zdalnym repozytorium JFrog tylko wtedy, gdy spełnione zostaną określone warunki (Sonar, Checkmarx).

Po kilku badaniach odkryłem, że wtyczka Artifactory jest do tego przydatna. Ale nie jestem w stanie znaleźć żadnego dokumentu na temat sposobu integracji z deklaratywnym potokiem. Poniżej znajduje się fragment kodu z 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
            }

        }   
    }
}

Publikowanie warunkowe nie jest możliwe z powyższym kodem, ponieważ nie mogę ponownie użyć zmiennej serwera , nawet jeśli wyłączę automatyczne publikowanie.

Odpowiedzi:


3

Możesz mieć warunkowe w swoim deklaratywnym potoku, korzystając z opcji when -block na etapie. Istnieje wtyczka o nazwie „środowiskowy iniektor”, która pozwala ustawić zmienne poza skryptem potoku, co jest miłe. Również jeśli umieścisz krok poniżej innych kroków, nie wykona się, jeśli się nie powiedzie.

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

Dzięki za podpowiedź. Jeśli dobrze to zrozumiałem, zmienna musi zostać ustawiona po spełnieniu warunków, a następnie sprawdź tę zmienną w kroku Przed kompilacją
Dharanidhar,

2

Myślę, że twój problem jest zakorzeniony w zmiennej serwera , która nie nadaje się do ponownego użycia poza blokiem etapu przed kompilacją.

W deklaratywnej Jenkinsie można definiować takie zmienne za pomocą script { ... }bloku, ale kiedy opuścisz scenę, te zmienne są niedostępne dla innych etapów.

Z poprzednimi sugestiami poleciłbym to:

Umieść sztuczny kod wdrażania w bibliotece współużytkowanej.

gradle_artifactory.groovy

    def call (Parametry mapy = [:]) {// opcjonalne mapowanie parametrów

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

    }

Następnie, aby zachować deklaratywne potoki D.R.Y

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

referencje:

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

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


1

Jeśli chcesz osadzić logikę w pliku Jenkinsa, deklaratywna składnia może nie być najlepszą metodą, ponieważ nie zawsze jest to łatwe do odzwierciedlenia w kodzie.

Jeśli przełączysz się na potok skryptowy Jenkinsfile, będziesz w stanie łatwiej definiować i używać warunków.


1
Dziękuję za odpowiedź. Zdaję sobie sprawę ze skryptowego potoku, ale ponieważ jest to podstawowa konieczność każdego projektu, który pomyślałby, że zostanie on włączony do deklaratywnego potoku. Następnie wróci do Skryptu lub zewnętrznego groovy script
Dharanidhar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.