Проверьте магазин перед обновлением

JenkinsBeginner
Практиковаться сейчас

Введение

Moss & Mallow — вымышленный магазин подарков по соседству. В новой коллекции наборов семян должны сохраниться действующие правила скидки за несколько наборов и доставки. Магазин уже работает, но предоставленный Jenkins Pipeline может опубликовать версию-кандидат даже при реальном сбое теста расчёта цен.

Вы прочитаете сведения о реальном сбое теста, свяжете статус сборки Jenkins с решением о выпуске и опубликуете работающую версию-кандидат. Для этой лабораторной работы предполагаются базовые навыки навигации в Jenkins и умение распознать короткий Declarative Pipeline. Новые настройки отчётов о тестах и условия допуска к выпуску будут объяснены; программировать приложение, устанавливать ПО, заводить облачную учётную запись или совершать реальную покупку не потребуется.

Используйте Gift Shop, чтобы пройти путь покупателя, а Jenkins — для настройки и запуска сборок. Это два сервиса в одной подготовленной виртуальной машине. Два кандидата, broken и fixed, — предоставленные тестовые версии. Каждый учебный модуль начинается независимо от других. Оценка времени включает чтение и обычные ошибки; её не проверяли на начинающих.

Выясните, что на самом деле останавливает сбой теста

На этом шаге вы сравните обычные цены с реальным сбоем теста и узнаете, почему нестабильная сборка Jenkins всё ещё может выполнить публикацию. Начните в Gift Shop.

Выберите Find a little gift или Shop в меню навигации. Набор семян стоит £12. При покупке трёх и более наборов семян действует скидка 10%. Доставка стоит £4 и становится бесплатной при стоимости товаров не менее £40. Цены ориентировочные; магазин не принимает платежи.

Установите для набора семян Quantity равным 3 и выберите Check basket. Обычная стоимость товаров — £32.40, доставка — £4.00, итог — £36.40. Вернитесь через Shop. Проверьте также две коробки для пикника: стоимость товаров составляет £40.00, а доставка бесплатна. Откройте Visit, скачайте памятку по уходу за семенами и прочитайте сохранённый текстовый файл. В конце работы все эти обычные функции должны оставаться доступными.

Кандидат — версия, которую рассматривают для выпуска. Сборка — один запуск Jenkins со своим номером, параметрами и результатом. Переключитесь на вкладку Jenkins. Откройте shop-update, затем выберите Build with Parameters. Оставьте значение RELEASE равным broken и выберите Build. Этот первый запуск намеренно публикует ошибочную учебную версию-кандидат, чтобы вы могли наблюдать проблему; реальные покупатели не затронуты.

Дождитесь завершения сборки. Откройте запись с её номером в разделе Builds, затем Console Output. В Pipeline три этапа: Prepare копирует выбранного кандидата в рабочий каталог сборки, Test запускает предоставленные проверки расчёта цен, а Publish доставляет пакет в магазин.

В консоли должны присутствовать следующие неизменные строки:

Pricing failures: 1
Release received
Finished: UNSTABLE

UNSTABLE означает, что в сборке есть проблема с качеством, например не пройдены тесты. Сам по себе этот статус не предотвращает выполнение всех последующих этапов. Строка Release received показывает, что этот Pipeline всё же выполнил публикацию.

Откройте Tests для этой сборки. Откройте не пройденный тест seed_bundle и прочитайте подробности сбоя:

Expected 3240 400; got 2880 400

Реальный отчёт Jenkins о тестах: один тест не пройден, три пройдены

Значения указаны в пенсах: тест ожидал стоимость товаров £32.40 и доставку £4, но кандидат рассчитал стоимость товаров £28.80. Остальные три теста пройдены. Эти результаты получены при выполнении реальной программы расчёта цен кандидата; XML-отчёт формируется на основе этих сравнений.

Переключитесь в Gift Shop, перейдите через Shop и снова проверьте три набора семян. При необходимости обновите страницу. Теперь ошибочная итоговая сумма равна £32.80. Вы наблюдали реальный ошибочный выпуск, а не просто предупреждающий цвет. Перед запуском проверки этого шага вернитесь к сборке Jenkins с соответствующим номером.

Свяжите результат теста с публикацией

На этом шаге вы измените Pipeline так, чтобы сбой теста оставался видимым и предотвращал выполнение этапа Publish. Начните в Jenkins и откройте страницу задания shop-update по ссылке в навигационной цепочке.

Выберите Configure, затем раздел Pipeline. В его редакторе Script находится Declarative Pipeline. agent any выбирает доступный исполнитель Jenkins; в этой подготовленной вводной среде он работает внутри контейнера контроллера. Рабочий каталог — это каталог, выделенный для данной сборки. Независимым агентам посвящён отдельный проект.

Прочитайте этап Test. Предоставленная строка sh returnStatus: true, script: ... запускает тестовый скрипт и возвращает его код завершения вместо немедленного вызова ошибки Pipeline. Благодаря этому следующий шаг junit может опубликовать подробные результаты тестов. Нулевой код завершения означает, что скрипт выполнился успешно; ненулевой — что нет. junit читает XML-файл результатов, прикрепляет тесты к этой сборке и обычно присваивает ей статус UNSTABLE, если тест не пройден.

Опция Pipeline меняет то, как Jenkins выполняет Pipeline. Добавьте следующую строку сразу после agent any. Фигурные скобки группируют опцию; сохраните открывающую и закрывающую скобки в точности, как показано.

options { skipStagesAfterUnstable() }

Теперь начало скрипта должно выглядеть так. Сохраните все остальные существующие строки, включая адрес получателя и предоставленные этапы Prepare, Test и Publish.

pipeline {
    agent any
    options { skipStagesAfterUnstable() }

Эта опция пропускает последующие этапы после того, как сборка становится нестабильной. Она не превращает не пройденный тест в пройденный. Сохраните стандартный шаг публикации отчёта:

junit testResults: 'reports/pricing.xml'

Сохраните предоставленные вызовы оболочки для копирования кандидата, запуска test-shop.sh и публикации пакета. Отчёт о тестах должен поступать от этого средства запуска тестов; не заменяйте его шагом, записывающим отчёт, и не добавляйте другие команды оболочки.

Не добавляйте skipMarkingBuildUnstable: true: эта настройка подавляет статус сборки, на который опирается условие допуска. Не удаляйте тесты, не меняйте ожидаемые в них цены, не изменяйте предоставленных кандидатов или средство публикации и не пропускайте публикацию для всех кандидатов.

Выберите Save. Выберите Build with Parameters, оставьте broken и нажмите Build. Дождитесь завершения новой сборки с отдельным номером. Откройте Console Output. На этот раз вы должны увидеть:

Pricing failures: 1
Stage "Publish" skipped due to earlier stage(s) marking the build as unstable
Finished: UNSTABLE

Откройте Tests. Там по-прежнему должны присутствовать тот же не пройденный тест и три пройденных. В новой сборке не должно быть строки Release received. Магазин всё ещё может показывать предыдущий ошибочный выпуск: блокировка новой попытки не откатывает автоматически прежнюю публикацию. Далее вы замените её работающим кандидатом.

Если вместо этого сборка сообщает о синтаксической ошибке Groovy, снова откройте Configure. Проверьте, что добавленная строка options находится внутри pipeline, сразу под agent any, а фигурные скобки сбалансированы. Исправьте ошибку, выберите Save и повторно запустите broken. Одна лишь синтаксическая ошибка не означает завершения этого шага. Иногда Jenkins выводит уведомление средства публикации Checks API; этот локальный курс не использует размещённый Git-сервис, поэтому такое уведомление не заменяет фактический результат теста.

Опубликуйте работающего кандидата

На этом шаге вы докажете, что тот же Pipeline может доставить корректное обновление и сохранить обычный путь покупателя. Начните со страницы задания shop-update в Jenkins.

Выберите Build with Parameters. Установите RELEASE в fixed, затем выберите Build. Так вы выбираете предоставленного работающего кандидата; только что проверенный Pipeline при этом не меняется. Дождитесь завершения и откройте Console Output новой сборки.

Pricing failures: 0
Release received
Finished: SUCCESS

Откройте Tests. Все четыре теста расчёта цен должны быть пройдены. Вернитесь на страницу статуса этой сборки и найдите Build Artifacts. Скачайте shop-release.tar.gz. Артефакт — это файл, который Jenkins сохраняет для данной сборки; этот сжатый архив содержит программу расчёта цен, метаданные выпуска и памятку по уходу. Архив также является фактическим пакетом, отправленным в магазин, а не отдельно пересобранной копией.

Переключитесь в Gift Shop, нажмите ссылку с названием магазина, чтобы вернуться на главную страницу, и обновите её. Теперь коллекция называется Gifts to grow together. Откройте Shop и проверьте три набора семян: стоимость товаров — £32.40, доставка — £4.00, итог — £36.40. Для двух коробок для пикника доставка по-прежнему должна быть бесплатной. Откройте Delivery и Visit, снова скачайте памятку по уходу и убедитесь, что она полная.

Работающая корзина с правильной стоимостью товаров, доставки и итоговой суммой

Итоговая проверка связывает реальные неуспешную и успешную сборки с текущим сохранённым Pipeline и развёрнутыми байтами файлов. Если после этих запусков вы измените Pipeline, повторите broken, а затем fixed, чтобы оба результата относились к версии, которую вы сдаёте. Сохраните предыдущие сборки и исходные ресурсы магазина; записывать отчёт или копировать консольный вывод в файл не требуется.

Если вы по ошибке снова выбрали broken, сохраните условие допуска и запустите fixed. Если Jenkins ещё выполняет сборку, дождитесь окончательного результата сборки с её номером вместо многократной отправки новых сборок. Одной работающей главной страницы недостаточно: цены в корзине и скачивание файла входят в состав готового результата.

Резюме

Вы наблюдали реальный сбой теста расчёта цен, выяснили, почему нестабильная сборка всё же выполнила публикацию, и связали результат тестов Jenkins с условием допуска к выпуску. Затем вы использовали тот же Pipeline для доставки работающей версии-кандидата и проверили реальные цены, сохранённый архив пакета и обычные функции магазина.