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

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的转义冲突:

  1. 在项目根目录创建脚本文件:
#!/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
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:31