Jenkins Pipeline并行步骤中如何在另一个步骤完成时停止步骤

时间:2019-07-08 16:03:23

标签: jenkins jenkins-pipeline

我有一个具有并行步骤的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运行该应用程序时,我的构建将无限期地暂停。

2 个答案:

答案 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"
                        }
                    }
                }
            )
        }
相关问题