使用不同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

