Ошибка настройки Node.js в конвейере Jenkins с использованием плагина NodeJS

Вопрос или проблема

Я учу Jenkins и работаю над настройкой базового пайплайна, чтобы практиковаться в CI/CD с простым проектом на React. Пайплайн предназначен для:

Получения последнего коммита из GitHub.
Использования плагина Jenkins NodeJS для установки Node.js.
Сборки и публикации проекта на Docker Hub.
Однако у меня возникла проблема на этапе настройки Node.js. Ошибка, похоже, указывает на то, что шаг nodejs должен быть вызван с телом, но я не совсем понимаю, что это значит и как это исправить.

код:

node {
    stage('Checkout') {
        checkout([$class: 'GitSCM', branches: [[name: '*/main']],
            userRemoteConfigs: [[url: 'my_repo_credentials']],
            extensions: [[$class: 'UserIdentity', name: 'DSL User', email: '[email protected]']]
        ])
    }

    properties([
        pipelineTriggers([[$class: 'SCMTrigger', scmpoll_spec: 'H/5 * * * *']])
    ])

    stage('Setup Node.js') {
        echo "Начинается настройка Node.js"
        nodejs('nodejs') 
        echo "Настройка Node.js завершена"
    }

    stage('Docker Build and Publish') {
        script {
            docker.withRegistry('https://registry.hub.docker.com', 'dockerhub') {
                def image = docker.build("my_docker_container_repo:latest")
                image.push("latest") 
            }
        }
    }
}

**Вывод ошибки:**

Начинается настройка Node.js
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] Конец пайплайна
java.lang.IllegalStateException: шаг nodejs должен быть вызван с телом
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:250)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.DSL.invokeDescribable(DSL.java:503)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:199)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:124)
    at jdk.internal.reflect.GeneratedMethodAccessor186.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 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSiteArray.java:116)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:180)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
    at PluginClassLoader for script-security//org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:163)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:178)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:182)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.LoggingInvoker.methodCall(LoggingInvoker.java:117)
Также:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: f05358ff-164e-4ca8-bf88-80d3cf00a106
Причина: java.lang.IllegalArgumentException: Не удалось подготовить шаг nodejs
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.DSL.invokeDescribable(DSL.java:505)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:199)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:124)
    at jdk.internal.reflect.GeneratedMethodAccessor186.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 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.call(0))
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.call(0))
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.call(0))
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:180)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
    at PluginClassLoader for script-security//org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:163)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:178)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:182)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152)
    at PluginClassLoader for script-security//org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.LoggingInvoker.methodCall(LoggingInvoker.java:117)
    at WorkflowScript.run(WorkflowScript:18)
    at ___cps.transform___(Native Method)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:90)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:116)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:85)
    at jdk.internal.reflect.GeneratedMethodAccessor185.invoke(Unknown Source)
    at java.base/java.lang.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at PluginClassLoader for workflow-cps//com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:147)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:17)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:49)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:180)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:422)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:330)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:294)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService.lambda$wrap$4(CpsVmExecutorService.java:140)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.call(CpsVmExecutorService.java:53)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.call(CpsVmExecutorService.java:50)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:136)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:275)
    at PluginClassLoader for workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService.lambda$categoryThreadFactory$0(CpsVmExecutorService.java:50)
    at java.base/java.lang.Thread.run(Unknown Source) 

Ответ или решение

Ошибка при настройке Node.js в Jenkins с использованием плагина NodeJS может быть стрессовой ситуацией, особенно для начинающих. Ваша ошибка явно указывает на то, что вызов шага nodejs должен содержать тело. Давайте разберем это более подробно и предложим решение.

Анализ проблемы

Ваше использование плагина NodeJS выглядит следующим образом:

stage('Setup Node.js') {
    echo "Starting Node.js Setup"
    nodejs('nodejs') 
    echo "Node.js Setup Complete"
}

При этом возникает ошибка:

java.lang.IllegalStateException: nodejs step must be called with a body

Эта ошибка говорит о том, что метод nodejs должен обрабатывать блок кода, предоставляемый вам, внутри фигурных скобок {}. В данном случае, вы просто вызываете nodejs('nodejs') без тела. Чтобы исправить это, необходимо поместить ваши команды по настройке Node.js внутри блока.

Рекомендованное решение

Ниже представлено исправленное решение для вашей стадии настройки Node.js:

stage('Setup Node.js') {
    echo "Starting Node.js Setup"
    nodejs('nodejs') {
        // Ваши команды, которые нужно выполнить в рамках стадии установки Node.js
        // Например, установка зависимостей вашего проекта
        sh 'npm install'
    }
    echo "Node.js Setup Complete"
}

В примере выше команда npm install выполняется внутри тела шага nodejs. Это позволяет безопасно работать с установленной версией Node.js.

Дополнительные шаги

Ниже приведены дополнительные рекомендации, которые могут помочь в настройке вашей CI/CD пайплайна:

  1. Проверьте список установленных версий Node.js в Jenkins. Убедитесь, что версия, указанная в nodejs('nodejs'), существует и правильно настроена в Jenkins. Это можно сделать в разделе конфигурации системы Jenkins (Manage Jenkins > Global Tool Configuration).

  2. Настройка окружения. Убедитесь, что у вас установлены все необходимые переменные среды для корректной работы Node.js и npm, такие как NODE_ENV.

  3. Docker настроен правильно. Ваша стадия Docker Build and Publish также должна быть внимательно проверена. Убедитесь, что у вас есть доступ к DockerHub и правильные учетные данные для аутентификации.

  4. Логи Jenkins. Если ошибки продолжаются, посмотрите на логи Jenkins для более глубокого анализа.

Заключение

При успешной реализации вышеприведенных изменений ваша пайплайн должен заработать корректно. Не забывайте тестировать каждую стадию по отдельности и проверять, что установки проходят успешно, прежде чем продолжать на следующие шаги. Это поможет вам лучше понять весь процесс CI/CD и устранить возможные проблемы.

Если у вас возникли дополнительные вопросы или требуется уточнение, не стесняйтесь задавать их! Удачи в вашем обучении Jenkins и разработке CI/CD пайплайнов!

Оцените материал
Добавить комментарий

Капча загружается...