Skip to main content

[#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, atau null)

  • 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?