ใช้ปลั๊กอิน Artifactory ในไปป์ไลน์ของ Jenkins


13

ฉันใช้ Jenkins Declarative Pipeline เพื่อสร้างกระบวนการสร้างของฉันโดยอัตโนมัติ เราต้องการเผยแพร่สิ่งประดิษฐ์ของเราไปยังที่เก็บ JFrog ระยะไกลเฉพาะเมื่อผ่านเงื่อนไขบางอย่าง (Sonar, Checkmarx)

หลังจากการวิจัยเล็กน้อยฉันพบว่าปลั๊กอิน Artifactory มีประโยชน์สำหรับสิ่งนี้ แต่ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับวิธีการรวมในขั้นตอนการประกาศ ด้านล่างนี้เป็นข้อมูลโค้ดจาก 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
            }

        }   
    }
}

การเผยแพร่แบบมีเงื่อนไขไม่สามารถทำได้ด้วยรหัสด้านบนเนื่องจากฉันไม่สามารถใช้ตัวแปรเซิร์ฟเวอร์ซ้ำได้แม้ว่าฉันจะปิดการใช้งานการเผยแพร่อัตโนมัติ

คำตอบ:


3

คุณสามารถมีเงื่อนไขในขั้นตอนการประกาศของคุณโดยใช้เมื่อ -block ภายในเวที มีปลั๊กอินที่เรียกว่า "environment injector" ซึ่งให้คุณตั้งค่าตัวแปรภายนอกของสคริปต์ไปป์ไลน์ซึ่งดี นอกจากนี้หากคุณวางขั้นตอนด้านล่างขั้นตอนอื่น ๆ จะไม่ดำเนินการหากล้มเหลว

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

ขอบคุณสำหรับคำใบ้ ถ้าฉันเข้าใจถูกต้องตัวแปรจะต้องมีการตั้งค่าหลังจากเงื่อนไขตรงตามเงื่อนไขและจากนั้นตรวจสอบตัวแปรนั้นในขั้นตอนการสร้างล่วงหน้า
Dharanidhar

2

ฉันคิดว่าปัญหาของคุณได้รับการรูทในตัวแปรเซิร์ฟเวอร์ที่ไม่สามารถนำมาใช้ซ้ำนอกบล็อกระยะก่อนสร้าง

ในการประกาศ Jenkins คุณสามารถกำหนดตัวแปรเช่นนั้นโดยใช้script { ... }บล็อกได้ แต่เมื่อคุณออกจากสเตจแล้วตัวแปรเหล่านั้นจะไม่สามารถเข้าถึงได้กับสเตจอื่น

ด้วยคำแนะนำก่อนหน้านี้ฉันจะแนะนำสิ่งนี้:

กำหนดรหัสการปรับใช้วัตถุโบราณไปยังไลบรารีที่ใช้ร่วมกัน

gradle_artifactory.groovy

    def call (แม็พพารามิเตอร์ = [:]) {// การแม็พพารามิเตอร์ทางเลือก

        def server = Artifactory.server 'LocalJfrog'
        def rtGradle = Artifactory.newGradleBuild ()
        เซิร์ฟเวอร์ rtGradle.resolver: เซิร์ฟเวอร์, repo: 'gradle-dev-local'
        เซิร์ฟเวอร์ rtGradle.deployer: เซิร์ฟเวอร์, repo: 'gradle-release-local'
        rtGradle.useWrapper = true
        def buildInfo = rtGradle.run rootDir: "projectDir /", buildFile: 
            'build.gradle', ภารกิจ: 'cleanifactoryoryPublish'

    }

จากนั้นให้เก็บรักษาท่อส่งของคุณ 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

หากคุณต้องการฝังตรรกะใน Jenkinsfile ไวยากรณ์การประกาศอาจไม่ใช่วิธีที่ดีที่สุดเนื่องจากไม่ใช่การสะท้อนในรหัสเสมอไป

หากคุณเปลี่ยนไปที่ขั้นตอนการสคริปต์ของ Jenkinsfile คุณจะสามารถกำหนดและใช้เงื่อนไขได้ง่ายขึ้น


1
ขอบคุณสำหรับการตอบกลับ. ฉันทราบถึงขั้นตอนการเขียนสคริปต์ แต่เนื่องจากนี่เป็นความจำเป็นขั้นพื้นฐานสำหรับโครงการใด ๆ ที่คิดว่าจะรวมอยู่ในขั้นตอนการประกาศ จะเปลี่ยนกลับไปเป็นสคริปต์แบบ Groovy แบบสคริปต์หรือแบบภายนอก
Dharanidhar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.