Jenkins流水线向Shell中Maven插件传参失败问题求助
Jenkins流水线执行Cucumber测试参数传递问题解决
问题重现
在Jenkins流水线中执行如下命令调用Cucumber测试:
sh '''mvn spring-boot:start \ exec:java \ -Dexec.classpathScope=test \ -Dexec.mainClass=io.cucumber.core.cli.Main \ -Dexec.args=\\"src/test-bdd/resources/features/set02 --glue gluepackage\\" \ spring-boot:stop '''
执行后出现错误:
20:39:31 + mvn spring-boot:start exec:java -Dexec.classpathScope=test -Dexec.mainClass=io.cucumber.core.cli.Main -Dexec.args="src/test-bdd/resources/features/set02 --glue gluepackage" spring-boot:stop 20:39:31 Unable to parse command line options: Unrecognized option: --glue 20:39:31 20:39:31 usage: mvn [options] [<goal(s)>] [<phase(s)>]
本地终端直接复制生成的命令可正常执行,但Jenkins中Shell会将--glue解析为Maven的参数,而非传递给Cucumber的exec.args。
解决方案
方案1:调整Groovy字符串与引号转义
改用Groovy双引号包裹Shell命令,内部用单引号传递exec.args的参数,避免转义冲突:
sh """mvn spring-boot:start \ exec:java \ -Dexec.classpathScope=test \ -Dexec.mainClass=io.cucumber.core.cli.Main \ -Dexec.args='src/test-bdd/resources/features/set02 --glue gluepackage' \ spring-boot:stop """
原理:Groovy的双引号字符串("")允许内部直接使用单引号,无需额外转义,Shell执行时会将单引号内的内容完整传递给exec.args。
方案2:使用独立Shell脚本
将命令写入单独的Shell脚本文件(如run-cucumber-tests.sh),避免Groovy与Shell的转义冲突:
- 在项目根目录创建脚本文件:
#!/bin/bash mvn spring-boot:start \ exec:java \ -Dexec.classpathScope=test \ -Dexec.mainClass=io.cucumber.core.cli.Main \ -Dexec.args="src/test-bdd/resources/features/set02 --glue gluepackage" \ spring-boot:stop
- 在Jenkins流水线中添加执行步骤:
sh 'chmod +x run-cucumber-tests.sh' sh './run-cucumber-tests.sh'
原理:独立脚本的引号规则由Shell直接解析,不会受到Groovy字符串转义的干扰。
方案3:通过环境变量传递参数
将Cucumber参数存入环境变量,再在命令中引用:
env.CUCUMBER_ARGS = "src/test-bdd/resources/features/set02 --glue gluepackage" sh '''mvn spring-boot:start \ exec:java \ -Dexec.classpathScope=test \ -Dexec.mainClass=io.cucumber.core.cli.Main \ -Dexec.args="$CUCUMBER_ARGS" \ spring-boot:stop '''
原理:环境变量在Shell执行时会被正确替换,且引号会将变量内容作为整体传递。
内容的提问来源于stack exchange,提问作者hicnar
相关产品推荐
相关产品推荐

