1. Автоматические исправления в Джире
Мы используем Bitbucket и Jira. В значительной степени удивительные продукты Atlassian, довольно распространенные в компаниях.
Наш процесс требует от разработчиков перемещать билеты JIRA из Делать
столбец в Готов к демонстрации
колонка и в конечном итоге переместите их в Готово
столбец. Процесс разработки в значительной степени прост. Когда вы начнете работать над историей, вы можете создать филиал из своего терминала. Если вы убедитесь, что имя ветви содержит идентификатор проблемы, когда вы подталкиваете эту ветвь в удаленный репозиторий, даже без изменений Jira может автоматически перемещать его в В прогрессе
столбец. Когда мы открываем проводник, Джира автоматически перемещает билет в Обзор кода
колонка, и после слияния его перемещается к Исследование
В столбце, где другой разработчик или тестер проверяют функциональность, подтверждает, что критерии принятия соответствуют и все в порядке. Оттуда мы перемещаем его в Готов к демонстрации
колонка, и в конце итерации мы демонстрируем изменения. Если они приняты владельцем продукта, они перемещены в колонку «Готово», и мы можем запустить сборку релиза.
Теперь единственное, что не автоматизировано в этом процессе, — это то, что мы делаем наши релизы, используя функцию версий JIRA. Когда сборка релиза успешно работает, она помечает фактический коммит с этой версией, зарегистрированной в JIRA. Проблема в том, что мы разработчики, а мы ленивы. Мы всегда забывали добавить последнюю неизданную версию в истории, над которыми мы работали.
И в редких случаях, когда мы не забыли об этом, случилось, что не выпущенная версия билетов в процессе была выпущена, и нам нужно было изменить это вручную, чтобы добавить новую Fixversion. Это было неприемлемо, и, поскольку я оказался разработчиком, который может что -то с этим сделать, я взял на себя возможность автоматизировать эту задачу, используя Джира шаги Плагин и настройте наш Jenkinsfile для запросов на привлечение. Итак, давайте проверим, как это сделать.
В верхней части Jenkinsfile нам нужно настроить некоторые методы и переменные. Поэтому мы работаем над передним дозом нашего приложения, поэтому наши версии релиза всегда начинаются с Фей
, например, Fe-2.3.12
. Итак, сначала мы получаем версии Project, а затем используем какую -то Groovy Magic, чтобы получить единственную неизданную версию, которая содержит Fe
в его названии. Наконец, мы применяем результат к переменной.
def getFrontEndReleaseVersions() { def versions = jiraGetProjectVersions idOrKey: 'YOUR-PROJECT-KEY', site: 'YOUR-CONFIGURED-JIRA-SITE' return versions.data.findAll { it.released == false && it.name.contains('FE') } } FE_RELEASE_VERSIONS = getFrontEndReleaseVersions()
Итак, Fe_release_versions
Переменная теперь содержит список объектов версий. Ну, список ровно одной объекта версии. Затем, когда мы запустим нашу сборку, перед оформлением заказа, мы запускаем сценарий в блоке Try-Catch. Причина, по которой он находится внутри блока Try-Catch, заключается в том, что, когда сайт Jira уходит, но сборка работает, сборка не потерпит неудачу.
pipeline { // ... stages { steps { script { try { def issuekey = (GIT_BRANCH.toUpperCase() =~ /JIRAPROJECTID-\d*/)[0] def editedIssue = [fields: [fixVersions: [FE_RELEASE_VERSIONS.first()]]] def response = jiraEditIssue idOrKey: issuekey, issue: editedIssue, site: 'YOUR-CONFIGURED-JIRA-SITE' echo response.successful.toString() echo response.data.toString() } catch (Exception e) { echo "Could not update fixVersions. Please do it manually" } } } // ... } }
Сначала мы называем .touppercase ()
на Git_branch
переменная. Это потому, что некоторые из наших разработчиков любят создавать свои ветви из терминала. Обычно они слишком ленивы, чтобы нажать сдвиг при написании номера выпуска JIRA в имя филиала. После этого мы используем = ~
Оператор для извлечения подстроения с использованием следующего регулятора: /Jiraprojectid- \ d*/
Анкет Используйте письма вашего собственного проекта, и это должно работать для вас. Оператор возвращает массив матчей, и мы получаем первое, используя нотацию с кронштейном. После этого мы определяем переменную с областями, которые мы хотим изменить в нашей проблеме JIRA. И, наконец, мы используем jiraeditissue
обновить это в нашей Джире.
2. Пострадавший трубопровод для сборки PR
Еще один проект, над которым я работаю, — редкий деликатес. Задняя часть состоит из нескольких микросервисов Java Springboot. С несколькими фронтальными веществами. Один бэк-офис, один, обращенный к клиенту, с вероятностью изменения требований, в будущем может быть и третий фронт.
Наша проблема заключается в том, что из-за наших ограниченных ресурсов мы не можем запустить передние и задние сборки параллельно. Теперь хорошо, что все тщательно проверено. Что заставляет запасную сборку в течение 17 минут, а передние строительства будут работать еще 14 минут. Это просто слишком много для строительства затягивания.
Первым шагом для сокращения этого времени сборки является то, что мы реализовали наши два интерфейских приложения с использованием NX Workspace. Это привело к уменьшению времени настройки, однако, установил узлы и NPM, а затем запустив npm ci
Все еще требуется много, когда есть только изменения. Точно так же строительство трех микросервисов Springboot со всеми их единичными и функциональными тестами занимает некоторое время.
Таким образом, чтобы решить эту проблему, мы придумали идею, чтобы сделать передовые, а на заднем плане кондиционировал строительство. Да, мы имитируем затронут
Сборки рабочего пространства NX, но в наших трубопроводах. После небольшого исследования я столкнулся с это Сообщение блога. (Спасибо, мистер Беккер!) Команда, которая позволила бы нам установить наши шаги сборки:
git diff --quiet HEAD origin/master -- web-ui || echo changed
Эта команда состоит из двух частей. Первая часть перед оператором или оператором возвращается с кодом выхода. Если вывод не удастся (ненулевой выездной код), то Эхо
будет бежать. Нам нужно две переменные в нашем Jenkinsfile. Fe_is_dirty
и Be_is_dirty
. Нам нужно определить их на вершине Jenkinsfile, за пределами нашего объявления трубопровода.
def FE_IS_DIRTY def BE_IS_DIRTY pipeline { //...
Затем нам нужно присвоить значения этим пустым переменным. Нам нужно запустить Оформление SCM
Во -первых, у нас есть фактические изменения, против которых мы можем запустить наши команды. Назначение переменной должно работать внутри сценария.
stage('Init build') { steps { // ... checkout scm script { FE_IS_DIRTY = sh ( script: "git diff --quiet HEAD origin/master -- web-ui || echo changed", returnStdout: true ) echo "Frontend isDirty: ${FE_IS_DIRTY}" BE_IS_DIRTY = sh ( script: "git diff --quiet HEAD origin/master -- server || echo changed", returnStdout: true ) echo "Backend isDirty: ${BE_IS_DIRTY}" } } }
Теперь нам просто нужно украсить наши шаги сборки подходящим Когда
блокировать:
stage('FE init') { when { expression { return FE_IS_DIRTY } } steps { sh './gradlew npmInstall' sh './gradlew generateGitHash' } } // ... stage('BE Unit tests') { when { expression { return BE_IS_DIRTY } } steps { echo 'Execute SpringBoot Application unit tets' sh './gradlew server:test' } }
Таким образом, когда на заднем плане появляются только изменения, тесты на переднем крае не будут выполняться. Точно так же, когда изменения только включают в себя фронт-конце, шаги заднего строительства не выполняются излишне.
3. Уведомить DevOps
В нашем процессе развертывание в девчонка
и тест
Окружающая среда автоматическая. Новые изменения немедленно перемещаются в среду разработки, когда происходит мастер -слияние. Каждую ночь в 21:00 Ночная сборка проходит все тесты, строит артефакты и публикует в тест
(Постановка) окружающая среда. Развертывание до производства является защищенной частью этого процесса. Только команда DevOps может (и должна) развернуться в производстве.
Процесс заключается в том, что всякий раз, когда должен быть сделан релиз, мы запускаем выпускать
Jenkins Job, которая управляет каждым тестом и строит артефакты. Та же версия должна быть на тест
окружающая среда и ручные тесты должны работать против этого. После этого нам нужно создать проблему для команды DevOps и отправить уведомление по электронной почте координатору команды DevOps. Как вы уже догадались, плагин Jira Steps приходит на помощь. Создание выглядит как следующее:
stage('Notify DevOps') { steps { script { try { def devopsTicket = [fields: [ project: [key: 'YOUR_PROJECT_KEY'], summary: "Release PROJECT ${params.RELEASE_VERSION} to production", description: "See Jenkins job: '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})" ] ] response = jiraNewIssue site: 'https://your.jira.com/' issue: devopsTicket echo response.successful.toString() echo response.data.toString() mail bcc: '', body: "Release
Project: ${env.JOB_NAME}
Build Number: ${env.BUILD_NUMBER}
Build URL: ${env.BUILD_URL}
New version: ${params.RELEASE_VERSION}", cc: '', charset: 'UTF-8', from: 'jenkins@yourcompany.com', mimeType: 'text/html', replyTo: '', subject: "Deploy new release ${params.RELEASE_VERSION}", to: 'devops@devops.com'; } catch (Exception e) { // if for some reason the JIRA ticket could not be created, send a notification to slack or an e-mail // or something that could benefit your process } } } }
Мы вкладываем весь шаг в блок с перепродажкой, поэтому, если что-то не удается во время создания выпуска, может быть отправлено уведомление о запасении. Мы не хотим терпеть неудачу на технике. Поскольку это последний шаг сборки, если обморочное соединение с сервером JIRA не удалось, сборка выпуска, которая является ложной тревогой. В блоке Try мы определяем проблему, которая необходимо создать и заполнять ее доступными данными. Затем мы также можем отправить электронное письмо команде DevOps, чтобы они могли видеть, что эта задача имеет приоритет.
Jira с его плагинами может быть мощным инструментом для автоматизации ваших сборки и процессов. Я надеюсь, что вам понравилась эта статья, и, возможно, эти небольшие уловки и советы могут помочь вам в долгосрочной перспективе.
Вы можете прочитать оригинальную артисть Здесь Анкет
У вас есть и у вас уловки рукава? Вы можете написать это мне на Твиттер
Оригинал: «https://dev.to/tapaibalazs/the-butler-did-it-jenkins-jira-tricks-and-tips-5c0i»