Jenkins 使用 sh 使用 docker.image.withRun 执行第二个命令
Jenkins executes second command with sh using docker.image.withRun
我目前有一个 Jenkins 脚本,它启动一个 Docker 容器,其中使用 Maven 进行 Selenium 测试 运行。 Selenium 测试执行成功,Maven returns "Build Success".
问题如下:Jenkins不仅执行了Jenkins文件中指定的sh命令,还执行了未知的第二个sh命令。
Jenkins Pipeline Step
如图,高亮部分作为命令执行,显然不是命令,意思是Docker容器returns错误码127.
詹金斯文件:
node {
stage('Checkout Code') {
checkout scm
}
try {
withEnv(["JAVA_HOME=${tool 'JDK 11.0'}", "PATH+MAVEN=${tool 'apache-maven-3.x'}/bin", "PATH+JAVA=${env.JAVA_HOME}/bin"]) {
stage('Run Selenide Tests') {
docker.image('selenium/standalone-chrome').withRun('-v /dev/shm:/dev/shm -P') { c->
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=http://" + c.port(4444) + "/wd/hub"
}
}
}
}catch(e){
currentBuild.result = "FAILURE"
throw e
} finally {
stage('Notify Slack Channel of Tests status') {
// Hidden
}
}
}
控制台输出(一些部分因为不相关而被隐藏):
+ docker run -d -v /dev/shm:/dev/shm -P selenium/standalone-chrome
+ docker port a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9 4444
+ mvn clean test -Denvironment=jenkins -Dselenide.headless=true -Dselenide.remote=http://0.0.0.0:49827
// Maven tests
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:14 min
[INFO] Finished at: 2022-04-14T15:36:38+02:00
[INFO] ------------------------------------------------------------------------
+ :::49821/wd/hub
/var/lib/jenkins/workspace/selenide-tests/test@tmp/durable-58ae7b8f/script.sh: 2:
/var/lib/jenkins/workspace/selenide-tests/test@tmp/durable-58ae7b8f/script.sh: :::49821/wd/hub: not found
+ docker stop a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
+ docker rm -f a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
ERROR: script returned exit code 127
Finished: FAILURE
这是一个很容易解决的常见问题,还是我的 Jenkinsfile 有问题,我该如何解决?
谢谢
/wd/hub
部分似乎来自您执行的代码行,这让我相信您的问题是由于您添加引号的方式造成的。
您的代码行是:
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=http://" + c.port(4444) + "/wd/hub"
具体来说,您使用 "
打开您的命令,然后在 http://
之后使用另一个 "
关闭它。我猜詹金斯不认为这是可以接受的。尝试单独创建 url
def url = "http://" + c.port(4444) + "/wd/hub"
并在您的执行行中简单地使用这个变量
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=${url}"
我以前没有用过 docker.image
,所以您可能需要多花点功夫才能使用它。
在深入研究文档并尝试不同的东西之后,这对我有用:
node {
stage('Checkout Code') {
checkout scm
}
try {
withEnv(["JAVA_HOME=${tool 'JDK 11.0'}", "PATH+MAVEN=${tool 'apache-maven-3.x'}/bin", "PATH+JAVA=${env.JAVA_HOME}/bin"]) {
stage('Run Selenide Tests') {
docker.image('selenium/standalone-chrome').withRun('-v /dev/shm:/dev/shm -p 4444:4444') {
def selenideRemote = "http://0.0.0.0:4444/wd/hub"
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=${selenideRemote}
}
}
}
}catch(e){
currentBuild.result = "FAILURE"
throw e
} finally {
stage('Notify Slack Channel of Tests status') {
// Hidden
}
}
}
所以我用 .withRun(-v /dev/shm:/dev/shm -p 4444:4444')
替换了 .withRun('-v /dev/shm:/dev/shm -P')
并用 selenideRemote
变量替换了 c.port(4444)
。
删除 c.port(4444)
停止执行有问题的第二个命令。将 -P
替换为 -p 4444:4444
可防止将容器内的端口 4444 分配给主机上的随机端口,这也阻止了 c.port(4444)
.
的使用
我目前有一个 Jenkins 脚本,它启动一个 Docker 容器,其中使用 Maven 进行 Selenium 测试 运行。 Selenium 测试执行成功,Maven returns "Build Success".
问题如下:Jenkins不仅执行了Jenkins文件中指定的sh命令,还执行了未知的第二个sh命令。
Jenkins Pipeline Step
如图,高亮部分作为命令执行,显然不是命令,意思是Docker容器returns错误码127.
詹金斯文件:
node {
stage('Checkout Code') {
checkout scm
}
try {
withEnv(["JAVA_HOME=${tool 'JDK 11.0'}", "PATH+MAVEN=${tool 'apache-maven-3.x'}/bin", "PATH+JAVA=${env.JAVA_HOME}/bin"]) {
stage('Run Selenide Tests') {
docker.image('selenium/standalone-chrome').withRun('-v /dev/shm:/dev/shm -P') { c->
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=http://" + c.port(4444) + "/wd/hub"
}
}
}
}catch(e){
currentBuild.result = "FAILURE"
throw e
} finally {
stage('Notify Slack Channel of Tests status') {
// Hidden
}
}
}
控制台输出(一些部分因为不相关而被隐藏):
+ docker run -d -v /dev/shm:/dev/shm -P selenium/standalone-chrome
+ docker port a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9 4444
+ mvn clean test -Denvironment=jenkins -Dselenide.headless=true -Dselenide.remote=http://0.0.0.0:49827
// Maven tests
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:14 min
[INFO] Finished at: 2022-04-14T15:36:38+02:00
[INFO] ------------------------------------------------------------------------
+ :::49821/wd/hub
/var/lib/jenkins/workspace/selenide-tests/test@tmp/durable-58ae7b8f/script.sh: 2:
/var/lib/jenkins/workspace/selenide-tests/test@tmp/durable-58ae7b8f/script.sh: :::49821/wd/hub: not found
+ docker stop a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
+ docker rm -f a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
a15967ce0efbda908f6ba9bb7c8c633bb64e54a6557e5c23097ea47ed0540ff9
ERROR: script returned exit code 127
Finished: FAILURE
这是一个很容易解决的常见问题,还是我的 Jenkinsfile 有问题,我该如何解决?
谢谢
/wd/hub
部分似乎来自您执行的代码行,这让我相信您的问题是由于您添加引号的方式造成的。
您的代码行是:
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=http://" + c.port(4444) + "/wd/hub"
具体来说,您使用 "
打开您的命令,然后在 http://
之后使用另一个 "
关闭它。我猜詹金斯不认为这是可以接受的。尝试单独创建 url
def url = "http://" + c.port(4444) + "/wd/hub"
并在您的执行行中简单地使用这个变量
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=${url}"
我以前没有用过 docker.image
,所以您可能需要多花点功夫才能使用它。
在深入研究文档并尝试不同的东西之后,这对我有用:
node {
stage('Checkout Code') {
checkout scm
}
try {
withEnv(["JAVA_HOME=${tool 'JDK 11.0'}", "PATH+MAVEN=${tool 'apache-maven-3.x'}/bin", "PATH+JAVA=${env.JAVA_HOME}/bin"]) {
stage('Run Selenide Tests') {
docker.image('selenium/standalone-chrome').withRun('-v /dev/shm:/dev/shm -p 4444:4444') {
def selenideRemote = "http://0.0.0.0:4444/wd/hub"
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=${selenideRemote}
}
}
}
}catch(e){
currentBuild.result = "FAILURE"
throw e
} finally {
stage('Notify Slack Channel of Tests status') {
// Hidden
}
}
}
所以我用 .withRun(-v /dev/shm:/dev/shm -p 4444:4444')
替换了 .withRun('-v /dev/shm:/dev/shm -P')
并用 selenideRemote
变量替换了 c.port(4444)
。
删除 c.port(4444)
停止执行有问题的第二个命令。将 -P
替换为 -p 4444:4444
可防止将容器内的端口 4444 分配给主机上的随机端口,这也阻止了 c.port(4444)
.