как сделать декларативный конвейер Дженкинса waitForWebhook без использования исполнителя Дженкинса? - PullRequest
1 голос
/ 06 мая 2020

У нас есть декларативный конвейер Jenkins, который после развертывания нашего продукта в облачной виртуальной машине должен запустить на нем некоторые тесты продукта. Тесты реализованы как отдельное задание на другом дженкинсе, и тесты будут запускаться основным конвейером путем запуска удаленного задания на втором дженкинсе с использованием параметризованного плагина удаленного триггера параметризованного плагина удаленного триггера .

Хотя этот плагин отлично работает, при использовании опции blockBuildUntilComplete он блокирует удаленное задание до завершения sh, но не освобождает исполнитель jenkins. Поскольку тесты могут занять много времени (до 2 дней), все это время исполнитель будет заблокирован, просто ожидая завершения другого задания. При установке для blockBuildUntilComplete значения false он возвращает дескриптор задания, который может использоваться для получения статуса сборки и результата et c. Пример здесь :

while( !handle.isFinished() ) {
    echo 'Current Status: ' + handle.getBuildStatus().toString();
    sleep 5
    handle.updateBuildStatus()
}

Но это все еще продолжает использовать исполнителя, поэтому у нас все еще та же проблема. Основываясь на комментариях в статье , мы пробовали использовать waitForWebhook, но даже при ожидании веб-перехватчика он все еще использует исполнителя.

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

pipeline {
    agent none
    stages {
        stage("test"){
            input {
                message "Should we continue?"
            }
            agent any
            steps {
                script{
                    echo "hello"
                }
            }
        }
    }
}

, поэтому блок ввода делает то, что мы хотим делать с waitForWebhook, по крайней мере, насколько не потребляя исполнителя во время ожидания. Наша первоначальная идея заключалась в том, чтобы waitForWebhook находился внутри тайм-аута, окруженного try catch, окруженным while l oop ожиданием завершения удаленного задания sh:

 while(!handle.isFinished()){
        try{
            timeout(1) {
                data = waitForWebhook hook
            } 
        } catch(Exception e){
            log.info("timeout occurred")
        }
        handle.updateBuildStatus()
    }

Таким образом, мы могли бы избежать использования исполнителя для длительный период времени, а также извлекайте выгоду из дескриптора задания, возвращаемого плагином. Но мы не можем найти способ сделать это с помощью шага ввода. input не использует исполнителя только тогда, когда это отдельный блок внутри сцены, но он использует его, если внутри шагов или шагов-> скрипт. Таким образом, мы не можем использовать try catch, не можем проверить статус дескриптора и не можем использовать l oop на нем. Есть ли способ сделать это?

Даже если waitForWebhook работает так, как будто ввод работает, мы могли бы это использовать. Наш основной конвейер работает на jenkins внутри корпоративной сети, а тестовый jenkins работает в облаке и не может общаться с нашей корпорацией jenkins. поэтому при использовании waitForWebhook мы публикуем sh сообщение в конвейере сообщений, которое будет читать потребитель, извлекаем URL-адрес веб-перехватчика из базы данных, соответствующей заданию, и размещаем на нем. Мы надеялись избежать этого с помощью нашего решения с использованием while и try-catch.

...