我目前有一個 Jenkins 腳本,它啟動一個 Docker 容器,在該容器中使用 Maven 運行 Selenium 測驗。Selenium 測驗成功執行,Maven 回傳“Build Success”。
問題如下: Jenkins 不僅執行了 Jenkinsfile 中指定的 sh 命令,還執行了一個未知的第二個 sh 命令。
詹金斯管道步驟
如圖所示,高亮部分是作為命令執行的,顯然不是命令,也就是說Docker容器回傳錯誤碼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 有問題,我該如何解決?
謝謝
uj5u.com熱心網友回復:
似乎這/wd/hub部分來自您執行的代碼行,這讓我相信您的問題是由于您添加引號的方式造成的。您的代碼行是:
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=http://" c.port(4444) "/wd/hub"
具體來說,你打開你的命令",然后http://用另一個關閉它"。我猜詹金斯不認為這是可以接受的。嘗試單獨創建網址
def url = "http://" c.port(4444) "/wd/hub"
只需在執行行中使用此變數
sh "mvn clean test -Denvironment=${env.Profile} -Dselenide.headless=true -Dselenide.remote=${url}"
我以前沒有用過docker.image,所以你可能需要玩一點才能讓它作業。
uj5u.com熱心網友回復:
在對檔案進行了更多挖掘并嘗試了不同的東西之后,這對我有用:
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')并.withRun(-v /dev/shm:/dev/shm -p 4444:4444')替換。c.port(4444)selenideRemote
洗掉c.port(4444)停止執行有問題的第二個命令。替換-P為-p 4444:4444從容器內部阻止的埠 4444 以分配給主機上的隨機埠,這也阻止了c.port(4444).
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459128.html
上一篇:Jenkins有多個代理的階段
