我有一个具有并行步骤的Jenkins管道。
步骤A正在构建一个Spring Boot应用程序,而步骤B正在启动另一个Spring Boot应用程序(mvn spring-boot:run),旨在在测试和数据库之间架起一座桥梁。
我的目标是在完成步骤A(成功或失败)后关闭步骤B(spring-boot:stop?)。
我试图避免使用超时,因为它不是很优化。
您有什么解决办法吗?
非常感谢。
我尝试通过测试后启动spring-boot:stop,但无济于事。设置布尔变量以停止while循环/
parallel(
a: {
Sonar: {
withSonarQubeEnv {
withMaven(maven: 'Apache Maven 3.3.9') {
sh '''
echo "lauching sonar check"
cd git-42c
mvn -Dmaven.test.failure.ignore verify sonar:sonar
cd ..
'''
}
}
}
},
b: {
// Run the maven build
withMaven(maven: 'Apache Maven 3.3.9') {
dir('git-proxy') {
echo "launching mvn spring-boot:run"
sh "mvn spring-boot:run -Dpmd.skip=true -Dcpd.skip=true -Dfindbugs.skip=true"
}
}
}
)
}
我希望步骤A结束后(总是),步骤B会停止,但是当步骤B运行该应用程序时,我的构建将无限期地暂停。
答案 0 :(得分:1)
我可以想到的一个优雅的解决方案是sidecar
容器,但这需要docker和脚本化管道。
node {
checkout scm
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
docker.image('mysql:5').inside("--link ${c.id}:db") {
/* Wait until mysql service is up */
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
}
docker.image('centos:7').inside("--link ${c.id}:db") {
/*
* Run some tests which require MySQL, and assume that it is
* available on the host name `db`
*/
sh 'make check'
}
}
}
当然有一个选项可以在像这样的标志上进行同步:
stop = false
parallel 'long': {
sleep 20
println "finished long process"
stop = true
}, 'short': {
while ( !stop ) {
println "work"
sleep 1
}
println "stopped by other branch"
}
但是这对您不起作用,因为您无处循环。
failFast
不会并行。
似乎,即使您从Jenkins REST API取消阶段,您仍然会失败。
那么您正在寻找什么结果?如果不是什么原因导致构建失败,则必须引入某种机制来同步状态。
答案 1 :(得分:0)
好的,找到了解决方法。
提醒:我的目标是在构建时并行启动和停止Spring Boot应用程序。
由于我找不到从另一个步骤中远程杀死并行步骤的方法,因此我不得不使用一种非优雅的方法:超时。
单步超时不起作用,因为它仅在命令未启动但spring-boot:run启动时才超时。
不起作用:timeout(time: 1, unit: 'MINUTES') { [...] }
因此超时必须在命令本身中。乍一看是这样的:
sh "timeout -s KILL 1m mvn spring-boot:run -Dpmd.skip=true -Dcpd.skip=true -Dfindbugs.skip=true
所以1分钟后,我的跑步被杀死。 这意味着出现了一个新问题,即kill不能使并行步骤失败,因此即使作业成功完成构建,由于作业的一个分支“失败” ,它仍然被认为是失败的。 >
现在,为避免失败,一种解决方案是将spring-boot步骤始终视为成功。这是通过使用command || true
完成的。
赞:
sh "timeout -s KILL 1m mvn spring-boot:run -Dpmd.skip=true -Dcpd.skip=true -Dfindbugs.skip=true || true"
就目前而言,我的平行步骤取得了绿色成功。
根据我在问题中的示例,这是相同的示例:
stage('Scan Sonar') {
parallel(
a: {
Sonar: {
withSonarQubeEnv {
withMaven(maven: 'Apache Maven 3.3.9') {
sh '''
echo "lauching sonar check"
cd git-42c
mvn -Dmaven.test.failure.ignore verify sonar:sonar
cd ..
'''
}
}
}
},
b: {
// Run the maven build
withMaven(maven: 'Apache Maven 3.3.9') {
dir('git-proxy') {
echo "launching mvn spring-boot:run"
sh "timeout -s KILL 1m mvn spring-boot:run -Dpmd.skip=true -Dcpd.skip=true -Dfindbugs.skip=true || true"
}
}
}
)
}