Как остановить один шаг после завершения другого в Jenkins Pipeline Параллельные шаги - PullRequest
0 голосов
/ 08 июля 2019

У меня есть конвейер Jenkins с параллельными шагами.

Шаг A - это сборка приложения с пружинной загрузкой, а на шаге B - запуск другого приложения с загрузочной пружиной (mvn spring-boot: run), предназначенного длямост между тестами и базой данных.

Моя цель - закрыть шаг B (spring-boot: stop?) после завершения шага A (успех или неудача).

I'mпытаясь избежать использования таймаута, так как он не очень оптимизирован.

У вас есть какое-нибудь решение?

Большое спасибо.

Я пытался запустить spring-boot: остановка после прохождения теста, но безрезультатно.То же самое с настройкой логической переменной для остановки цикла 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"
                        }
                    }
                }
            )
        }

Я ожидаю, что шаг B остановится, когда шаг A завершится (всегда), но моя сборка будет приостановлена ​​на неопределенное время, так как шаг B запускает приложение.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Элегантное решение, о котором я мог бы подумать, - это sidecar контейнер, но для этого требуются докер и конвейер сценариев.

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, вы все равно не сможете выполнить сборку.

Итак, какой результат вы ищете?Если вы не понимаете, что сборка не удалась, вы должны ввести какой-то механизм для синхронизации состояния.

0 голосов
/ 10 июля 2019

ОК, найдено решение.

Напоминание: моей целью был запуск и остановка приложения с загрузочной пружиной параллельно моей сборке.

Поскольку я не смог найти способ удаленного уничтоженияПараллельный шаг от другого шага, мне пришлось использовать не элегантный способ сделать это: тайм-аут.

Тайм-аут шага не работает, так как он тайм-аут, только если команда не запускается, ноSpring-Boot: запустить запускает.НЕ РАБОТАЕТ: timeout(time: 1, unit: 'MINUTES') { [...] }

Таким образом, время ожидания должно быть в самой команде.Поначалу это выглядит так:
sh "timeout -s KILL 1m mvn spring-boot:run -Dpmd.skip=true -Dcpd.skip=true -Dfindbugs.skip=true

Итак, через 1 минуту мой забег убит.Это подразумевает новую проблему: уничтожение завершается неудачно на параллельном шаге, поэтому, даже если задание завершается с успешным построением, оно все равно считается неудачным, поскольку одна ветвь задания имеет «сбой» .

Теперь, чтобы избежать сбоя, решением было бы считать шаг при загрузке пружиной всегда успешным.Это делается с помощью 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"
                        }
                    }
                }
            )
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...