Как пропустить этапы в Дженкинс в зависимости от емкости? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь внедрить непрерывную доставку в организации, где в настоящее время у нас недостаточно возможностей для выполнения всех тестов на всех коммитах.Ниже приведен упрощенный, вымышленный сценарий с выдуманными номерами, иллюстрирующий проблему.

Continuous Delivery Pipeline

Представьте приведенный выше конвейер.У нас есть возможность запускать этап фиксации для всех коммитов, отчасти потому, что он был спроектирован для быстрого выполнения, а отчасти потому, что мы смоделировали все дорогостоящие части среды, поэтому для его запуска не требуется дорогостоящее оборудование.Фактически, я даже могу запустить его локально на своем ноутбуке.

С другой стороны, приемочные тесты занимают около 6 часов, и это время увеличивается, поскольку мы внедряем все больше функций, требующих тестирования.Они работают против производственной среды, которая стоит 1 миллион долларов в год, поэтому мы получаем только один из них.

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

Сегодня этап фиксации - это отдельная работа, выполняемая для каждого коммита, приемочные тесты - это другая работа, которая выполняется ночью, и развертывание в рабочей среде.это ручной процесс, которому предшествует обширное ручное тестирование.Приемочные испытания всегда нарушены.Релизы производятся не из master, а из веток кандидатов на релизы, которые проходят не менее месяца тестирования и исправления ошибок перед выпуском.Иногда у нас даже есть несколько таких одновременно, потому что один релиз не закончился до того, как начался следующий запланированный выпуск.

Я отчаянно хочу исправить наш сломанный процесс выпуска, введя конвейер непрерывной доставки.В настоящее время у меня нет решения по поводу недостатка емкости, но пропуск этапов, основанный на пропускной способности, выглядит как путь вперед.Я действительно не сомневаюсь, что это возможно, учитывая гибкость Дженкинса, но я изо всех сил пытаюсь найти ресурсы, как это сделать.Я жестко запрограммировал пропуск в конвейере (используя when) для создания скриншота, так что не принимайте это как доказательство того, что я решил проблему.

Помните, все в желтом полеэто выдумка, но вопрос реален:

Как мне пропустить этапы в Jenkins на основе емкости?

1 Ответ

0 голосов
/ 17 июня 2019

Способ пропустить этапы в зависимости от емкости в Jenkins заключается в использовании комбинации lock и milestone:

pipeline {
    agent none
    stages {
        stage('Commit Stage') {
            steps {
                sleep 10
            }
        }
        stage('Acceptance Tests') {
            steps {
                milestone(1)
                lock(resource: "staging", inversePrecedence: true) {
                    milestone(2)
                    sleep 20
                }
            }
        }
        stage('Deploy to Production') {
            steps {
                sleep 10
            }
        }
    }
}

Используя блокировку inversePrecedence, последняя сборка получит блокировку первой и, следовательно, будет первой, которая пройдет этап 2. Все старые сборки, которые уже прошли этап 1, будут отменены. Опуская этап 1, старые сборки не будут прерваны, пока они не получат блокировку, которая может занять вечность.

Просто замените сны фактической работой, и вы получите конвейер, описанный в вопросе.

Я должен также упомянуть, что рекомендуется получить блокировку на этапе с agent none, потому что тогда ожидающие задания не будут занимать исполнителей. Можно получить блокировку для нескольких этапов, и каждый этап может выполняться на разных агентах.

РЕДАКТИРОВАТЬ: После еще нескольких экспериментов я понял, что я сделал не так. По-видимому, вам нужно milestone до и после получения блокировки. Просто один после приводит к проблеме сборок, никогда не заканчивая. Я понял это после прочтения этой записи в блоге: https://jenkins.io/blog/2016/10/16/stage-lock-milestone/

...