在Jenkinsfile中执行Docker命令时出现exception

我有一个基于Nightwatch.js end2endtesting项目,它是一个NodeJS框架。 我想为我的项目使用'Jenkinsfile'为我的end2endtesting构build一个pipe道,通过Docker containerJenkins执行它们。 所以,我想启动一个Docker container并执行这个Docker container的testing。 这应该通过Jenkinsfile来实现。 当我不使用Jenkinsfile而是直接在手动创build的作业中使用shell commands时,一切都很完美。 在使用Jenkinsfile我在运行pipe道时遇到MultipleCompilationErrorsException ,我不知道为什么。

这是我的Jenkinsfile

 pipeline { agent any parameters { text(defaultValue: 'grme/nightwatch-chrome-firefox:0.0.3', description: '', name: 'docker_image') text(defaultValue: 'npm-test-chrome', description: '', name: 'run_script_method') text(defaultValue: '/Applications/Docker.app/Contents/Resources/bin/docker', description: '', name: 'docker') } stages { stage('Test') { steps { sh 'sudo chmod -R 777 $(pwd)' echo "------ stop all Docker containers ------" sh '(sudo ${params.docker} stop $(sudo ${params.docker} ps -a -q) || echo "------ all Docker containers are still stopped ------")' echo "------ remove all Docker containers ------" sh '(sudo ${params.docker} rm $(sudo ${params.docker} ps -a -q) || sudo echo "------ all Docker containers are still removed ------")' echo "------ pull Docker image from Docker Cloud ------" sh 'sudo ${params.docker} pull "${params.docker_image}"' echo "------ start Docker container from image ------" sh 'sudo ${params.docker} run -d -t -i -v $(pwd):/my_tests/ "${params.docker_image}" /bin/bash' echo "------ execute end2end tests on Docker container ------" sh 'sudo ${params.docker} exec -i $(sudo ${params.docker} ps --format "{{.Names}}") bash -c "cd /my_tests && xvfb-run --server-args='-screen 0 1600x1200x24' npm run ${params.run_script_method} || true && google-chrome --version && firefox --version"' echo "------ cleanup all temporary files ------" sh 'sudo rm -Rf $(pwd)/tmp-*' sh 'sudo rm -Rf $(pwd)/.com.google*' sh 'sudo rm -Rf $(pwd)/rust_mozprofile*' sh 'sudo rm -Rf $(pwd)/.org.chromium*' echo "------ stop all Docker containers again ------" sh '(sudo ${params.docker} stop $(sudo ${params.docker} ps -a -q) || sudo echo "------ all Docker containers are still stopped ------")' echo "------ remove all Docker containers again ------" sh '(sudo ${params.docker} rm $(sudo ${params.docker} ps -a -q) || sudo echo "------ all Docker containers are still removed ------")' } } } } 

这是运行pipe道时得到的exception:

 Started by user GRme > git rev-parse --is-inside-work-tree # timeout=10 Setting origin to https://github.com/GRme/e2e-web-tests > git config remote.origin.url https://github.com/GRme/e2e-web-tests # timeout=10 Fetching origin... Fetching upstream changes from origin > git --version # timeout=10 using GIT_ASKPASS to set credentials > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/* Seen branch in repository origin/master Seen 1 remote branch Obtained Jenkinsfile from 0eb7d8c437df1efc56e46171d945e7f2806b838b org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 23: Expected a symbol @ line 23, column 9. sh 'sudo ${params.docker} exec -i $(sudo ${params.docker} ps --format "{{.Names}}") bash -c "cd /my_tests && xvfb-run --server-args='-screen 0 1600x1200x24' npm run ${params.run_script_method} || true && google-chrome --version && firefox --version"' ^ 1 error at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688) at groovy.lang.GroovyShell.parse(GroovyShell.java:700) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:129) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:123) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:516) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:479) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:269) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:419) Finished: FAILURE 

我错了什么,我该如何解决这个例外?

在逃跑后,pipe道没有语法错误了:)

 sh 'sudo ${params.docker} exec -i $(sudo ${params.docker} ps --format "{{.Names}}") bash -c "cd /my_tests && xvfb-run --server-args=\'-screen 0 1600x1200x24\' npm run ${params.run_script_method} || true && google-chrome --version && firefox --version"'