Menggunakan plugin Artifactory dalam pipa deklaratif Jenkins

13

Saya menggunakan Jenkins Declarative Pipeline untuk mengotomatiskan proses pembuatan saya. Kami ingin menerbitkan artefak kami ke repositori JFrog jarak jauh hanya jika kondisi tertentu (Sonar, Checkmarx) lulus.

Setelah sedikit riset, saya menemukan bahwa plugin Artifactory berguna untuk ini. Tetapi saya tidak dapat menemukan dokumen tentang bagaimana mengintegrasikan dalam pipa deklaratif. Di bawah ini adalah cuplikan kode dari 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
            }

        }   
    }
}

Publikasi bersyarat tidak dimungkinkan dengan kode di atas karena saya tidak dapat menggunakan kembali variabel server walaupun saya menonaktifkan publikasi otomatis.

Dharanidhar
sumber

Jawaban:

3

Anda dapat memiliki persyaratan dalam pipa deklaratif Anda dengan menggunakan kapan -block di dalam panggung. Ada plugin yang disebut "environment injector" yang memungkinkan Anda mengatur variabel di luar skrip pipa yang bagus. Juga jika Anda meletakkan langkah di bawah langkah-langkah lain, itu tidak akan dijalankan jika gagal.

 when {
    environment name: 'pushArtifact', value: 'true'
  }
  steps{
     //push artifact  
  }
Jesper Olsson
sumber
Terima kasih atas petunjuknya. Jika saya memahaminya dengan benar, sebuah variabel harus ditetapkan setelah kondisi dipenuhi dan kemudian periksa variabel itu dalam langkah Pra-Bangun
Dharanidhar
2

Saya pikir masalah Anda berakar pada variabel server yang tidak dapat digunakan kembali di luar blok tahap pra-bangun.

Dalam Jenkins deklaratif, Anda bisa mendefinisikan variabel seperti itu menggunakan script { ... }blok, tetapi begitu Anda meninggalkan tahap, variabel-variabel itu tidak dapat diakses ke tahap lainnya.

Dengan saran sebelumnya, saya akan merekomendasikan ini:

Tempatkan kode penyebaran artifactory ke perpustakaan bersama.

gradle_artifactory.groovy

    panggilan def (Parameter peta = [:]) {// pemetaan parameter opsional

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

    }

Kemudian untuk menjaga pipa deklaratif Anda D.R.Y

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

referensi:

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

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

Elektrolit
sumber
1

Jika Anda ingin menanamkan logika dalam Jenkinsfile, sintaksis deklaratif mungkin bukan metode terbaik karena tidak selalu mudah untuk mencerminkannya dalam kode.

Jika Anda beralih ke pipa skrip Jenkinsfile, Anda akan dapat mendefinisikan dan menggunakan kondisi dengan cara yang lebih mudah.

Michael Pereira
sumber
1
Terima kasih balasannya. Saya mengetahui pipeline scripted tetapi karena, ini adalah kebutuhan dasar untuk setiap proyek yang akan dimasukkan dalam pipeline declarative. Akan beralih kembali ke Script atau skrip asyik eksternal kemudian
Dharanidhar