最近在寫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的方法。