Jenkins踩坑之旅:使用Date物件產生RejectedAccessException

滕瑞發表於2019-07-05

最近在寫pipeline時踩到一小坑,記錄如下。

程式碼需求比較簡單:記錄一個測試執行的時間,原型如下。

pipeline {
    agent none
    stages {
        stage('Example') {
            steps {
                script {
                    def startTime = new Date()
                    sleep 1
                    def endTime = new Date()
                    println (endTime.getTime() - startTime.getTime()) / 1000 as Integer
                }
            }
        }
    }
}

一般加入一個新的方法時,Jenkins會提示scriptApproval,然後需要人工批准這個方法。但是有的時候這個提示不會出現,而且pipeline是可以正常執行的,只是偶爾會丟擲RejectedAccessException異常。

網上搜尋也有人遇到了類似的問題,並且暫時沒有解決方法。

https://stackoverflow.com/questions/50819298/jenkins-pipeline-exception-when-using-date-object

而對於具體問題,則可以繞開這個問題,解決方法是用其他方法獲取時間。

pipeline {
    agent none
    stages {
        stage('Example') {
            steps {
                script {
                    def startTime = currentBuild.duration
                    sleep 1
                    def endTime = currentBuild.duration
                    println (endTime - startTime) / 1000 as Integer
                }
            }
        }
    }
}

參考: https://opensource.triology.de/jenkins/pipeline-syntax/globals

結論:Jenkins pipeline雖然用的是Groovy的語法,但畢竟被Jenkins封裝過,有著種種限制。所以儘量使用pipeline syntax及Jenkins自己的變數,而不是使用Groovy及Java的方法。

相關文章