การเข้าถึงตัวแปรภายในตัวปิดไปป์ไลน์ของเจนกินส์

ฉันได้สร้างไลบรารี่ที่ใช้ร่วมกันไปป์ไลน์เพื่อสร้างแฮชพื้นที่ทำงานเพื่อหลีกเลี่ยงปัญหาความยาวเส้นทางบนบิลด์ windows ของเรา:

import java.security.MessageDigest

def call(body) {
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config

    ws(getWsHash(config.length ?: 10)) {
        body()
    }
}

def getWsHash(length) {
    def md5Hash = MessageDigest.getInstance("MD5").digest("${env.JOB_NAME}_${env.EXECUTOR_NUMBER}".bytes).encodeHex().toString()
    return md5Hash.substring(0,10)
}

ซึ่งฉันต้องการใช้แบบนี้:

node('windows') {

    wsHash {
        stage('Checkout') {
            checkout scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}

อย่างไรก็ตาม สิ่งนี้ล้มเหลวเนื่องจากตัวแปร scm เป็นโมฆะ ฉันจัดการเพื่อแก้ไขโดยเปลี่ยนเป็นสิ่งนี้:

node('windows') {

    def scm = scm

    wsHash {
        stage('Checkout') {
            checkout scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}

อย่างไรก็ตาม นี่เป็นเรื่องยุ่งยากและใช้งานไม่ได้กับทุกกรณี ตัวอย่างเช่น เรายังใช้ artifactory และเมื่อพยายามใช้สิ่งนี้:

def server = Artifactory.server('advancedcsg')

ฉันได้รับข้อยกเว้นต่อไปนี้:

java.lang.NullPointerException: ไม่สามารถเรียกใช้เมธอดเซิร์ฟเวอร์ () บนวัตถุ null

ถ้าฉันลองใช้ "เคล็ดลับ" โดยทำ:

def Artifactory = Artifactory

ฉันได้รับข้อยกเว้นนี้:

java.lang.UnsupportedOperationException: ปฏิเสธที่จะ marshal org.codehaus.groovy.runtime.GStringImpl ด้วยเหตุผลด้านความปลอดภัย

ใครช่วยอธิบายสิ่งที่เกิดขึ้นที่นี่และสิ่งที่ฉันทำผิดได้ไหม


person caveman_dick    schedule 23.06.2017    source แหล่งที่มา


คำตอบ (1)


ฉันไม่รู้จักสคริปต์ไปป์ไลน์ของ Jenkins แต่ด้วยความรู้ของ Groovy และสิ่งที่คุณอธิบาย ปัญหาคือคุณให้การปิด wsHash และตั้งค่าผู้รับมอบสิทธิ์เป็นแผนที่ว่าง (config) ดังนั้นจึงขอ scm จากมันและและส่งกลับ null แน่นอน

ฉันเดาว่าถ้าคุณตั้งชื่อพารามิเตอร์ it ของการปิดโหนดอย่างชัดเจนและใช้ว่ามันควรจะใช้งานได้เช่น:

node('windows') { windowsNode ->
    wsHash {
        stage('Checkout') {
            checkout windowsNode.scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}

ข้อผิดพลาดอื่นๆ ที่คุณได้รับ ข้อผิดพลาด Refusing to marshal น่าจะเกิดจากส่วนอื่นในไปป์ไลน์ของคุณ โดยที่คุณมีบางอย่างเช่น "foo $bar baz" ซึ่งก็คือ GString และคุณต้องการ String แทน ดังนั้นให้ใช้ "foo $bar baz" as String แทน และส่วนไดนามิกจะได้รับการแก้ไขทันทีและเปลี่ยนรูปแบบ ไปยังวัตถุ String ธรรมดา

person Vampire    schedule 23.06.2017