You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用不同Jenkins Agent镜像构建SpringBoot+Angular Pipeline报错求助

问题描述

我负责维护一个SpringBoot+Angular老项目,该项目已有数月未在Jenkins上构建。我没有Jenkins管理员权限,只能使用DevOps团队提供的Docker镜像作为Agent。我尝试设置agent none的Pipeline,分阶段用Maven+JDK镜像构建SpringBoot应用,再用Node镜像构建Angular项目,但执行时报错:

ERROR: Attempted to execute a step that requires a node context while ‘agent none’ was specified. Be sure to specify your own ‘node { ... }’ blocks when using ‘agent none’.

对应的Pipeline代码如下:

pipeline {
    agent none // Pas d'agent par défaut
    stages {
        stage('CleanWorkspace') {
            steps {
                script {
                    cleanWs()
                }
            }
        }
        stage('Checkout scm') {
            steps {
                // checking out git branch
                sh 'git checkout $BRANCH_SCOPE' 
            }
        }
        stage('Read POM Version') {
            steps {
                script {
                    def pomFile = readFile('./prism-ui/pom.xml')
                    def pomXml = new XmlSlurper().parseText(pomFile)
                    env.BUILDVERSION = pomXml.version.text()
                    def currentBranch = env.BRANCH_SCOPE
                    echo "The version in the POM is: ${env.BUILDVERSION}"
                }
            }
        }
        stage('Build Java Project') {
            agent {
                docker {
                    image 'tools/maven3/apache-maven-3.6.3-jdk1.11.34_101:1.1.4'
                    label 'generic-slave'
                }
            }
            steps {
                sh 'mvn --batch-mode -V -U -e clean deploy -P release -gs ../settings.xml -DskipTests'
                sh 'echo the build $BUILDVERSION from $BRANCH_SCOPE has been successfully deployed on artifactory'
            }
        }
        stage('Check npm Installation') {
            agent {
                docker {
                    image 'tools/nodejs/node-v22.10.0-linux-x64:1.0.0'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    def npmVersion = sh(script: 'npm -v', returnStdout: true).trim()
                    echo "npm version: ${npmVersion}"
                }
            }
        }
        stage('Build Angular Project') {
            agent {
                docker {
                    image 'tools/nodejs/node-v22.10.0-linux-x64:1.0.0'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    dir('angular-project-directory') {
                        sh '''
                            npm install
                            npm run build
                        '''
                    }
                }
            }
        }
    }
}
问题原因与修复方案

原因分析

当Pipeline设置agent none时,全局没有默认的节点/容器上下文。而CleanWorkspace、Checkout scm、Read POM Version这三个阶段未指定任何agent,其中的cleanWs()、sh、readFile等步骤必须在节点(node)上下文里才能执行,因此触发报错。

修复步骤

给这三个无agent配置的阶段指定一个可用的Docker镜像(比如使用Maven镜像,它包含基础工具链,能满足清理工作区、拉取代码、读取POM文件的需求),确保每个阶段都有节点上下文。

修改后的完整Pipeline代码

pipeline {
    agent none // 全局不设置默认agent
    stages {
        stage('CleanWorkspace') {
            // 添加agent配置,使用Maven镜像提供节点上下文
            agent {
                docker {
                    image 'tools/maven3/apache-maven-3.6.3-jdk1.11.34_101:1.1.4'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    cleanWs()
                }
            }
        }
        stage('Checkout scm') {
            // 复用Maven镜像执行git操作
            agent {
                docker {
                    image 'tools/maven3/apache-maven-3.6.3-jdk1.11.34_101:1.1.4'
                    label 'generic-slave'
                }
            }
            steps {
                // checking out git branch
                sh 'git checkout $BRANCH_SCOPE' 
            }
        }
        stage('Read POM Version') {
            // 复用Maven镜像读取POM文件
            agent {
                docker {
                    image 'tools/maven3/apache-maven-3.6.3-jdk1.11.34_101:1.1.4'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    def pomFile = readFile('./prism-ui/pom.xml')
                    def pomXml = new XmlSlurper().parseText(pomFile)
                    env.BUILDVERSION = pomXml.version.text()
                    def currentBranch = env.BRANCH_SCOPE
                    echo "The version in the POM is: ${env.BUILDVERSION}"
                }
            }
        }
        stage('Build Java Project') {
            agent {
                docker {
                    image 'tools/maven3/apache-maven-3.6.3-jdk1.11.34_101:1.1.4'
                    label 'generic-slave'
                }
            }
            steps {
                sh 'mvn --batch-mode -V -U -e clean deploy -P release -gs ../settings.xml -DskipTests'
                sh 'echo the build $BUILDVERSION from $BRANCH_SCOPE has been successfully deployed on artifactory'
            }
        }
        stage('Check npm Installation') {
            agent {
                docker {
                    image 'tools/nodejs/node-v22.10.0-linux-x64:1.0.0'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    def npmVersion = sh(script: 'npm -v', returnStdout: true).trim()
                    echo "npm version: ${npmVersion}"
                }
            }
        }
        stage('Build Angular Project') {
            agent {
                docker {
                    image 'tools/nodejs/node-v22.10.0-linux-x64:1.0.0'
                    label 'generic-slave'
                }
            }
            steps {
                script {
                    dir('angular-project-directory') {
                        sh '''
                            npm install
                            npm run build
                        '''
                    }
                }
            }
        }
    }
}

额外优化建议

如果DevOps团队有提供基础通用的Docker镜像(仅包含git、基础shell工具等),可以用它来替代Maven镜像执行前面三个阶段,减少镜像拉取的开销。

内容的提问来源于stack exchange,提问作者hafid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:17:03