Что такое Дженкинс? CI-сервер объяснил

Jenkins предлагает простой способ настроить среду непрерывной интеграции или непрерывной доставки (CI / CD) практически для любой комбинации языков и репозиториев исходного кода с помощью конвейеров, а также автоматизировать другие рутинные задачи разработки. Хотя Jenkins не устраняет необходимости создавать сценарии для отдельных шагов, он дает вам более быстрый и надежный способ интеграции всей цепочки инструментов сборки, тестирования и развертывания, чем вы можете легко создать самостоятельно.

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

Дженкинс - первоначально Хадсон - был прямым ответом на это ограничение.

Хадсон и Дженкинс

В 2004 году Кожуке Кавагути работал Java-разработчиком в Sun. Кавагути устал ломать сборки в своей работе по разработке и хотел найти способ узнать, будет ли код работать, прежде чем помещать код в репозиторий. Поэтому Кавагути построил сервер автоматизации на Java и для Java, чтобы сделать это возможным, под названием Hudson. Hudson стал популярным в Sun и распространился среди других компаний как открытый код.

Перенесемся в 2011 год, и спор между Oracle (которая приобрела Sun) и независимым сообществом Hudson с открытым исходным кодом привел к форку с изменением названия Jenkins. В 2014 году Кавагути стал техническим директором CloudBees, которая предлагает продукты непрерывной доставки на основе Jenkins.

Обе вилки продолжали существовать, хотя Дженкинс был гораздо активнее. Сегодня проект Jenkins все еще активен. Веб-сайт Hudson был закрыт 31 января 2020 года.

В марте 2019 года Linux Foundation вместе с CloudBees, Google и рядом других компаний запустили новый фонд программного обеспечения с открытым исходным кодом под названием Continuous Delivery Foundation (CDF). Участники Jenkins решили, что их проект должен присоединиться к этому новому фонду. Кавагути тогда писал, что для пользователей ничего значительного не изменится.

В январе 2020 года Кавагути объявил, что переходит в свой новый стартап Launchable. Он также сказал, что официально откажется от Дженкинса, но останется в Комитете по техническому надзору Фонда непрерывной доставки и переключит свою роль в CloudBees на советника.

Видео по теме: Как ускорить доставку кода с помощью CI / CD

Автоматизация Jenkins

Сегодня Jenkins - это ведущий сервер автоматизации с открытым исходным кодом, содержащий около 1600 подключаемых модулей для поддержки автоматизации всех видов задач разработки. Проблема, которую Кавагути изначально пытался решить, непрерывная интеграция и непрерывная доставка Java-кода (то есть создание проектов, выполнение тестов, выполнение статического анализа кода и развертывание) - лишь один из многих процессов, которые люди автоматизируют с помощью Jenkins. Эти 1600 подключаемых модулей охватывают пять областей: платформы, пользовательский интерфейс, администрирование, управление исходным кодом и, чаще всего, управление сборкой.

Как работает Дженкинс

Jenkins распространяется как архив WAR и как установочные пакеты для основных операционных систем, как пакет Homebrew, как образ Docker и как исходный код. Исходный код - в основном Java, с несколькими файлами Groovy, Ruby и Antlr.

Вы можете запустить Jenkins WAR автономно или как сервлет на сервере приложений Java, таком как Tomcat. В любом случае он создает пользовательский веб-интерфейс и принимает вызовы своего REST API.

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

Плагины Jenkins

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

После того, как вы выбрали начальный набор плагинов, нажмите кнопку «Установить», и Дженкинс добавит их.

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

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

На странице «Управление Jenkins» можно сделать 18 действий, включая возможность открытия интерфейса командной строки. Однако на этом этапе мы должны рассмотреть конвейеры, которые представляют собой расширенные рабочие процессы, которые обычно определяются сценариями.

Трубопроводы Jenkins

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

Как видите, в моей базовой установке Jenkins источниками веток для этого конвейера могут быть репозитории Git или Subversion, включая GitHub. Если вам нужны другие виды репозиториев или другие службы онлайн-репозиториев, достаточно просто добавить соответствующие плагины и перезагрузить Jenkins. Я пытался, но не мог придумать систему управления исходным кодом (SCM), в которой еще не указан плагин Jenkins.

Конвейеры Jenkins могут быть декларативными или скриптовыми. Декларативный трубопровод, тем проще из двух, использует Groovy-совместимый синтаксис , и если вы хотите, вы можете запустить файл с #!groovyуказать ваш редактор кода в правильном направлении. Декларативный конвейер начинается с pipelineблока, определяет agentи определяет stagesвключающий исполняемый файл steps, как в трехэтапном примере ниже.

трубопровод {

    агент любой

    stage {

        stage ('Build') {

            steps {

                echo "Здание .."

            }

        }

        stage ('Test') {

            steps {

                echo "Тестирование .."

            }

        }

        stage ('Deploy') {

            steps {

                echo 'Развертывание ....'

            }

        }

    }

}

pipeline- обязательный внешний блок для вызова плагина конвейера Jenkins. agentопределяет, где вы хотите запустить конвейер. anyговорит использовать любой доступный агент для запуска конвейера или этапа. Более конкретный агент может объявить контейнер для использования, например:

агент {

    docker {

        изображение 'maven: 3-alpine'

        ярлык 'my-defined-label'

        аргументы '-v / tmp: / tmp'

    }

}

stagesсодержат последовательность из одной или нескольких директив этапа. В приведенном выше примере это три этапа: сборка, тестирование и развертывание.

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

трубопровод {

    агент любой

    stage {

        stage ('Build') {

            steps {

                sh 'make'

                archiveArtifacts артефакты: '** / target / *. jar', fingerprint: true

            }

        }

    }

}

Здесь мы вызываем makeиз оболочки, а затем архивируем все созданные файлы JAR в архив Jenkins.

postРаздел определяет действия , которые будут выполняться в конце прогона трубопровода или стадии. Вы можете использовать несколько Постусловие блоков в почтовом разделе: always, changed, failure, success, unstable, и aborted.

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

трубопровод {

    агент любой

    stage {

        stage ('Test') {

            steps {

                ш, сделай чек

            }

        }

    }

    после {

        всегда {

            junit '** / цель / *. xml'

        }

        failure {

            письмо по адресу: [email protected], тема: «Ошибка конвейера :(»

        }

    }

}

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

Для сравнения, следующие два файла Jenkins полностью эквивалентны.

Декларативный конвейер

трубопровод {

    агент {узел докера: 6.3 '}

    stage {

        stage ('build') {

            steps {

                sh 'npm —version'

            }

        }

    }

Скриптовый конвейер

node ('docker') {

    касса scm

    stage ('Build') {

        docker.image ('node: 6.3'). inside {

            sh 'npm —version'

        }

    }

}

Blue Ocean, графический интерфейс Jenkins

Если вам нужен последний и лучший пользовательский интерфейс Jenkins, вы можете использовать подключаемый модуль Blue Ocean, который обеспечивает графический интерфейс пользователя. Вы можете добавить подключаемый модуль Blue Ocean к существующей установке Jenkins или запустить контейнер Jenkins / Blue Ocean Docker. Если Blue Ocean установлен, в главном меню Jenkins появится дополнительный значок:

Вы можете открыть Blue Ocean напрямую, если хотите. Он находится в папке / blue на сервере Jenkins. Создание конвейера в Blue Ocean немного более наглядно, чем в обычном Jenkins:

Дженкинс Докер

Как я упоминал ранее, Jenkins также распространяется как образ Docker. В этом процессе не так много: после того, как вы выбрали тип SCM, вы предоставляете URL-адрес и учетные данные, затем создаете конвейер из единого репозитория или просматриваете все репозитории в организации. Каждая ветка с Jenkinsfile получит конвейер.

Здесь я запускаю образ Blue Ocean Docker, который поставляется с несколькими дополнительными модулями служб Git, чем установленный по умолчанию список поставщиков SCM:

После того, как вы запустите несколько конвейеров, плагин Blue Ocean отобразит их статус, как показано выше. Вы можете увеличить отдельный конвейер, чтобы увидеть этапы и шаги:

Вы также можете увеличить масштаб веток (вверху) и действий (внизу):  

-

Зачем использовать Jenkins?

Плагин Jenkins Pipeline, который мы использовали, поддерживает общий вариант использования непрерывной интеграции / непрерывной доставки (CICD), который, вероятно, является наиболее распространенным вариантом использования Jenkins. Для некоторых других случаев использования есть особые соображения.

Первоначальным смыслом существования Дженкинса были проекты Java. Мы уже видели, что Jenkins поддерживает сборку с помощью Maven; он также работает с Ant, Gradle, JUnit, Nexus и Artifactory.

Android запускает своего рода Java, но вводит вопрос о том, как тестировать на широком спектре устройств Android. Плагин эмулятора Android позволяет создавать и тестировать столько эмулируемых устройств, сколько вы хотите определить. Плагин Google Play Publisher позволяет отправлять сборки на альфа-канал в Google Play для выпуска или дальнейшего тестирования на реальных устройствах.

Я показал примеры, в которых мы указали контейнер Docker в качестве агента для конвейера и где мы запускали Jenkins и Blue Ocean в контейнере Docker. Контейнеры Docker очень полезны в среде Jenkins для повышения скорости, масштабируемости и согласованности.

Есть два основных варианта использования Jenkins и GitHub. Один из них - интеграция сборки, которая может включать служебную ловушку для запуска Jenkins при каждой фиксации в вашем репозитории GitHub. Второй - использование аутентификации GitHub для управления доступом к Jenkins через OAuth.

Jenkins поддерживает множество других языков помимо Java. Для C / C ++ существуют плагины для сбора ошибок и предупреждений с консоли, создания сценариев сборки с помощью CMake, выполнения модульных тестов и статического анализа кода. Jenkins имеет ряд интеграций с инструментами PHP.

Хотя код Python не нужно собирать (если вы, например, не используете Cython или не создаете колесо Python для установки), полезно, чтобы Jenkins интегрировался с инструментами тестирования и отчетности Python, такими как Nose2 и Pytest, а также с качеством кода. такие инструменты, как Pylint. Точно так же Jenkins интегрируется с такими инструментами Ruby, как Rake, Cucumber, Brakeman и CI :: Reporter.

Дженкинс для CI / CD

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