![](/img/trans.png)
[英]Jenkinsfile java.lang.NullPointerException: Cannot invoke method <printpn()> on null object
[英]Jenkinsfile - Jenkins build user getUserName() NullPointerException: Cannot invoke method getUserName() on null object Mutli Branch Indexing Scanning
Jenkins 2.138.1.2-rolling --and-- 使用MultiBranch Pipeline (從主、分支和拉取請求等構建構建)。
我想顯示在構建描述中啟動構建的 Jenkins 構建作業的用戶。
為了實現相同的功能,在我的Jenkinsfile
中,我在頂部有以下代碼:
@NonCPS
def getBuildUser() {
def build = currentBuild.rawBuild
def cause = build.getCause(hudson.model.Cause.UserIdCause.class)
def BUILD_USER = cause.getUserName()
return BUILD_USER
}
pipeline {
...
}
Class 定義: https://javadoc.jenkins-ci.org/hudson/model/Cause.UserIdCause.html顯示該方法在類中未棄用。
在 Jenkinsfile 的階段部分下,我有以下代碼,它成功地實現了這一點。
stages {
stage ('Start') {
steps {
script {
// Set Build Description
def BUILD_USER= getBuildUser()
currentBuild.description = "${BUILD_USER}: ${RELEASE_TAG} => ${DOCKER_IMAGES}"
}
sh '''
set +x
echo -e "\n\n-- Starting build process.\n"
'''
}
}
.. more stages are here ..
}
當我使用多分支管道作業時,我看到了所有分支/PR,包括 master,在側邊欄上,我看到了以下鏈接:
我看到有時構建失敗並出現以下錯誤,即java.lang.NullPointerException: Cannot invoke method getUserName() on null object
[Bitbucket] Build result notified
java.lang.NullPointerException: Cannot invoke method getUserName() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:158)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:160)
at org.kohsuke.groovy.sandbox.impl.Checker$checkedCall$1.callStatic(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
at WorkflowScript.getBuildUser(WorkflowScript:5)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:158)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:157)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:156)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:160)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:125)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:130)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.run(WorkflowScript:75)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:77)
at sun.reflect.GeneratedMethodAccessor333.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
at com.cloudbees.groovy.cps.Next.step(Next.java:83)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:347)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:259)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:247)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Finished: FAILURE
我注意到,僅當Multi-Branch Scanning
/ Branch Indexing
在后台運行時才會發生這種情況,因為所有失敗的構建都在該構建號的控制台頁面中列出了以下內容。
對於帶有構建描述的成功構建和所有,上面的“ BRANCH INDEXING ”框是不可見的(針對成功的構建#)。
為什么我得到這個java.lang.NullPointerException: Cannot invoke method getUserName() on null object
錯誤(當我正在掃描以避免構建失敗時)
PS :要重新創建此問題,用戶只需單擊
Scan Multibranch Pipeline Now的側邊欄圖標/鏈接,這將導致構建失敗,控制台 output 顯示:
PS :安裝一個新插件可能需要一些時間(1-2 周)/掃描/安全團隊的批准過程,所以我認為這不是一個選項,至少在獲得批准之前是這樣。 例如: https://plugins.jenkins.io/build-user-vars-plugin/
為了避免構建失敗,目前,我啟用了try
並catch
並設置 BUILD_USER 的值,如果getCause(...)
將失敗...就像當有人點擊側欄鏈接Scan MultiBranch Pipeline Now
,然后控制台 output或 Jenkins未設置單擊該側邊欄鏈接以啟動構建的用戶(如果要構建任何更改)並將Branch Indexing
顯示為 output 中的第一行(而不是顯示: Started by user <some name> (someUserID)
)。
因此,以下將 BUILD_USER 設置為有意義的值,並且不會使構建失敗。
@NonCPS
def getBuildUser() {
def build = currentBuild.rawBuild
def BUILD_USER = "ToBeSet"
try {
def cause = build.getCause(hudson.model.Cause.UserIdCause.class)
BUILD_USER = cause.getUserName()
} catch(Exception ex) {
println "\n\n-- Build caused by either Multi-Branch Pipeline Scanning -or- Timer i.e. not directly by a logged in user\n";
BUILD_USER = "Multi_Branch_Scan_or_Timer"
}
return BUILD_USER
}
我仍然想知道是否有辦法,我們可以找到,點擊側邊欄鏈接(登錄用戶)的人會戳進去。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.