2017-02-17 216 views
30

我在Jenkins有一個管道腳本。Jenkins管道腳本對@NonCPS有什麼影響

我用得到這個異常:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 腳本不得使用方法groovy.json.JsonSlurperClassic parseText java.lang.String中

我看起來異常了,我發現一些跡象表明,我應該註釋與@NonCPS發生異常的方法。我做了這件事,但沒有真正理解這件事。

然後,然後,我拋出該方法的例外不再被try子句捕獲。

那麼@NonCPS背後的想法是什麼?使用它有什麼影響?

回答

37

你看到的例外是由於script security和沙箱。基本上,默認情況下,當你運行一個管道腳本時,它運行在一個只允許使用某些方法和類的沙箱中。有白名單操作的方法,檢查上面的鏈接。

當您有使用不可序列化的對象的方法時,@NonCPS註釋非常有用。通常情況下,您在管道腳本中創建的所有對象都必須是可序列化的(原因是Jenkins必須能夠序列化腳本的狀態,以便它可以暫停並存儲在磁盤上)。

當您將@NonCPS放在方法上時,Jenkins將一次執行整個方法而無法暫停。此外,您也不允許在@NonCPS帶註釋的方法中引用任何流水線步驟或CPS轉換方法。 More information about this can be found here

至於異常處理:不是100%確定你正在經歷什麼;我試過以下,它按預期工作:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

try { 
    myFunction(); 
} catch (Exception e) { 
    echo "Caught"; 
} 

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

最後:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

@NonCPS 
def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

所有打印 「中招」 的預期。