Mengakses variabel di dalam badan penutupan pipa jenkins

Saya telah membuat perpustakaan bersama pipa untuk membuat hash ruang kerja sehingga kita menghindari masalah panjang jalur pada build windows kita:

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)
}

yang ingin saya gunakan seperti ini:

node('windows') {

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

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

Namun ini gagal karena variabel scm adalah nol. Saya telah berhasil memperbaikinya dengan mengubah ini:

node('windows') {

    def scm = scm

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

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

Namun ini kikuk dan tidak berfungsi untuk semua kasus. Misalnya kami juga menggunakan artefaktori dan ketika mencoba menggunakan ini:

def server = Artifactory.server('advancedcsg')

Saya mendapatkan pengecualian berikut:

java.lang.NullPointerException: Tidak dapat memanggil metode server() pada objek null

Jika saya mencoba "trik" dengan melakukan:

def Artifactory = Artifactory

Saya mendapatkan pengecualian ini:

java.lang.UnsupportedOperationException: Menolak marshal org.codehaus.groovy.runtime.GStringImpl karena alasan keamanan

Dapatkah seseorang membantu menjelaskan apa yang terjadi di sini dan kesalahan apa yang saya lakukan?


person caveman_dick    schedule 23.06.2017    source sumber


Jawaban (1)


Saya tidak tahu skrip pipa Jenkins, tetapi dengan pengetahuan Groovy dan apa yang Anda jelaskan, masalahnya adalah Anda memberikan penutupan ke wsHash dan mengatur delegasi ke peta kosong (config), jadi scm diminta darinya dan dan kembali null tentu saja.

Saya kira jika Anda memberi nama it parameter penutupan simpul secara eksplisit dan menggunakannya, itu akan berfungsi, seperti:

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

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

Kesalahan lain yang Anda dapatkan, kesalahan Refusing to marshal kemungkinan besar disebabkan oleh bagian lain dalam saluran Anda di mana Anda memiliki sesuatu seperti "foo $bar baz" yang merupakan GString dan Anda memerlukan String sebagai gantinya, jadi gunakan "foo $bar baz" as String sebagai gantinya dan bagian dinamis akan segera teratasi dan diubah ke objek String biasa.

person Vampire    schedule 23.06.2017