[#2 Troubleshoot] Tool type "nodejs" does not have an install of "NodeJS 18"
Saya menemukan Error baru
Started by user widianto
Obtained Jenkinsfile from git http://172.16.10.128/widi/playwright.git
java.lang.NullPointerException: Cannot invoke "String.length()" because "this.b" is null
at hudson.util.EditDistance.calc(EditDistance.java:104)
at hudson.util.EditDistance.editDistance(EditDistance.java:45)
at hudson.util.EditDistance.findNearest(EditDistance.java:63)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.validator.ModelValidatorImpl$_validateElement_closure6.doCall(ModelValidatorImpl.groovy:196)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
at groovy.lang.Closure.call(Closure.java:420)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.callClosureForMapEntry(DefaultGroovyMethods.java:5361)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2202)
at org.codehaus.groovy.runtime.dgm$164.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.validator.ModelValidatorImpl.validateElement(ModelValidatorImpl.groovy:182)
at PluginClassLoader for pipeline-model-api//org.jenkinsci.plugins.pipeline.modeldefinition.ast.ModelASTTools.validate(ModelASTTools.java:31)
at PluginClassLoader for pipeline-model-api//org.jenkinsci.plugins.pipeline.modeldefinition.ast.ModelASTElement.validate(ModelASTElement.java:266)
at PluginClassLoader for pipeline-model-api//org.jenkinsci.plugins.pipeline.modeldefinition.ast.ModelASTElement.validate(ModelASTElement.java:257)
at PluginClassLoader for pipeline-model-api//org.jenkinsci.plugins.pipeline.modeldefinition.ast.ModelASTPipelineDef.validate(ModelASTPipelineDef.java:50)
at org.jenkinsci.plugins.pipeline.modeldefinition.ast.ModelASTMarkerInterface$validate$0.call(Unknown Source)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parsePipelineStep(ModelParser.groovy:307)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parse(ModelParser.groovy:180)
at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser$parse.callCurrent(Unknown Source)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parse(ModelParser.groovy:148)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parse(ModelParser.groovy)
at PluginClassLoader for pipeline-model-definition//org.jenkinsci.plugins.pipeline.modeldefinition.parser.GroovyShellDecoratorImpl$1.call(GroovyShellDecoratorImpl.java:78)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087)
Caused: BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' unexpected NullpointerException
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1092)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
at PluginClassLoader for script-security//org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox$Scope.parse(GroovySandbox.java:163)
at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:190)
at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:175)
at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:652)
at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:598)
at PluginClassLoader for workflow-job//org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
at hudson.model.ResourceController.execute(ResourceController.java:101)
at hudson.model.Executor.run(Executor.java:446)
Finished: FAILURE
Error tersebut:
java.lang.NullPointerException: Cannot invoke "String.length()" because "this.b" is null
dan bagian ini:Tool type "nodejs" does not have an install of "NodeJS 18"
adalah bug yang biasanya muncul karena konfigurasi pipeline memanggil tool nodejs 'NodeJS 18'
tetapi tidak valid atau ada format Jenkinsfile yang menyebabkan parser Jenkins crash.
✅ Solusi Langkah-demi-Langkah
🔧 1. Pastikan Konfigurasi Tools Benar
-
Masuk ke:
Manage Jenkins → Global Tool Configuration
-
Scroll ke bagian NodeJS
-
Harus ada satu tool bernama persis:
NodeJS 18
-
Pastikan tercentang ✅
Install automatically
, lalu pilih versi (misalnya:18.17.1
)
Kalau kamu sudah punya tool NodeJS, tapi namanya beda (misal: node18
atau default
), maka nodejs 'NodeJS 18'
di Jenkinsfile akan fail silently dan crash.
🔧 2. Coba Perbaiki Jenkinsfile
Kalau kamu ingin solusi cepat tanpa tergantung NodeJS tools Jenkins, kamu bisa hapus blok tools {}
dan langsung pakai node
/npm
dari PATH Jenkins.
Contoh Jenkinsfile versi tanpa tools block:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install dependencies') {
steps {
sh 'npm ci'
sh 'npx playwright install --with-deps'
}
}
stage('Run Playwright tests') {
steps {
sh 'npm test'
}
}
stage('Publish Report') {
steps {
publishHTML target: [
reportDir: 'playwright-report',
reportFiles: 'index.html',
reportName: 'Playwright Report'
]
}
}
}
}
Dengan begini:
-
Jenkins akan menggunakan
node
,npm
,npx
yang sudah tersedia di sistemnya. -
Tidak perlu rely pada konfigurasi NodeJS Tool dari Jenkins UI.
✅ Opsi Lain: Rename Tool di Jenkins
Kalau kamu tetap ingin pakai:
tools {
nodejs 'NodeJS 18'
}
Pastikan:
-
Nama NodeJS tool di Jenkins persis
NodeJS 18
-
Tidak boleh typo (misal:
NodeJs 18
,nodejs18
, ataunull
) -
Jika belum ada, tambahkan tool-nya
🚨 Kenapa Error Ini Terjadi?
Jenkins Groovy parser akan crash saat mencoba membandingkan string yang null
dalam bagian tools
, jika Jenkins tidak bisa resolve nama tool-nya. Ini bug lama di plugin pipeline-model-definition
.
✅ Kesimpulan
Aksi | Keterangan |
---|---|
🔧 Hapus tools {} |
Solusi paling cepat, selama node/npm sudah tersedia |
🛠 Atur NodeJS 18 di Jenkins UI |
Harus sama persis namanya |
🔁 Perbaiki Jenkinsfile | Gunakan versi minimalis dulu untuk testing |
Kalau kamu kirim isi Jenkinsfile
kamu sekarang, saya bisa bantu koreksi persis bagian mana yang menyebabkan crash. Mau bantu review?