Что такое джоба в jenkins

Создание динамических параметров в Jenkins job, или как сделать вашу задачу user-friendly

Доброго времени суток, Хабр!

Сегодня я хотел бы поделиться одним из способов, как с помощью Active Choices Plugin сделать задачу в Jenkins наиболее унифицированной и понятной для пользователя.

Введение

Такая аббревиатура как DevOps уже давно не является чем-то новым для IT сообщества. У многих людей фраза «сделать DevOps» ассоциируется с какой-то волшебной кнопкой, при нажатии на которую код приложения автоматически превращается в развернутое и протестированное приложение (все на самом деле сложнее, но мы абстрагируемся от всех процессов).

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

В нашем случае мы будем использовать Jenkins.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Задача

Создать удобную Jenkins job, которая будет запускать сборку и (или) деплой выбранного микросервиса определённой версии.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Входные данные

У нас имеются несколько репозиториев, в которых лежит исходный код различных микросервисов.

Определение параметров

На вход нашей джобе должны поступать следующие параметры:

AS IS

Самый простой способ выполнить поставленную задачу – создать два параметра с типом String.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

В этом случае пользователю нужно будет вводить вручную путь до репозитория и id коммита, что, согласитесь, не совсем удобно.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

AS TO BE

А теперь попробуем другой тип параметров, чтобы рассмотреть все его преимущества.
Создадим первый параметр с типом Choice Parameter, второй — Active Choices Reactive Reference Parameter. В параметр с типом Choice добавим вручную в поле Choices имена репозиториев, где хранится код наших микросервисов.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Если данная статья понравится аудитории, то в следующей статье опишу процесс конфигурирования задач в Jenkins, используя описание через код (Configuration as code), т.е. нам не нужно будет вручную вводить имена репозиториев и создавать параметры, все произойдет автоматически (наш код получит список репозиториев из SCM и создаст параметр с данным списком).

Значения второго параметра у нас будут наполняться динамически, в зависимости от того, какое значение примет первый параметр (test1 или test2), ведь у каждого репозитория имеется свой список коммитов.

Active Choices Reactive Reference Parameter имеет следующие поля для заполнения:

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Перейдем непосредственно к заполнению самого главного поля в данном параметре. На выбор нам предлагают два вида реализации: использование Groovy Script или Scriptler Script.
Выбираем первое, так как Scriptler – это всего лишь плагин, который сохраняет уже ранее написанные вами скрипты и позволяет использовать их в других задачах без повторного copy-past.

Groovy код для получения всех коммитов из выбранного репозитория:

Если не вдаваться в детали, то данный код получает на вход имя микросервиса (MICROSERVICE_NAME), отправляет запрос в Bitbucket (метод getCommitsForMicroservice), используя его API, и получает id и commit message всех коммитов для данного микросервиса.
Как уже говорилось ранее, данный код должен возвращать html, который будет отображен на странице Build with Parameters в Jenkins, поэтому все полученные значения из Bitbucket мы оборачиваем в список и добавляем в select.

После выполнения всех действий мы должны получить вот такую красивую страничку Build with Parameters.

Если выбрали микросервис test1:

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Если выбрали микросервис test2:

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Согласитесь, что пользователю будет намного удобнее взаимодействовать с вашей задачей данным способом, чем каждый раз копировать url и искать нужный commit id.

Источник

Непрерывная интеграция и развертывание (Deployment) с помощью Jenkins

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

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

Прежде всего, что такое Jenkins?

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

По сути, это означает, что Jenkins (и многие другие инструменты) позволяют автоматизировать процесс развертывания или предоставления изменений в вашем программном обеспечении пользователям сразу после того, как эти изменения готовы. Представим насколько удобно пользователям видеть обновленные сайты сразу после объединения PR с master (или main).

Почему именно Jenkins?

У него сильное сообщество, поэтому найти поддержку не проблема.

Jenkins можно легко настроить, и я надеюсь доказать это в данной статье, так что читайте дальше.

В этом руководстве мы узнаем, как выполнить CI/CD для приложения Node с помощью Jenkins. Давайте начнем с определения всех шагов, которые мы предпримем, а затем подробно объясним их ниже:

Создайте репозиторий GitHub для приложения node

Создайте простое приложение node и поместите его на GitHub

Создайте приложение Heroku для развертывания

Добавьте веб-хук GitHub для внесения изменений в Jenkins

Сконфигурируйте приложение с помощью Jenkins

Добавьте плагины GitHub в Jenkins

Сконфигурируйте Jenkins для развертывания на Heroku после успешного тестирования

Необходимые условия

Учетная запись на GitHub. Можно зарегистрироваться здесь.

Учетная запись Heroku. Можно зарегистрироваться здесь.

Учетная запись на GitHub. Можно зарегистрироваться здесь.

Учетная запись Heroku. Можно зарегистрироваться здесь.

Итак, давайте начнем!

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

После создания репозитория, клонируйте его на локальную машину с помощью следующей команды:

Не забудьте изменить repository_url на свой.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Вы можете удалить или изменить то, что находится в блоке скриптов вашего файла package.json, и добавить start и test для запуска и тестирования приложения:

Мы будем использовать express для нашего примера приложения node, поэтому инсталлируйте его, запустив эту команду в терминале:

Далее создайте файл index.js, который будет служить точкой входа в наше приложение node, и добавьте в него следующие строки:

Запустите npm start и зайдите на http://localhost:4000/ через браузер для просмотра приложения Node, на экране появится Hello world.

Далее мы добавим пару тестов в наше приложение, впоследствии, с помощью CI, мы должны убедиться, что тесты доступны и выполняются перед тем как объединить изменения.

Итак, вернитесь в терминал, убедитесь, что вы находитесь в корневом каталоге вашего проекта, и установите пакеты jest и supertest с помощью следующей команды:

Далее в корневом каталоге проекта создайте папку и назовите ее __test__ (два знака подчеркивания, предшествующий и завершающий). Внутри этой папки __test__ создайте файл index.test.js и добавьте в него по крайней мере следующий код (вы всегда можете сделать свои тесты более полными).

Запустите npm test или npm run test в терминале, и вы убедитесь, что тест(ы) прошел(и):

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Теперь, когда наш код запущен и тесты пройдены, можно закоммитить изменения и отправить их на GitHub.

Войдите в свою панель управления Heroku.

Посмотрите в правый верхний угол и нажмите на New.

Выберите Create new app (Создать новое приложение).

Добавьте App name (название приложения) по своему выбору и выберите регион (Choose a region), в котором вы находитесь.

Нажмите Создать приложение (Create app).

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Вернитесь в терминал вашего проекта и login (войдите) в Heroku с помощью Heroku CLI. Если вы еще не установили Heroku CLI, вы можете прочесть эту статью.

После этого добавьте remote в ваш локальный репозиторий с помощью:

Затем введите код с помощью:

Это делается для того, чтобы убедиться, что все работает правильно, прежде чем автоматизировать его. Вы можете нажать open app (открыть приложение) на приборной панели приложения Heroku, чтобы проверить, правильно ли оно работает.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Откройте новый терминал и войдите на свой сервер под учетной записью пользователя non-root.

После этого мы можем обновить ядро с помощью следующей команды:

Выполните следующую команду для установки java runtime:

Выполните следующие команды одну за другой для установки Jenkins.

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

Вы можете проверить успешность запуска Jenkins, используя:

Он должен показать active:

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Поскольку Jenkins выполняется на порту 8080, давайте откроем его с помощью ufw:

Вы можете проверить состояние ufw с помощью:

Теперь посетите сайт http://ip_address:8080 для настройки Jenkins, на котором вы должны увидеть экран Unlock Jenkins.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Чтобы разблокировать Jenkins, вернитесь к терминалу и введите следующую команду для отображения пароля. Скопируйте пароль и вставьте его в поле Administrator password (Пароль администратора).

На следующем экране отображается Customize Jenkins (Настроить Jenkins), нажмите на Install suggested plugins (Установите предложенные плагины).

После завершения установки мы перейдем к экрану Create First Admin User (Создание первого пользователя-администратора). Введите Username (имя пользователя), Password (пароль), Full name (полное имя) и E-mail address (адрес электронной почты) для вашего пользователя, затем Save and Continue (Сохранить и продолжить).

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

После этого введите IP-адрес сервера, т.е. http://ip_address:8080, затем Save and Finish (Сохранить и Завершить).

Ура, Jenkins готов! Нажмите на Start using Jenkins (Начать использование Jenkins).

В репозитории GitHub приложения перейдите в Settings (Настройки), затем на боковой панели нажмите на Webhooks. Нажмите на Add webhooks (Добавить веб-хуки) и введите url Jenkins с приставкой /github-webhook/ в поле Payload URL.

Выберите application/json для Content-type.

Выберите Just the push event для события, запускающего веб-хук.

Установите флажок Active и нажмите Add webhook. Теперь GitHub может успешно отправлять события в Jenkins.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Откройте новую вкладку или окно терминала и войдите на свой сервер с той же учетной записью пользователя non-root.

В том же терминале включите привилегии root, используя:

После переключения пользователя с правами root и инсталляции npm, Jenkins автоматически создает нового пользователя после завершения установки. Переключитесь на него с помощью этой команды.

Сгенерируйте новый ключ SSH с помощью следующей команды:

Нажмите клавишу Enter для ввода местоположения и не указывайте пароль при запросе, просто нажмите клавишу Enter.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

После завершения процесса распечатайте информацию об открытом ключе с помощью:

Скопируйте открытый ключ.

Теперь войдите обратно как пользователь non-root в новом терминале.

Откройте папку authorized_keys следующей командой:

Вставьте открытый ключ id_rsa и выйдите.

Чтобы убедиться, что ключи настроены правильно, переключитесь на терминал сервера jenkins и попробуйте войти в систему как пользователь non-root, используя ssh. Вы успешно войдете в систему, если будете следовать всем вышеописанным действиям.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

На приборной панели Jenkins перейдите в раздел Manage jenkins (Управление jenkins), а затем нажмите на Manage plugins (Управление плагинами).

На вкладке Available найдите github и выберите Github Integration plugin (Интеграционный плагин Github).

Нажмите на Install without restart (Установить без перезагрузки), и плагин будет установлен через несколько секунд.

Теперь, когда GitHub подключен к Jenkins, мы можем создать новый проект.

На боковой панели нажмите на New Item (Новая тема), выберите Freestyle project из предложенных вариантов и нажмите OK.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Далее вы должны попасть на страницу конфигурации, но если этого не произошло, можно открыть ее, нажав Configure на левой боковой панели.

Далее прокрутите вниз до раздела Source Code Management (Управление исходным кодом), выберите Git и добавьте Repository URL с расширением .git (тот же url, который вы использовали для клонирования репозитория).

Вы можете изменить master ветвь на main или любые другие ветви, которые вам нужны для процесса развертывания.

Нажмите на кнопку Add repository (Добавить репозиторий), чтобы добавить второй репозиторий, указывающий на ваше приложение Heroku.

Чтобы получить ссылку на репозиторий приложения Heroku, перейдите в App settings (настройки приложения) на панели управления Heroku и скопируйте ссылку.

Вернитесь на приборную панель Jenkins и вставьте эту ссылку в Repository URL.

Нам понадобятся новые учетные данные, поэтому нажмите на Add, чтобы создать их для нашего приложения Heroku.

Выберите Jenkins из списка, и у вас должно появиться всплывающее окно.

Введите username (имя пользователя) по своему выбору, но лучше всего, чтобы оно было каким-нибудь описательным. Я буду использовать heroku в качестве имени пользователя.

Далее нам нужно будет добавить Heroku Api key (Api-ключ) в поле Password

(Пароль) и Save (Сохранить). Чтобы получить Heroku Api key, перейдите на приборную панель Heroku, нажмите на Account Settings (Настройки аккаунта) и прокрутите вниз, чтобы увидеть Api key. Скопируйте его и вставьте в поле Password (Пароль).

Вы можете добавить Description (Описание) для этой учетной записи, если хотите.

Нажмите Add (Добавить), чтобы завершить создание учетной записи.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Теперь убедитесь, что в выпадающем списке выбраны новые учетные данные, которые мы только что создали. Если нет, нажмите на выпадающий список и выберите их.

Далее нажмите на advanced и добавьте Name, чтобы идентифицировать это хранилище среди других удаленных хранилищ. Это имя понадобится нам позже. Я назвал свое хранилище jenkinsTest, потому что это легко и понятно.

Далее прокрутите вниз до раздела Build Triggers и отметьте опцию GitHub hook trigger for GITScm polling (Триггер хука GitHub для опроса GITScm).

В разделе Build нажмите на кнопку Add build step (Добавить шаг сборки) и затем нажмите на Execute shell (Выполнить командную оболочку). Введите в оболочку следующий код:

Нажмите на Add post-build action (Добавить действие после сборки), выберите Git Publisher и укажите опцию Push Only If Build Succeeds (Запускать только в случае успеха сборки).

Нажмите на Add Branch (Добавить ветвь), введите имя ветви для развертывания в поле Branch to Push и добавьте Name, используемое для идентификации репозитория приложения Heroku, в поле Target remote name (мое имя было jenkinsTest, если вы помните, поэтому добавьте сюда свое).

Затем Save (сохраните).

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Перейдите на приборную панель проекта, нажмите Build now (Построить сейчас) на левой боковой панели и с удовольствием наблюдайте за успешной сборкой вашего кода!

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Внесите изменения в свой код и опубликуйте его на GitHub. Затем посмотрите, как ваш код будет автоматически развернут на Heroku.

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

Источник

Jenkins Pipeline. Что это и как использовать в тестировании

Меня зовут Александр Михайлов, я работаю в команде интеграционного тестирования компании ЮMoney.

Наша команда занимается приемочным тестированием. Оно включает в себя прогон и разбор автотестов на критичные бизнес-процессы в тестовой среде, приближенной по конфигурации к продакшену. Еще мы пишем фреймворк, заглушки, сервисы для тестирования — в целом, создаем экосистему для автоматизации тестирования и обучаем ручных тестировщиков автоматизации.

Надеюсь, что эта статья будет интересна как новичкам, так и тем, кто съел собаку в автоматизации тестирования. Мы рассмотрим базовый синтаксис Jenkins Pipeline, разберемся, как создать джобу на основе пайплайна, а также я расскажу про опыт внедрения неочевидной функциональности в CI — запуска и дожатия автотестов по условию.

Запуск автотестов на Jenkins — инструкция

Не новость, что автотесты эффективнее всего проводить после каждого изменения системы. Запускать их можно локально, но мы рекомендуем делать это только при отладке автотестов. Больший профит автотесты принесут при запуске на CI. В качестве CI-сервера у нас в компании используется Jenkins, в качестве тестового фреймворка — JUnit, а для отчетов — Allure Report.

Чтобы запускать тесты на Jenkins, нужно создать и сконфигурировать джобу.

Для этого достаточно выполнить несколько несложных шагов.

1) Нажать «Создать», выбрать задачу со свободной конфигурацией и назвать ее, например, TestJob.

Естественно, для этого у вас должны быть права в Jenkins. Если их нет, нужно обратиться к администратору Jenkins.

2) Указать репозиторий, откуда будет выкачиваться код проекта: URL, credentials и branch, с которого все будет собираться.

3) Добавить нужные параметры, в этом примере — количество потоков (threadsCount) и список тестов для запуска (testList).

Значение “*Test” для JUnit означает «Запустить все тесты».

4) Добавить команду для запуска тестов.

Наш вариант запускается на Gradle: мы указываем таску теста и передаем параметры в тесты.

Можно выполнить шаг сборки «Выполнить команду shell», либо через Gradle Plugin использовать шаг «Invoke Gradle Script».

5) Нужно добавить Allure-report (должен быть установлен https://plugins.jenkins.io/allure-jenkins-plugin/) в «Послесборочные операции», указав путь к артефактам Allure после прогона (по умолчанию allure-result).

Создав джобу и прогнав с ее помощью тестов, мы можем получить такой результат.

На скрине — реальный прогон. По таймлайну видно, как тесты разделяются по потокам и где были падения.

Несложно заметить, что тесты у нас падают.

Почему падают тесты

Падения могут случаться по разным причинам. В нашем случае на это влияют:

ограниченные ресурсы тестового стенда,

большое число микросервисов (

140); если при запуске интеграционных тестов какой-то один микросервис подтормаживает, тесты начинают валиться,

большое число интеграционных тестов (>3000 E2E),

врожденная нестабильность UI-тестов.

Что такое дожим

Дожим — это перезапуск автотестов в рамках их одного прогона. При успешном прохождении автотеста можно считать его пройденным, не учитывая предыдущие падения в прогоне.

«Дожимать? Опасно же!»

Возразите вы и будете полностью правы. Безусловно, дожим автотестов может спровоцировать пропуск дефекта на продакшн. Баг может быть плавающим — при повторном запуске успешно просочиться и попасть на продакшн.

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

Как решать задачу с дожимами

Мы пробовали разные решения: использовали модификацию поведения JUnit 4, JUnit 5, писали обертки на Kotlin. И, к сожалению, каждый раз реализация завязывалась на фичах языка или фреймворка.

Если процесс запускался с помощью JUnit 4 или JUnit 5, возможность перезапустить тесты была только сразу при падении. Тест упал, перезапустили его несколько раз подряд — и если сбоил какой-то микросервис из-за нагрузки, либо настройки тестовой среды были некорректные, то тест все три раза падал.

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

Мы взглянули на проблему шире, решили убрать зависимость от тестового фреймворка или языка и реализовали перезапуск на более высоком уровне — на уровне CI. И сделали это с помощью Jenkins Pipeline.

Для этого подходил следующий алгоритм: получаем список упавших тестов и проверяем условия перезапуска. Если упавших тестов нет, завершаем прогон. Если есть, решаем, запускать их повторно или нет. Например, можно реализовать логику, чтобы не перезапускались тесты, если их упало больше какого-то критического числа. Или перед запуском можно сделать проверку доступности тестируемого сервиса.

Что такое Jenkins Pipeline

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Jenkins Pipeline — набор плагинов, позволяющий определить жизненный цикл сборки и доставки приложения как код. Он представляет собой Groovy-скрипт с использованием Jenkins Pipeline DSL и хранится стандартно в системе контроля версий.

Существует два способа описания пайплайнов — скриптовый и декларативный.

Они оба имеют структуру, но в скриптовом она вольная — достаточно указать, на каком слейве запускаться (node), и стадию сборки (stage), а также написать Groovy-код для запуска атомарных степов.

Декларативный пайплайн определен более жестко, и, соответственно, его структура читается лучше.

Рассмотрим подробнее декларативный пайплайн.

В структуре должна быть определена директива pipeline.

Также нужно определить, на каком агенте (agent) будет запущена сборка.

Дальше идет определение stages, которые будут содержаться в пайплайне, и обязательно должен быть конкретный стейдж с названием stage(“name”). Если имени нет, тест упадет в runtime с ошибкой «Добавьте имя стейджа».

Обязательно должна быть директива steps, в которой уже содержатся атомарные шаги сборки. Например, вы можете вывести в консоль «Hello».

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

Если сборка и стейдж завершились успешно, можно сохранить артефакты или почистить workspace после сборки. Если же при таких условиях использовался бы скриптовый пайплайн, пришлось бы за этим «флоу» следить самостоятельно, добавляя обработку исключений, условия и т.д.

При написании своего первого пайплайна я, естественно, использовал официальный мануал — там подробное описание синтаксиса и степов.

Сначала я даже растерялся и не знал, с чего начать — настолько там много информации. Если вы первый раз сталкиваетесь с написанием пайплайна, начать лучше со знакомства с генераторами фрагментов пайплайна из UI-интерфейса.

Если к URL вашего веб-интерфейса Jenkins добавить ендпойнт /pipelines-syntax, откроется страница, в которой есть ссылки на документацию и два сниппет-генератора, позволяющие генерировать пайплайн даже без знания его синтаксиса:

Declarative sections generator

Генераторы фрагментов — помощники в мире Jenkins

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

Declarative sections generator (JENKINS-URL/directive-generator) — генератор фрагментов для декларативного описания пайплайна.

Для добавления стадии нужно написать ее имя и указать, что будет внутри (steps). После нажатия кнопки «Сгенерировать» будет выведен код, который можно добавлять в пайплайн.

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

Snippet Generator (JENKINS-URL/pipeline-syntax) — поможет сгенерировать фрагменты шагов.

В Sample Step выбрать build: Build a job.

(Дальше функционал подсказывает) — необходимо определить параметры, которые будут переданы в джобу (для примера задано branch, project).

Нажать кнопку «Generate» — в результате сформируется готовый рабочий код.

Изменим параметры джобы на те, которые определили при ее создании.

Snippet Generator удобен тем, что подсвечивает шаги в зависимости от установленных плагинов. Если у вас есть, например, Allure-report, то плагин сразу покажет наличие расширения и поможет сгенерировать код, который будет работать.

Вставим сгенерированный код степа в пайплайн на следующем шаге.

Запуск тестов с помощью Pipeline — инструкция

Итак, давайте с помощью Declarative sections generator создадим пайплайн. В нем нужно указать директивы: pipeline, agent (агент, на котором будет запускаться пайплайн), а также stages и steps (вставка ранее сгенерированного кода).

Так получится пайплайн, который запустит джобу, созданную на предыдущем шаге через UI.

Напомню, что в параметры для запуска тестов мы передавали количество потоков и список тестов. Теперь к этому добавляем параметр runId (идентификатор прогона тестов) — он понадобится позднее для перезапуска конкретного сьюта тестов.

Чтобы запустить пайплайн, нужно создать проект.

Для этого нужно нажать на кнопку «Создать проект» и выбрать не джобу со свободной конфигурацией, а джобу Pipeline — осталось указать ей имя.

Добавить параметры runId, threadsCount, testList.

Склонировать из Git.

Пайплайн можно описать непосредственно как код и вставить в поле, но для версионирования нужно затягивать пайплайн из Git. Обязательно указываем путь до скрипта с пайплайном.

Готово, джобу можно запускать.

Хотим добавить немного дожатий

На этом этапе у нас уже готова джоба для запуска проекта с автотестами. Но хочу напомнить, что наша задача — не просто запускать тесты, а добавить им стабильности, исключив падения из-за внешних факторов. Для достижения этого результата было принято решение дожать автотесты.

Для реализации нужно:

вынести шаг запуска тестов в библиотечную функцию (shared steps),

получить упавшие тесты из прогона,

добавить условия перезапуска.

Теперь немного подробнее про каждый из этих шагов.

Многократное использование шагов — Shared Steps

В процессе написания пайплайнов я столкнулся с проблемой постоянного дублирования кода (часто используемых степов). Этого хотелось избежать.

Решение нашлось не сразу. Оказывается, для многократного использования кода в Jenkins есть встроенный механизм — shared libraries, который позволяет описать методы один раз и затем применять их во всех пайплайнах.

Существуют два варианта подключения этой библиотеки.

Написанный проект/код подключить через UI Jenkins. Для этого требуются отдельные права на добавление shared libraries или привлечение девопс-специалистов (что не всегда удобно).

Хранить код в отдельном проекте или в проекте с пайплайнами. При использовании этот код подключается как динамическая библиотека и выкачивается каждый раз при запуске пайплайна.

Мы используем второй вариант — размещаем shared steps в проекте с пайплайнами.

Для этого в проекте нужно:

в ней создать файл с названием метода, который планируется запускать — например, gradlew.groovy,

стандартно определить имя метода (должен называться call), то есть написать «def call» и определить входящие параметры,

в теле метода можно написать произвольный Groovy-код и/или Pipeline-степы.

Вынесение запуска тестов в shared steps в /var

Выносим startTests.groovy в /var.

Во-первых, нужно вынести запуск тестов в отдельный метод. Выглядит это так — создаем файл, называем метод def call, берем кусок кода, который был в пайплайне, и выносим его в этот step.

Структура проекта будет выглядеть так.

Подключение shared steps как внешней библиотеки.

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

Сделать это можно с помощью сниппет-генератора — выбираем степ library и указываем ветку, в которую все будет собираться и репозиторий. Дальше нажимаем кнопку «Сгенерировать» и вставляем получившийся пайплайн.

Теперь после подключения shared steps вместо шага запуска тестов build нужно вставить startTest. Не забудьте, что имя метода должно совпадать с именем файла.

Теперь наш пайплайн выглядит так.

Первый шаг реализован, теперь можно многократно запускать тесты в разных местах. Переходим к 2 шагу.

Получение упавших тестов из прогона

Теперь нам нужны упавшие тесты. Каким образом их извлечь?

Установить в Jenkins плагин JUnit Test Result Report и использовать его API.

Взять результаты прогона JUnit (обычно в формате XML), распарсить и извлечь нужные данные.

Запросить список упавших тестов из нужного места.

В нашем случае таким местом является собственный написанный сервис — Reporter. Во время прогона тестов результат по каждому из них отправляется именно туда. В конце прогона делаем http-запрос и получаем упавшие тесты.

http://reporter:8080/failedTests/$runId

Добавление условий перезапуска

На этом шаге следует добавить getFailedTests.groovy в /var. Представим, что у вас есть такой сервис — Reporter. Нужно назвать файл getFailedTests, сделать запрос httpRequest в этот сервис и распарсить его.

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

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

Условия перезапуска

Какие условия для перезапуска можно реализовать?

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

1) Если нет упавших тестов, прогон завершается.

2) Как я уже писал выше, на тестовой среде ресурсы ограничены, и бывает такое, что ТС захлебывается в большом количестве параллельных тестов. Чтобы на дожатии избежать падений тестов по этой причине, понижаем число потоков на повторном запуске. Именно для этого при создании джобы и в самом пайплайне мы добавили параметр threadsCount.

Если и после уменьшения потоков тесты не дожимаются (количество упавших тестов на предыдущем прогоне равно числу упавших тестов на текущем), тогда считаем, что дело не во влиянии ТС на тесты. Останавливаем прогон для анализа причин падений — и тем самым предотвращаем последующий холостой запуск.

3) Третья и самая простая проверка состоит в том, что если падает большое количество тестов, то дожимать долго. Скорее всего, причина падений какая-то глобальная, и ее нужно изучать.

Для себя мы определили: если тестов > 40, дожимать не автоматически не будем, потому что 40 наших E2E могут проходить порядка 15 минут.

Последние два условия — так называемые fail fast. Они позволяют при глобальных проблемах на тестовом стенде не делать прогоны, которые не приведут к дожиму тестов, но будут занимать ресурсы тестового стенда.

Итоговый pipeline

Итак, все 3 шага реализованы — итоговый пайплайн выглядит так.

Визуализация с Blue Ocean

Как все это выглядит при прогоне в Jenkins? У нас, к примеру, для визуализации в Jenkins установлен плагин Blue Ocean.

На картинке ниже можно увидеть, что:

запустился метод testwith_rerun,

прошел первый запуск,

прошла проверка упавших тестов,

запустился второй прогон,

после успешной проверки джоба завершилась.

Что такое джоба в jenkins. Смотреть фото Что такое джоба в jenkins. Смотреть картинку Что такое джоба в jenkins. Картинка про Что такое джоба в jenkins. Фото Что такое джоба в jenkins

Вот так выглядит визуализация нашего настоящего прогона.

В реальном примере две ветки: мы параллельно запускаем два проекта с тестами (на Java и Kotlin). Можно заметить, что тесты одного проекта прошли с первого раза, а вот тесты другого пришлось дожимать еще раз. Таким образом визуализация помогает найти этап, на котором падают тесты.

А так выглядит реальный timeline приемки релиза.

После первого прогона отправили дожимать упавшие тесты. Во второй раз упавших тестов намного меньше, дожимаем в третий раз — и вуаля, успешный build.

Мы перенесли логику перезапусков упавших тестов из тестового проекта на уровень выше — на CI. Таким образом сделали механизм перезапуска универсальным, более гибким и независимым от стека, на котором написаны автотесты.

Раньше наши тесты дожимались безусловно, по несколько раз, с неизменным количеством параллельных потоков. При перегрузке тестового стенда, некорректных настройках тестового окружения либо каких-то других проблемах — красные тесты перезапускались фиксированное число раз без шансов дожаться. В худшем случае прогоны могли длиться часами. Добавив условия fail fast, мы сократили это время.

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

Какой профит мы получили:

уменьшили time-to-market тестируемых изменений,

сократили длительность аренды тестового стенда под приемочное тестирование,

увеличили пропускную способность очереди приемочного тестирования,

не завязаны на тестовый фреймворк («под капотом» может быть что угодно — дожатия будут работать),

поделились знаниями об использовании Jenkins Pipeline.

Примеры кода выложены на GitHub. Если будут вопросы, задавайте — обязательно отвечу.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *