<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Jenkins</title>
    <description>Jenkins — это популярная платформа с открытым исходным кодом для автоматизации процессов разработки программного обеспечения. Она обеспечивает удобное управление непрерывной интеграцией (CI) и доставкой (CD), поддерживая множество плагинов для интеграции с различными инструментами и технологиями.

С Jenkins разработчики могут автоматизировать сборку, тестирование и развертывание приложений, ускоряя выпуск новых версий и повышая их надежность. Этот инструмент является неотъемлемой частью эффективных DevOps-практик.</description>
    <link>https://tproger.ru/tag/jenkins</link>
    <atom:link href="https://tproger.ru/tag/jenkins/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 22:55:08 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Jenkins</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Топ-10 CI/CD инструментов для DevOps: автоматизируй рутину и экономь время</title>
      <link>https://tproger.ru/articles/top-10-ci-cd-instrumentov-dlya-devops--avtomatiziruj-rutinu-i-ekonom-vremya</link>
      <comments>https://tproger.ru/articles/top-10-ci-cd-instrumentov-dlya-devops--avtomatiziruj-rutinu-i-ekonom-vremya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-10-ci-cd-instrumentov-dlya-devops--avtomatiziruj-rutinu-i-ekonom-vremya</guid>
      <description><![CDATA[<p>Топ-10 CI/CD инструментов для DevOps: подробный обзор Jenkins, GitLab CI, CircleCI, werf, Argo CD и других. Критерии выбора, сравнение возможностей и сценариев применения. Как автоматизировать пайплайны для облачных и Kubernetes-проектов. Гайд для DevOps-инженеров по настройке эффективной доставки кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-10-ci-cd-instrumentov-dlya-devops--avtomatiziruj-rutinu-i-ekonom-vremya">Топ-10 CI/CD инструментов для DevOps: автоматизируй рутину и экономь время</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Jenkins]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Что такое CI/CD и почему это важно для DevOps</h2><p>CI/CD — это практика непрерывной интеграции, доставки и развёртывания. Её цель проста: сократить путь от коммита до пользователя, убрать ручные действия и повысить предсказуемость релизов. Для DevOps это опора в ежедневной рутине. Автоматизация CI/CD снижает количество регрессий, ускоряет обратную связь и делает выпуск версий управляемым процессом, а не приключением.</p><h3>Ключевые принципы CI/CD</h3><p>CI/CD — набор практик, направленных на автоматизацию сборки, тестирования, доставки и выкатки изменений. Их цель — уменьшить время между коммитом и выпуском релиза, повысить качество и предсказуемость.</p><p><b>Непрерывная интеграция (CI, Continuous Integration).</b> Команда часто коммитит в общую ветку, где каждый коммит автоматически собирается и тестируется. Код после CI находится в состоянии, готовом к выкатыванию по запросу (обычно кнопкой или автоматическим триггером. Чем раньше обнаружен дефект в коде, тем дешевле его исправление. Хороший CI даёт быстрые сборки, параллельные тесты и прозрачные отчёты.</p><p><b>Непрерывная доставка (CD, Continuous Delivery). </b>Готовый артефакт можно развернуть в любое окружение по кнопке. Конвейер проверок одинаков для стейджинга и продакшена. Доставка включает хранение артефактов, промоушен версий и контроль качества.</p><p><b>Непрерывное развёртывание (CD, Continuous Deployment) </b>— автоматическая выкатка в прод после успешного прохождения всех стадий CI/CD-пайплайна. Это финальная ступень: успешный пайплайн сам выкатывает релиз в прод. Важны стратегии деплоя, откаты и наблюдаемость. Команда концентрируется на продукте, а не на ручном процессе его выкатывания в продакшн.</p><h2>Обзор популярных CI/CD инструментов</h2><p>Ищете лучшие CI/CD инструменты для автоматизации процессов разработки? Мы собрали подборку сервисов, которые помогают DevOps-инженерам экономить время и повышать эффективность — от Jenkins и GitLab CI до werf и Argo CD.</p><h3>1. Jenkins: гибкость и расширяемость</h3><p>Jenkins — классика жанра. Это self-hosted сервер автоматизации с огромной экосистемой плагинов (​​более 1800 активных). Jenkins не имеет встроенной поддержки контейнерных окружений, но достигает этого через плагины (Docker/Kubernetes). То есть это open source-платформа для CI/CD, разворачиваемая локально.</p><p>Jenkins может работать как в контейнере, так и на виртуальной машине или bare-metal. Он умеет почти всё, от сборки контейнеров до сложных фан-аут пайплайнов. Контейнерные сборки Jenkins поддерживает через Docker plugin, Kubernetes plugin, Pod Templates.Пайплайны можно описывать на Groovy как скрипт в Jenkinsfile, а также декларативно — что даёт разработчикам свободу выбора и гибкость конфигурации.</p><p>Архитектура мастер-агентов масштабируется горизонтально. Агентов можно масштабировать, подключая локальные или удалённые исполнители — через SSH, JNLP, Kubernetes, EC2 и др.</p><p>Управление идёт через веб-интерфейс и код в репозитории. Комьюнити огромное, документации много. Платить не нужно из-за лицензии MIT, но администрирование потребует времени и дисциплины — например, установка, настройка и поддержка плагинов, агентов и обновлений.</p><h3>2. GitLab CI: всё в одном</h3><p>GitLab CI встроен прямо в платформу GitLab как часть GitLab Core. Она активируется через файл .gitlab-ci.yml в корне репозитория. Этот файл поддерживает стадии (stages), задания (jobs), зависимости (needs) и артефакты (artifacts).</p><p>Репозитории, коды ревью, пайплайны и контейнерный регистр живут вместе, что здорово упрощает жизнь. GitLab объединяет полный DevOps-цикл в одной платформе:</p><ul><li>Git-репозиторий</li><li>Code Review / Merge Requests</li><li>CI/CD pipelines</li><li>GitLab Container Registry</li><li>Issue tracking и Wiki.</li></ul><p>Это — ключевая особенность GitLab, отличающая его от связки GitHub + Actions.</p><p>Раннеры бывают общими и приватными:</p><ul><li>shared runners — глобальные, доступные всем проектам в GitLab SaaS;</li><li>specific runners — установленные внутри организации для конкретных проектов;</li><li>group runners, используемые для нескольких репозиториев внутри одной группы.</li></ul><p>Секреты хранятся в защищённых переменных:  GitLab CI/CD использует Protected Variables и Masking, чтобы скрывать токены, пароли и ключи в логах. Также GitLab поддерживает monorepo-паттерн через директивы rules, only/except, changes, needs и workflow: — чтобы запускать пайплайны избирательно по изменённым директориям. Также можно использовать child pipelines и multi-project pipelines, что часто применяют в крупных монорепозиториях.</p><p>GitLab CI/CD визуализирует пайплайн как граф зависимостей (Pipeline Graph), а логи задач отображаются построчно в реальном времени. В облаке старт быстрый, self-managed подходит для компаний с требованиями к данным.</p><p>GitLab Community Edition (CE) — open source и содержит все базовые функции CI/CD, включая пайплайны, раннеры, артефакты и переменные.</p><p>Платная версия (Premium/Ultimate) добавляет улучшения:</p><ul><li>advanced security scanning,</li><li>compliance dashboards,</li><li>merge approval policies,</li><li>analytics и SLA-поддержку.</li></ul><h3>3. CircleCI: облачное решение</h3><p>CircleCI — облачный CI/CD-сервис, который позволяет запускать сборки без сложного администрирования. Всё работает из коробки: пайплайны описываются в .circleci/config.yml, где определяются задачи, окружения и зависимости. Благодаря встроенному кэшированию шагов, workspace sharing и Docker layer caching сборки выполняются значительно быстрее, чем в большинстве self-hosted решений.</p><p>CircleCI поддерживает интеграции с GitHub, Bitbucket и GitLab Cloud, а также готовые orbs — переиспользуемые блоки конфигурации для типовых задач вроде деплоя, тестирования и уведомлений. Веб-интерфейс предлагает подробные Insights dashboards, которые показывают метрики успешности пайплайнов и эффективность кэша.</p><p>Секреты управляются централизованно через Contexts — безопасные хранилища переменных окружения с гибкой системой доступа. Для приватных проектов доступна версия CircleCI Server, устанавливаемая в собственный кластер Kubernetes или в частное облако, что обеспечивает полный контроль над данными.</p><p>CircleCI поддерживает Linux, Docker, macOS и Windows-окружения, а также масштабирование сборок с помощью параллелизма и матриц тестов. Простая структура YAML и обширная библиотека orbs делают миграцию с других CI-систем делом нескольких часов, а не недель — что и делает CircleCI одним из самых популярных облачных CI/CD-инструментов у DevOps-команд по всему миру.</p><h3>4. werf: Kubernetes-доставка «под ключ»</h3><p><a href="http://ru.werf.io/?utm_source=web&amp;utm_medium=tproger&amp;utm_campaign=ci_cd">werf </a>— CLI-утилита для сборки и доставки приложений в Kubernetes. Она закрывает ключевые участки конвейера и избавляет команду от рутины. Инструмент собирает образы, тегирует и переиспользует ранее собранные слои. На этапе развёртывания werf позволяет реализовывать сложные сценарии и обеспечивает детальную обратную связь. Всего одна команда werf converge — и утилита инкрементально пересобирает и разворачивает только то, что действительно изменилось по сравнению с предыдущей версией приложения.</p><p>Дополнительно версию приложения можно упаковать в бандл (werf bundle publish) — автономный пакет, включающий все образы и манифесты Kubernetes. Такой бандл можно доставить и развернуть без доступа к внешнему миру — это важно для комплаенса и изолированных сред.</p><p>При очистке container registry (werf cleanup) можно применять гибкие политики, которые учитывают активность в Git и использование образов в кластере Kubernetes, освобождая место без риска удалить нужное. Очистка на сборочных хостах автоматизирована: при удалении кэша сохраняется баланс между скоростью сборки и использованием дискового пространства.</p><p>Ключевой акцент — детерминированность. Конфигурация и сборочный контекст читаются напрямую из Git, а внешние зависимости либо исключаются, либо должны быть явно зафиксированы пользователем. Такой подход обеспечивает прозрачность и предсказуемость конвейера для всех участников, а также соответствие требованиям комплаенса.</p><p>werf особенно полезен в больших проектах (монорепозиториях) с активной разработкой, где эффективность и прозрачность на каждом этапе играет критическую роль, а её игнорирование приводит к росту time to market и издержек.</p><p>Управление идёт через CLI, а конфигурация описывается в Git проекта: werf.yaml, набор Dockerfile’ов и Helm-чарт с расширенными возможностями. Дистрибуция осуществляется через бинарный файл и готовые контейнерные образы для запуска в Kubernetes. werf предоставляет удобную интеграцию с GitLab CI/CD и GitHub Actions, но так же полноценно работает с любой CI-системой. Переход между container registry не требует миграции конфигов — достаточно поменять одну опцию, и сборка, публикация и очистка продолжат работать бесшовно для пользователя.</p><p>Поддержка с <a href="https://ru.werf.io/docs/">подробной документацией</a>, активными каналами для комьюнити в Telegram (@werf_ru, @werf_io) и <a href="https://cloud-native.slack.com/archives/CHY2THYUU">Slack</a>, <a href="https://github.com/werf/werf">репозиторий</a> на GitHub. werf экономит время DevOps тем, что скрывает промежуточные сущности и даёт «одну кнопку» доставки для Kubernetes без «ручного труда».</p><p>Лицензия Apache 2.0, инструмент бесплатен.</p><h3>5. Travis CI: для открытого исходного кода</h3><p>Travis CI — один из старейших облачных CI/CD-сервисов, который сделал непрерывную интеграцию массовой. Он особенно популярен в мире open source, так как предлагает бесплатные сборки для публичных репозиториев GitHub. Travis CI поддерживает десятки языков — от Python, Go и Node.js до Rust, Java и Swift, а также простейшую YAML-конфигурацию, понятную даже новичкам.</p><p>Файл .travis.yml определяет этапы сборки, тесты, деплой и условия запуска. Travis автоматически создаёт окружение, устанавливает зависимости, запускает тесты и, при успехе, может задеплоить артефакты в Docker Hub, AWS, GCP или другие облака. Секреты хранятся через encrypted environment variables, а безопасность сборок обеспечивается изоляцией в контейнерах или VM.</p><p>Travis CI предлагает два режима работы:</p><ul><li>SaaS (travis-ci.com) — для публичных и приватных репозиториев GitHub и Bitbucket,</li><li>Enterprise/self-hosted — для компаний с повышенными требованиями к приватности.</li></ul><p>Его главные плюсы — простота и скорость старта. Подключить репозиторий и запустить пайплайн можно буквально за пару минут. Однако Travis постепенно уступает по гибкости GitHub Actions и GitLab CI — например, ограничен в управлении артефактами и параллелизме. Тем не менее, для небольших команд и open source-проектов это лёгкое, надёжное и исторически проверенное решение.</p><h3>6. TeamCity: для больших команд</h3><p>TeamCity — CI/CD-платформа от JetBrains, известная своей мощностью и глубокой интеграцией с IDE. В отличие от облачных решений вроде CircleCI или Travis, TeamCity чаще разворачивают on-premises — в инфраструктуре компании, где важны гибкость, безопасность и контроль над ресурсами.</p><p>TeamCity поддерживает агентную архитектуру: сервер управляет заданиями, а агенты выполняют сборки. Это позволяет масштабировать систему горизонтально и распределять нагрузку по проектам. Пайплайны можно описывать как через веб-интерфейс, так и в коде — с помощью Kotlin DSL, что делает конфигурации воспроизводимыми и версионируемыми.</p><p>Сильные стороны TeamCity — интеграции и аналитика. Он «из коробки» работает с GitHub, GitLab, Bitbucket, Perforce, Docker, Kubernetes и Jira. Поддерживаются артефактные зависимости, триггеры по веткам, матрицы тестов, параллельные билды и мониторинг производительности сборок. Интерфейс предоставляет подробные отчёты, логирование, метрики и визуализацию пайплайнов.</p><p>TeamCity доступен в двух вариантах:</p><ul><li>Professional (бесплатно) — до 100 сборочных конфигураций и 3 агентов;</li><li>Enterprise (платно) — без ограничений, с приоритетной поддержкой.</li></ul><p>Для DevOps-команд TeamCity остаётся «тяжёлым, но умным» решением: он требует настройки, зато даёт полный контроль над процессами и идеально подходит для крупных компаний с множеством проектов, репозиториев и зависимостей.</p><h3>7. GitHub Actions: CI/CD там, где живёт код</h3><p>GitHub Actions встроен в GitHub. Воркфлоу запускаются по событиям, секреты живут в Environments, а артефакты сохраняются в Actions storage. Marketplace с тысячами экшенов ускоряет старт. Для облачных проектов это быстрый способ получить работающий CI/CD за день. Для сложных сценариев пригодится matrix-сборка, self-hosted runners и защита окружений.</p><h3>8. Argo CD: GitOps-развёртывания в Kubernetes</h3><p>Argo CD — это инструмент для GitOps-развёртывания, который делает Kubernetes-деплой управляемым и прозрачным. Он следит за Git-репозиторием и автоматически приводит кластер к описанному в нём состоянию. Это не система сборки, а надёжный механизм доставки: если в Git изменилась конфигурация — Argo CD синхронизирует её с продакшеном.</p><p>Поддерживаются Helm, Kustomize, Jsonnet и стандартные YAML-манифесты. Через удобный веб-интерфейс можно увидеть актуальное состояние приложений, историю откатов и дрейф ресурсов. Инструмент умеет работать с несколькими кластерами и окружениями, что делает его особенно полезным для микросервисных архитектур.</p><p>Argo CD построен по принципу GitOps — он постоянно сверяет кластер с Git и восстанавливает соответствие, если кто-то изменил ресурсы вручную. Для DevOps-команд это надёжная «правая рука»: прозрачные деплои, полная история изменений и уверенность, что инфраструктура в кластере точно такая, как описано в коде.</p><h3>9. Tekton: конструктор конвейеров на Kubernetes</h3><p>Tekton — это фреймворк для построения CI/CD прямо внутри Kubernetes. Он создан по принципу cloud-native by design: все компоненты — это Custom Resource Definitions (CRD), которые управляются контроллерами кластера.</p><p>Каждый шаг пайплайна выполняется в отдельном контейнере, а весь процесс описывается декларативно в виде Kubernetes-ресурсов: Task, Pipeline, PipelineRun. Это делает Tekton естественной частью экосистемы Kubernetes: CI/CD можно описывать, версионировать и управлять им через kubectl.</p><p>Tekton не навязывает UI или оркестратор, но при необходимости расширяется с помощью Tekton Dashboard, Triggers, Chains и Hub. Он хорошо интегрируется с GitOps-инструментами вроде Argo CD и системами управления секретами (Kubernetes Secrets, Vault, Secret Manager).</p><p>Инструмент подойдёт DevOps-командам, которые уже используют Kubernetes и хотят строить конвейеры без внешних серверов и лишней инфраструктуры. Tekton даёт гибкость, масштабируемость и прозрачность — всё, что ценят разработчики в нативных cloud-решениях.</p><h3>10. Azure DevOps, Bamboo, Buildkite и другие</h3><p>Azure DevOps особенно ценят команды, работающие в экосистеме Microsoft. Это единая платформа, объединяющая репозитории, пайплайны, артефакт-сторы и трекер задач Azure Boards. Глубокая интеграция с GitHub, Active Directory и облаком Azure делает её удобной для крупных корпоративных проектов, где важны контроль доступа и централизованное управление инфраструктурой.</p><p>Bamboo — продукт Atlassian, органично встраивающийся в связку Jira, Bitbucket и Confluence. Он ориентирован на команды, которые уже живут в Atlassian-экосистеме и хотят управлять CI/CD прямо из единой среды. Bamboo поддерживает параллельные сборки, гибкие триггеры и мощные инструменты деплоя, сохраняя при этом привычный интерфейс Jira.</p><p>Buildkite сочетает облачную оркестрацию с self-hosted агентами. Такой гибридный подход даёт компаниям контроль над исполнением задач и безопасностью, не жертвуя удобством облачного интерфейса. Buildkite особенно популярен у крупных DevOps-команд, где важно совмещать изоляцию инфраструктуры с высокой масштабируемостью.</p><p>Среди нишевых решений стоит отметить Drone CI, Buddy, Semaphore и Spinnaker.</p><ul><li>Drone CI — лёгкий open source инструмент, работающий на контейнерах и YAML-конфигурациях, отлично подходит для self-hosted сценариев.</li><li>Buddy — ориентирован на визуальные пайплайны и быструю настройку автоматизации без глубоких знаний YAML.</li><li>Semaphore фокусируется на скорости — предлагает параллельные билды и гибкие матрицы тестов.</li></ul><p>Spinnaker создан Netflix для сложных multi-cloud деплоев, и остаётся эталоном для тех, кто строит масштабные delivery-конвейеры в AWS, GCP и Kubernetes.</p><h2>Как выбрать подходящий CI/CD инструмент для вашего проекта</h2><ul><li>Начните с исходных ограничений: важны требования к безопасности данных, облако или on-prem, навыки команды и бюджет. Оцените скорость и стабильность сборок, поддержку контейнеров и registry, хранение секретов. Для Kubernetes проверьте совместимость с Helm, Kustomize и GitOps.</li><li>Наблюдаемость критична: нужны логи, метрики и алерты, а пайплайны должны расти вместе с продуктом.</li><li>Опишите пайплайны кодом. Это снизит «дрейф конфигураций» и упростит обзоры.</li><li>Разделяйте ответственность: CI собирает и тестирует, CD развёртывает, GitOps удерживает состояние.</li><li>Внедрите шаблоны для типовых сервисов. Заранее продумайте кеширование и артефакты, чтобы не терять минуты на каждом шаге.</li><li>Начните с пилота на одном сервисе, а затем масштабируйте.</li><li>Не забывайте про безопасность: секреты в секрет-хранилищах, доступы минимальные, логи защищены.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как не сломать прод? Топ 5 самых частых ошибок при деплое</title>
      <link>https://tproger.ru/articles/kak-ne-slomat-prod--top-5-samyh-chastyh-owibok-pri-deploe</link>
      <comments>https://tproger.ru/articles/kak-ne-slomat-prod--top-5-samyh-chastyh-owibok-pri-deploe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ne-slomat-prod--top-5-samyh-chastyh-owibok-pri-deploe</guid>
      <description><![CDATA[<p>Вы все сделали идеально, нажимаете кнопку Deploy, и наступает тот самый момент, когда сердце замирает. Прод горит, мониторинги упали, команда в ужасе. Что нужно сделать, чтобы такого не было — рассказываем в статье.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ne-slomat-prod--top-5-samyh-chastyh-owibok-pri-deploe">Как не сломать прод? Топ 5 самых частых ошибок при деплое</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Jenkins]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда вы деплоите, вы не просто заливаете код. Считайте, что это босс на последнем уровне, а значит — привет, ловушки и подводные камни. Ошибки на этом этапе могут стоить дорого: от недовольства техлида до потери клиентов. Мы собрали топ самых частых (и самых болезненных) багов при выкладке — рассказываем, как их избежать.</p><h2>Неправильная настройка инфраструктуры в CI/CD пайплайне</h2><p>Это одна из самых коварных и частых ошибок при деплое, особенно в сложных системах, таких как Kubernetes-кластеры, облака или гибридные инфраструктуры. Эта проблема возникает, когда шаги деплоя в пайплайне не учитывают специфику целевого окружения. Все это может вылиться в непредсказуемое поведение приложения и структуры в целом. Разбираемся, как с этим бороться.</p><h3>Настройте окружение</h3><p>Разные окружения (dev, staging, prod) часто имеют отличия в конфигурации (например, версии библиотек, лимиты ресурсов, настройки сетей). Например, переменные окружения, заданные для staging, перезаписываются в prod — зависимости ломаются.</p><ul><li>Используйте Infrastructure as Code (IaC) инструменты, такие как Terraform или Pulumi, для создания идентичных окружений.</li><li>Храните конфигурации окружений в репозитории (например, в формате YAML или JSON) и применяйте их через CI/CD.</li><li>Настройте переменные окружения через секреты (например, HashiCorp Vault, AWS Secrets Manager) и убедитесь, что они не перезаписываются случайно.</li></ul><h3>Разворачивайте по стратегии</h3><p>В Kubernetes, например, при неверной конфигурации стратегии возможны простои. Pods могут быть удалены до того, как новые успеют стартовать, или новые версии вообще не будут работать.</p><ul><li>В Kubernetes используйте RollingUpdate с настройками maxSurge и maxUnavailable, чтобы новые поды стартовали постепенно, а старые были постоянно доступны.</li><li>Настройте readinessProbe и livenessProbe, чтобы Kubernetes не направлял трафик на неготовые поды.</li><li>Ответственно подходите к настройке стратегии и выбору количества реплик.</li><li>Для Helm-чартов фиксируйте версии (helm dependency update, helm package) и используйте helm upgrade --atomic для автоматического отката при сбое.</li></ul><p>Например, в манифесте Deployment можно указать:</p><h3>Избегайте race conditions</h3><p>Параллельные процессы в CI/CD (например, одновременная сборка и деплой) могут вызывать состояния гонки.</p><ul><li>Настройте блокировки (locks) в CI/CD, чтобы не было параллельных деплоев в одно окружение (например, через environments в GitLab CI).</li><li>Используйте атомарные операции в Helm и Server Side Apply в kubectl.</li></ul><h3>Обрабатывайте ошибки</h3><p>Часто может быть такое, что нет нормальной обработки ошибок (логов, статусов). Например, доступ к сервису пропадает, но пайплайн все равно успешно завершается.</p><ul><li>Регулярно тестируйте пайплайн на staging-окружении, симулируйте реальные сценарии деплоя.</li><li>Проверяйте доступность сервисов после деплоя с помощью health-check скриптов.</li></ul><p>Новую проверку можно, например, добавить так:</p><p>curl --fail http://any-app.example.com/health</p><h2>Нет изоляции переменных окружения и секретов</h2><p>Представьте: в staging-окружении используются тестовые ключи, а в продакшене — боевые. Но из-за ошибки в CI/CD пайплайне или конфигурации staging берет продовые credentials. Как итог — тестовое удаление данных в песочнице стирает боевую базу. Или еще хуже: токены утекают из-за слабых прав доступа к Secret Manager, и вас могут спокойно взломать. Ниже рассказываем, как это пофиксить.</p><h2>Разделяйте секреты по окружениям</h2><p>Если переменные окружения или ключи не разделены между dev, staging и prod, они могут быть случайно использованы в неправильном контексте.</p><ul><li>Храните секреты в Secret Manager (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Kubernetes Secrets) с четким разделением по окружениям (например, пути secrets/staging/db, secrets/prod/db).</li><li>Используйте префиксы или теги для идентификации окружения (например, STAGING_API_KEY, PROD_API_KEY).</li><li>Настройте права доступа CD так, чтобы пайплайн мог подтягивать только секреты, которые относятся к текущему окружению.</li></ul><p>Например, в Vault это настраивается так:</p><h2>Не храните секреты в коде</h2><p>Иначе утечка неизбежна.</p><ul><li>Уберите секреты из репозиториев и .env-файлов и используйте Secret Manager.</li><li>Для Kubernetes используйте Secret-объекты или интеграцию с внешними менеджерами (например, External Secrets Operator).</li><li>Проверяйте репозитории на утечки с помощью инструментов типа truffleHog или gitleaks.</li></ul><p>Вот пример Kubernetes Secret:</p><h2>Ограничивайте доступ</h2><p>Это принцип Scoped Permissions — с помощью него можно снизить риски случайного или намеренного использования секретов.</p><ul><li>Используйте IAM-роли в облаке (например, AWS IAM Roles for Service Accounts) с минимальными правами.<br /></li><li>Ограничивайте доступ разработчиков к продовым секретам через RBAC или Vault-профили.</li></ul><p>Вот AWS IAM-политика для staging:</p><h2>Ротируйте ключи</h2><p>Это поможет избежать ситуации, когда после инцидента или утечки ключи не обновляются.</p><ul><li>Настройте автоматическую ротацию ключей в Secret Manager (например, AWS Secrets Manager поддерживает ротацию через Lambda).</li><li>После инцидента сразу же ротируйте скомпрометированные ключи и пересоздавайте секреты.</li><li>Логируйте доступ к секретам для аудита (например, через Vault Audit Logs).</li></ul><h2>Неправильная настройка health-checks в Kubernetes или других оркестраторах</h2><p>Неправильная настройка readinessProbe и livenessProbe в Kubernetes — это, можно сказать, классика. Вы обновляете сервис, поды запускаются, но сразу же помечаются как unhealthy. Причина — неправильный readinessProbe или livenessProbe. Например, путь /healthz больше не существует, или проверка уходит в таймаут из-за долгой инициализации. В результате: контейнеры бесконечно рестартуются, сервис недоступен, кластер в панике.</p><h3>Разделяйте назначение проб</h3><p>readinessProbe проверяет, готов ли под принимать трафик, а livenessProbe — не завис ли он. Если их смешать, можно ждать сбой,  например, трафик пойдет на не до конца инициализированный сервис.</p><ul><li>Используйте разные endpoints для проб. Например, /health для readinessProbe (готовность сервиса) и /alive для livenessProbe (проверка зависаний).</li><li>Настройте readinessProbe так, чтобы она возвращала 200 только после полной инициализации (например, подключения к базе).</li><li>Для livenessProbe проверяйте минимальную работоспособность (например, ответ сервера без проверки внешних зависимостей).</li></ul><h3>Учитывай время инициализации</h3><p>Сервис может запускаться медленно, и слишком строгие таймауты приведут к сбоям.</p><ul><li>Установите initialDelaySeconds с запасом, чтобы учитывать время прогрева (например, загрузку кэша или подключение к базе).</li><li>Настройте timeoutSeconds и periodSeconds так, чтобы проба не завершалась слишком быстро, но и не крутилась вечно.</li><li>Используйте failureThreshold для нескольких попыток перед пометкой пода как unhealthy.</li></ul><p>Вот пример для сервиса с долгим стартом:</p><h3>Добавьте grace period</h3><p>Он дает сервису время корректно завершиться перед рестартом.</p><ul><li>Установите terminationGracePeriodSeconds в манифесте Deployment, чтобы под мог завершить запросы перед остановкой.</li><li>Настройте preStop хук, если нужно выполнить действия перед завершением.</li></ul><h3>Тестируйте на staging</h3><p>Проблемы с пробами часто всплывают только в проде, если staging не идентичен.</p><ul><li>Убедитесь, что staging-окружение повторяет прод по конфигурации и нагрузке.</li><li>Добавьте автоматические тесты в CI/CD для проверки endpoints (/health, /alive) перед деплоем.</li><li>Симулируйте реальные сценарии (например, медленный старт или сбой зависимостей) на staging.</li></ul><p>В CI/CD можно добавить:</p><h2>Неправильная работа с конфигурациями через Helm или Kustomize</h2><p>Представьте: обновили Helm-чарт, но в values.yaml остались старые переменные, которые ломают новые настройки. Или Kustomize патчит не тот ресурс, и манифесты применяются с ошибками. В итоге: поды падают, сервисы недоступны, и никто не знает что делать. Рассказываем, что с этим делать.</p><h3>Валидируйте Helm-чарты перед деплоем</h3><p>Так можно найти ошибки до применения манифестов.</p><ul><li>Используйте helm template или helm install –dry-run для рендеринга манифестов и их проверки.</li><li>Включите schema validation для values.yaml с помощью JSON Schema (поддерживается Helm v3.6+).</li><li>Проверяйте манифесты через kubeval или kubectl apply –dry-run=server для подтверждения соответствия Kubernetes API.</li></ul><h3>Тестируйте Kustomize-конфигурации</h3><p>Kustomize может патчить не то, что вы ожидали, если селекторы или структура неправильные.</p><ul><li>Прогоняйте kustomize build для генерации итоговых манифестов и проверяйте их перед деплоем.</li><li>Используйте kubectl apply –dry-run=server -k . для валидации в кластере.</li><li>Проверяйте селекторы патчей в kustomization.yaml на точность (например, name и namespace).</li></ul><h3>Управляйте версиями и структурой</h3><p>Несогласованность версий чартов или манифестов приводит к неожиданным изменениям.</p><ul><li>Фиксируйте версии Helm-чартов в Chart.yaml и используйте точные теги (например, 1.2.3, а не latest).</li><li>Храните values.yaml отдельно для каждого окружения (values-staging.yaml, values-prod.yaml).</li><li>Для Kustomize используйте базовые манифесты и патчи, разделённые по окружениям (например, overlays/staging, overlays/prod).</li></ul><h3>Документируйте и мониторьте</h3><p>Без документации сложно понять, что изменилось, а без мониторинга — почему упало.</p><ul><li>Ведите CHANGELOG.md для Helm-чартов и Kustomize патчей, описывая изменения в структуре и значениях.</li><li>Логируйте команды деплоя (helm upgrade –debug, kubectl apply -k .) для отладки.</li><li>Настройте мониторинг статуса подов через Prometheus, чтобы сразу видеть сбои из-за ошибок конфигурации.</li></ul><p>Вот пример получения подробного лога helm:</p><h2>Нет политики управления версиями артефактов</h2><p>С этой штукой шутить нельзя. Каждый новый билд заливается с тегом latest, и через неделю никто не помнит, какая именно версия работает в проде. А если что-то сломалось, откатиться просто невозможно: старый образ либо затерт в registry, либо его никто не пометил. На выходе — паника и хаос.</p><h3>Используйте семантическое версионирование (semver) или уникальные теги</h3><p>Так банально будет однозначность и отслеживаемость версий.</p><ul><li>Присваивайте образам теги по схеме semver (1.2.3), commit hash (abc1234) или временной метке (20250429-1345).</li><li>Избегайте latest в продакшене — это бомба замедленного действия.</li><li>В CI/CD автоматически генерируйте теги на основе версии приложения или Git commit.</li></ul><p>Вот пример тег-образа:</p><p>docker build -t my-app:1.2.3 -t my-app:$(git rev-parse –short HEAD)</p><h3>Фиксируйте версии в манифестах и пайплайнах</h3><p>Immutable теги гарантируют, что деплой всегда использует ожидаемую версию.</p><ul><li>В Kubernetes манифестах указывайте точные теги вместо latest.</li><li>Настройте CI/CD так, чтобы тег образа передавался в Helm или Kustomize как параметр.</li><li>Используйте инструменты вроде helm upgrade с фиксированными версиями чартов.</li></ul><h3>Настройте retention policy для артефактов</h3><p>Хранение старых образов позволяет откатиться к стабильной версии.</p><ul><li>В container registry (Docker Hub, AWS ECR, Harbor) настройте правила хранения, чтобы сохранять последние N версий или образы за последние X дней.</li><li>Регулярно очищайте устаревшие артефакты, но сохраняйте критические версии (например, те, что в проде).</li><li>Используйте теги для маркировки стабильных версий (например, prod-1.2.3).</li></ul><p>Пример — AWS ECR lifecycle policу:</p><h3>Автоматизируйте версионирование в CI/CD</h3><ul><li>В CI/CD пайплайне генерируйте теги на основе Git тегов, commit hash или переменных окружения.</li><li>Проверяйте, что образ с нужным тегом пушится в registry и используется в деплое.</li><li>Добавьте шаг валидации манифестов, чтобы убедиться, что теги фиксированы.</li></ul><p>Ошибки при деплое могут вылиться в серьезные проблемы для проекта. DevOps-инженеры не просто запускают пайплайны, а следят за жизненным циклом продукта — от инфраструктуры до мониторинга. Документируйте ошибки, создавайте чек-листы, автоматизируйте каждый шаг и учитесь на инцидентах. И главное — никогда не деплойте в пятницу вечером.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разворачиваем инструменты CI/CD: практики от DevOps-инженеров</title>
      <link>https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov</link>
      <comments>https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov</guid>
      <description><![CDATA[<p>Освойте ключевые практики развёртывания CI/CD. В статье разберём инструменты, автоматизацию процессов и советы от опытных DevOps-инженеров - Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov">Разворачиваем инструменты CI/CD: практики от DevOps-инженеров</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Jenkins]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Feb 2025 14:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Быстро и стабильно выкатывать релизы — сейчас база. Автоматизировать процесс разработки помогают инструменты CI/CD. По данным <a href="https://cd.foundation/wp-content/uploads/sites/78/2024/04/State-of-CICD-Report-April-22-2024-Updated.pdf?utm_referrer=https%3A%2F%2Fcd.foundation%2F">исследования</a> CD Foundation, самую высокую эффективность показывают команды, которые используют и managed, и self-hosted решения: так, 12% деплоят аж несколько раз в день (против 10%, которые не используют никакие тулзы).</p><p>Мы поговорили с экспертами Solvery — <a href="https://solvery.io/ru/mentor/vmax?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=cicd&amp;utm_campaign=m_vorobiev">Максимом Воробьевым</a>, DevOps-инженером в Tymy, автором <a href="https://t.me/vmaxch">tg-канала</a>, и <a href="https://solvery.io/ru/mentor/shapovalov_dev?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=cicd&amp;utm_campaign=shapovalov_dev">Евгением Шаповаловым</a>, DevOps Cloud Engineer в Virtuozo — и узнали, какие инструменты выбрать и как избежать подводных камней.</p><h2>Лучшие инструменты CI/CD: что использовать?</h2><p>Как правило, выбор инструмента зависит от ваших конкретных требований, используемой инфраструктуры и опыта команды. Например, если вы работаете над SaaS-приложением и хотите быстро запустить систему без лишних хлопот по поддержке, то SaaS-решения вроде GitLab CI/CD могут быть оптимальным вариантом. А если предстоит разработка крупного проекта со сложными этапами сборки и интеграции (вроде сборки приложений на компилируемых языках с большим количеством зависимостей под разные архитектуры), то на помощь приходит on-premise решение, например, Jenkins.</p><blockquote>Создавая систему, ты должен её поддерживать, ухаживать и следить, чтобы все плагины были последних версий, чтобы не было деградации при апгрейде на новую версию, чтобы сам апгрейд был масштабируемым и гибким. Ответственность за инфраструктуру даёт контроль, но и это же огромный минус, когда речь идет о Jenkins. В небольших командах это не так критично, но в крупных компаниях часто поддержка ведется поверхностно: реагируют на вызовы, добавляют костыли, но забывают про изначальную архитектуру.</blockquote><p>А если ваша команда уже знакома с GitLab, и инфраструктура позволяет использовать облачные сервисы, GitLab CI/CD может стать отличным выбором. Его интеграция с репозиторием значительно упрощает настройку пайплайнов,  что особенно важно для быстрого развертывания и минимизации затрат на поддержку.</p><blockquote>В иностранных компаниях чаще всего используют GitHub в связке с GitHub Actions, хотя после покупки компанией Microsoft никак не могу назвать его самым надёжным — раз в пару месяцев web UI пятисотит, и работа встаёт. При работе с российскими компаниями резко становится актуальным вопрос суверенной инфраструктуры и избежания блокировок, и в этом случае золотым стандартом является GitLab в self-hosted варианте. Он довольно хорошо себя показывает в реальной работе и лёгок в обновлении/обслуживании.</blockquote><h2>Какие могут быть проблемы</h2><p>Любой новый инструмент даёт не только возможности, но и риски его неверного применения или того, что он ведёт себя не так, как предыдущие.</p><p>При внедрении CI/CD инструментов можно столкнуться со следующими трудностями:</p><ul><li><b>Сложность настройки.</b> С некоторыми инструментами придется попотеть, чтобы первоначально настроить конфиги и интегрировать их с существующим системами.</li><li><b>Поддержка плагинов. </b>Например, постоянно обновлять и поддерживать плагины нужно в Jenkins.</li><li><b>Обновления и совместимость.</b> Обновления инструментов могут сломать все совместимости с настроенными конфигами и плагинами.</li></ul><blockquote>Так, на одном из прошлых проектов мигрировали с ingress-nginx на Traefik: дело затянулось из-за несовместимости конфигов, повышенного потребления памяти и разного поведения в очень узких сценариях — пришлось отправлять PR с патчем, а пока его не приняли — использовать кастомно собранную версию.</blockquote><p>Чтобы избежать этого, при проектировании CI/CD системы важно думать о будущем:</p><ul><li><b>Фундаментальные принципы. </b>Стройте архитектуру таким образом, чтобы она оставалась максимально независимой от конкретного инструмента. Это поможет избежать проблем при смене технологий. Например, для создания раннеров, где будет происходить сборка,  можно использовать подход Infrastructure as a Code — Terraform и ansible.</li><li><b>Масштабируемость.</b> Часто изначально упускают из виду рост нагрузки и количество сборок, что может привести к проблемам в будущем. Частая проблема — нехватка железа или борьба за ресурсы, отсюда падает скорость.</li><li><b>Опыт команды.</b> Отдавайте предпочтение тем системам, в которых у ваших специалистов уже есть опыт. Иногда имеет смысл разделять процессы CI и CD, чтобы можно было оптимизировать их независимо.</li></ul><blockquote>Если есть возможность, стоит стремиться к использованию единого инструмента CI/CD для всех команд.  Это облегчает обмен опытом и стандартизирует процессы. Однако рост компании и появление новых продуктов иногда требуют перехода на более современные решения. Например, если устаревшая архитектура уже не справляется с нагрузками, переход на GitLab CI/CD может быть проще и эффективнее, чем попытки модернизировать существующую систему.</blockquote><h2>Отказоустойчивость и масштабируемость</h2><p>Иногда команды, чтобы повысить отказоустойчивость и масштабируемость приложений, разворачивают инструменты CI/CD на разных серверах. Например, GitLab имеет микросервисную архитектуру, и каждый компонент скейлится отдельно. Процесс скейлинга довольно неплохо описан в <a href="https://docs.gitlab.com/ee/development/scalability.html">документации. ​​</a></p><p>Чтобы добавиться отказоустойчивости, следуйте этим шагам:</p><ul><li>продумайте сценарии отказов,</li><li>определите целевые показатели по восстановлению — довольно неплохо про это написано у <a href="https://www.atlassian.com/ru/incident-management/kpis/common-metrics">Atlassian</a>,</li><li>поддерживайте актуальную документацию по системе и ранбуки по её восстановлению,</li><li>делайте бэкапы данных по правилу 3-2-1 и проверяйте их на работоспособность.</li></ul><p>Более того, сегодня многие компании переходят к оркестраторам вроде Kubernetes для управления CI/CD-инфраструктурой.</p><p>Такой подход позволяет:</p><ul><li>Автоматически масштабировать агентов и интегрировать систему с мониторингом.</li><li>Обеспечить динамическое управление ресурсами (например, установка Jenkins в Kubernetes через Helm-чарт).</li><li>При использовании SaaS-решений проблемы с управлением инфраструктурой отпадают, и можно сосредоточиться на разработке и тестировании.</li></ul><p>Риски будут всегда — как и в любой распределенной архитектуре: сетевые задержки, сложнее мониторить и восстанавливать.</p><h2>Безопасность: как хранить секреты</h2><p>Безопасность — ключевой момент в любой CI/CD-системе. Очень важно правильно хранить конфиденциальную информацию, такую как ключи, токены и настройки:</p><ul><li><b>Специализированные сервисы. </b>Используйте решения вроде Microsoft Azure Key Vault, HashiCorp Vault, AWS Secrets Manager или Google Cloud Secret Manager.</li><li><b>Рекомендации. </b>Никогда не встраивайте credentials в код или образы.</li><li><b>Ограничьте доступ к раннерам</b>, организовав его только внутри защищённого контура (например, с помощью RBAC, OAuth и временных токенов).</li></ul><blockquote>Лучший способ сохранить креды в секрете — вынести во внешнюю доверенную систему (HashiCorp Vault или форк OpenBao), в которой доступ к ним ограничивается, выдаётся маленькими частями и аудируется.</blockquote><p>Вариант попроще — хранить секреты в репозитории зашифрованными. Это можно делать с помощью проектов <a href="https://github.com/getsops/sops">Sops</a> или <a href="https://github.com/bitnami-labs/sealed-secrets">Sealed Secrets</a>, а ключ есть только у доверенных систем (хранится в CI variables / только в K8s кластере).</p><p>Но ни в коем случае не храните важные секреты открытыми в репозиториях. Манифест <a href="https://12factor.net/config">12 факторов</a> вышел в 2011, но команды до сих пор совершают такие ошибки, и в случае утечки последствия могут быть довольно фатальными.</p><h2>Как оптимизировать сборку</h2><p>При сборке Docker-образов в CI/CD pipeline разработчикам часто приходится выбирать между Kaniko и Docker-in-Docker (DinD):</p><ul><li><b>Kaniko.</b> Это инструмент, который позволяет строить образы внутри контейнеров без запуска демона Docker. Он считается более безопасным и простым в использовании, особенно в Kubernetes-средах.</li><li>Docker-in-Docker. Подход, при котором Docker запускается внутри контейнера. Да, у него полный функционал Docker, но есть и риски, связанные с безопасностью и производительностью, а также сложности в настройке.</li></ul><blockquote>На проектах используем DinD — он легко устанавливается, но требует повышенных привилегий. Kaniko — более современный и в теории более безопасный. Если потребуется собирать образы из недоверенных источников, в первую очередь, рассмотрел бы именно его. Лучшую же безопасность обеспечивают Rootless-контейнеры. Сейчас поддерживаю в компаниях доверенные системы, поэтому риски, связанные с privilege escalation, не так значительны. По поводу версионности — используйте immutable tags (у нас commit SHA в качестве версии образа) и не используйте :latest.</blockquote><h2>Автоматизация и мониторинг</h2><p>Минимизировать ручные операции можно и нужно, поэтому не бойтесь автоматизировать.  Но не забудьте удостовериться, что время на автоматизацию потрачено с <a href="https://xkcd.com/1205/">пользой</a>.</p><p>Вот, что может помочь:</p><ul><li>Infrastructure as Code (IaC) — Terraform, Ansible, Pulumi для автоматизированного развертывания окружений.</li><li>GitOps + ArgoCD, Flux.</li><li>Шаблоны CI/CD pipeline — стандартизированные pipeline (например, shared GitLab CI templates или Jenkins shared libraries).</li><li>Автоматическое управление версиями и релизами — semantic versioning + Git tags.</li><li>Self-healing механизмы — автоисправление проблем (например, перезапуск зависших pipeline).</li></ul><p>Конечно, есть вариант проще: напишите подробный ранбук по ручным действиям, назначьте ответственных за его выполнение, поставьте напоминалку.</p><p>В любом случае, надёжный CI/CD требует постоянного контроля:</p><ul><li><b>Определение метрик.</b> Время сборок, тестов, количество запусков, утилизация выделенного железа</li><li><b>Мониторинг.</b> Собирайте метрики и логи с помощью инструментов вроде Prometheus и систем логирования, чтобы вовремя обнаруживать проблемы инфраструктуры и следить за метриками CI/CD.</li><li><b>Уведомления.</b> Настройте интеграцию с системами инцидент-менеджмента, например, Jira, для оперативного реагирования на сбои.</li><li><b>Хранилище артефактов.</b> Обеспечьте надежное хранение сборочных артефактов (например, с помощью Nexus или Artifactory).</li></ul><p>В случае SaaS-решений, например, GitLab или TeamCity, существует поддержка внутренних систем сборки и анализа метрик, а также интеграции с системами мониторинга, поддерживающими стандарты Prometheus.</p><blockquote>В РФ часто приходится довольствоваться опенсорс-решениями, много чего недоступно из коробки. Из-за этого даже базовые задачи, вроде сбора метрик для развития CI/CD, превращаются в сложный квест, но без него не получится развивать ваш CI/CD. Часто доработка выходит в копеечку и ложится на плечи отдела разработки.  Помимо метрик, собирать и анализировать приходится логи, а значит, нужна система логирования.  Опять же накладывается оверхед, если приходится поддерживать несколько CI/CD и новую систему наблюдаемости. Что собирать? Определите несколько ключевых метрик. Это могут быть частота и время пайплайнов интеграции, время прохождения тестов, время восстановления деплоев после падений MTTR и так далее.</blockquote><h2>Какие есть методы быстрого восстановления после сбоев</h2><p>Самый банальный совет — старайтесь не допускать таких сбоев, восстановление которых требует ручных операций. Правильно настроенные сервисы (в нескольких репликах за балансировщиком, stateless или со стейтом в БД отдельно от сервиса) самовосстанавливаются (спасибо Kubernetes!).</p><blockquote>Ещё рекомендация — о сбоях лучше узнавать от мониторинговых систем и заранее («место на диске вот-вот закончится»), а не от пользователей.</blockquote><p>Если сбоя всё-таки избежать не удалось, после восстановления делаем работу над ошибками, пишем постмортемы и улучшаем надёжность на практике. Чиним первопричину сбоя, а не только его последствия.</p><h2>Вместо заключения</h2><p>Построение CI/CD — гораздо больше, чем просто выбор инструмента. Это комплексное решение, которое должно быть масштабируемым, гибким и безопасным. Важно:</p><ul><li>Выбирать технологии с учетом специфики проекта и опыта команды.</li><li>Проектировать архитектуру с прицелом на будущий рост.</li><li>Иногда разделять процессы CI и CD для лучшей оптимизации.</li><li>Интегрировать систему с оркестраторами для повышения отказоустойчивости.</li><li>Использовать специализированные сервисы для безопасного хранения секретов.</li><li>Обеспечить централизованный мониторинг и систему уведомлений.</li></ul><p>Наконец, это стратегический процесс, который требует опыта и учета множества факторов. Если вам нужна помощь с выбором оптимального решения или разбор сложных кейсов — на <a href="https://solvery.io/?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=cicd&amp;utm_campaign=main_page">Solvery можно найти DevOps-менторов</a>, которые внедряли CI/CD в продуктах и знают, как избежать типичных ошибок. Разбирайте инфраструктуру с практиками, а не на собственных фейлах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как настроить и использовать Jenkins для автоматизации процессов</title>
      <link>https://tproger.ru/articles/kak-nastroit-i-ispolzovat-jenkins-dlya-avtomatizacii-processov</link>
      <comments>https://tproger.ru/articles/kak-nastroit-i-ispolzovat-jenkins-dlya-avtomatizacii-processov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-nastroit-i-ispolzovat-jenkins-dlya-avtomatizacii-processov</guid>
      <description><![CDATA[<p>Как настроить и использовать Jenkins для автоматизации процессов. Показываем основные способы работы с Jenkins. Рассматриваем возможные варианты и пошаговую инструкцию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-nastroit-i-ispolzovat-jenkins-dlya-avtomatizacii-processov">Как настроить и использовать Jenkins для автоматизации процессов</a>»</p>]]></description>
      <category><![CDATA[Jenkins]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 14 Sep 2024 08:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>От стабильной работы инструментов автоматизации зависит скорость разработки и прибыль компании. Jenkins — основа CI/CD, ускоряющая выпуск релизов. Перед его интеграцией в проект необходимо знать, как настраивать пайплайны и создавать агентов. В этой статье расскажем о принципах, которые сделают Jenkins надежным инструментом в вашем CI/CD-конвейере.</p><p>Jenkins — часть более широкой цепочки поставки. Если нужен общий маршрут от Git и Docker до CI/CD, инфраструктуры, Kubernetes и GitOps, пригодится <a href="https://tproger.ru/articles/roadmap-devops-inzhenera-v-2026-godu--chto-uchit-i-v-kakom-poryadke">Roadmap DevOps-инженера в 2026 году: что учить и в каком порядке</a>.</p><h2>Что такое Jenkins</h2><p><b>Jenkins </b>— это фреймворк для непрерывной разработки. Он автоматизирует рутинные задачи и следит за качеством кода. Jenkins можно представить как робота-ассистента, который 24/7 проверяет вашу работу, собирает приложения, запускает тесты и сообщает результаты команде.</p><p>В архитектуре инструмента есть центральный компонент — <b>контроллер </b>(Master Mode). Он руководит всеми процессами. Контроллер распределяет выполнение задач согласно расписанию между <b>агентами </b>(слейвами). Результаты сохраняются в build-логе контроллера.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/e55c9754-c081-4806-a6e9-7aa8e8a9a4ff.jpg" alt="" /></figure><p>Обычно выделяют отдельный слейв-сервер под каждую категорию задач:</p><ul><li>Для разработки.</li><li>Для тестирования.</li><li>Для пользователей.</li></ul><p>Таски можно повесить на одного агента, но помните про риск перегрузки. В случае сбоя единственного сервера проблема одновременно затронет всех участников проекта. Поэтому даже на ранних стадиях советуем распределять задачи между нескольким слейвами.</p><h2>Сценарии применения Jenkins</h2><ul><li><b>Автоматизация сборки. </b>Когда разработчики вносят изменения в код на GitHub, Jenkins автоматически запускает сборку проекта.</li><li><b>Выполнение тестов.</b> Можно настроить Jenkins так, чтобы после каждой успешной сборки сразу же начиналось тестирование.</li><li><b>Непрерывная доставка.</b> Пайплайн в Jenkins можно настроить на автоматическое развертывание приложения на тестовом сервере после успешного прохождения всех тестов.</li><li><b>Мониторинг. </b>При помощи плагина Dashboard можно отслеживать статус сборок и тестов. Jenkins отправит оповещения по электронной почте или в Slack.</li><li><b>Управление артефактами.</b> Jenkins автоматически создаст и сохранит артефакт в формате JAR или Docker-образов после успешной сборки.</li></ul><h3>Преимущества и недостатки Jenkins</h3><p><b>Плюсы:</b></p><ul><li>Работает на Linux, macOS и Windows.</li><li>Интегрируется с облачными платформами.</li><li>Поддерживает параллельное выполнение задач.</li><li>Надежен в решении DevOps-задач.</li><li>Бесплатный опенсорсный проект.</li><li>Тонкая настройка процессов.</li><li>1800+ плагинов в каталоге.</li><li>Активное сообщество.</li><li>Наличие REST API.</li></ul><p><b>Минусы:</b></p><ul><li>Не подходит для маленьких проектов.</li><li>Нет аналитики по CI/CD-цепочкам.</li><li>Зависимость от плагинов.</li></ul><h2>Установка Jenkins</h2><p>Фреймворк написан на Java, поэтому для его работы необходимо установить JDK 21 — <a href="https://www.oracle.com/java/technologies/downloads/">Java Development Kit</a>. Также потребуется пользователь с root-правами или доступ через sudo.</p><p>Jenkins поддерживает только две версии JDK — 21 и 17.</p><h2>Jenkins на Ubuntu</h2><p>В первую очередь проверим наличие пакета Java в системе.</p><p>Если терминал не прислал в ответ версию Java, нужно установить пакет JDK. Заходим на <a href="https://www.oracle.com/java/technologies/downloads/">официальный сайт</a>, копируем ссылку на скачивание ARM64 Compressed Archive и возвращаемся в терминал.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/4cbf4584-4fb9-4685-babd-6b2dc8377a46.jpg" alt="" /></figure><p>С помощью wget и полученной ссылки на файл загружаем JDK:</p><p>Создадим каталог для распаковки архива:</p><p>Распакуем архив в созданную директорию:</p><p>Для установки JDK воспользуемся PPA. Добавим его в список репозиториев:</p><p>Обновим доступные пакеты:</p><p>Теперь установим JDK:</p><p>Приступаем к установке Jenkins. Первым делом получаем GPG-ключ шифрования. Система будет использовать его для верификации пакетов из репозитория Jenkins.</p><p>Применяем curl для загрузки ключа и сразу же интегрируем его в систему командой sudo tee:</p><p>Следующим шагом добавляем в Ubuntu официальный репозиторий Jenkins, согласно <a href="https://pkg.jenkins.io/debian-stable/">документации</a>:</p><p>Обновляем список пакетов:</p><p>Устанавливаем Jenkins:</p><p>Проверяем результат установки, обратившись к сервису Jenkins:</p><p>Если процесс не обнаружен, убедитесь, что порт 8080 не занят другими приложениями. Также проверьте наличие достаточного объема оперативной памяти. <b>Для корректной работы Jenkins необходимо как минимум 256 МБ ОЗУ.</b></p><h2>Jenkins на Windows</h2><p>Перед тем, как настроить Jenkins, подготовим окружение: скачиваем последнюю версию JDK 21 с <a href="https://www.oracle.com/java/technologies/downloads/">официального сайта</a> и устанавливаем Development Kit в систему.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/ffc17e63-71b0-41b0-bca0-0e72f1205060.jpg" alt="" /></figure><p>Далее <a href="https://www.jenkins.io/download/">скачиваем Jenkins</a> и запускаем установщик. В поля Account и Password нужно ввести имя учетной записи компьютера и пароль. Если возникла ошибка входа, <a href="https://stackoverflow.com/questions/63410442/jenkins-installation-windows-10-service-logon-credentials/63582616">обратитесь к этому руководству</a> или переключитесь на первый параметр.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/35cefba3-974a-46d5-9489-04ab79bc846b.jpg" alt="" /></figure><p>На следующем этапе выбираем стандартный порт 8080 и запускаем тест.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/e245bf60-1f7d-465e-815d-8a04730e6c89.jpg" alt="" /></figure><p>Теперь указываем путь до JDK. Если предварительно не устанавливали комплект разработчика, придется прервать установку.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/4b8db1a1-18ca-4255-a3ca-34e85b2d8242.jpg" alt="" /></figure><p>Соглашаемся на установку компонентов и закрываем установщик. Если процесс Jenkins появился в диспетчере задач, значит, все прошло успешно и можно приступать к настройкам.</p><h2>Конфигурация Jenkins</h2><p>Откройте браузер и введите адрес:</p><ul><li>Ubuntu: http://ip_сервера:8080.</li><li>Windows: http://localhost:8080.</li></ul><p>На странице разблокировки Jenkins нужно ввести пароль администратора. Путь к файлу с паролем может отличаться.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/1611b068-4423-493b-aa2f-d976db79ea1a.jpg" alt="" /></figure><p>Выберите установку стандартного набора плагинов — левая кнопка Install suggested plugins. Если вы уже знаете, какие плагины понадобятся для интеграции на проекте, выбирайте Select plugins to install.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/846d8f07-c349-4a69-b0ac-e7d40adadd18.jpg" alt="" /></figure><p>Дождитесь завершения загрузки дополнений.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/4189eb6e-5765-41eb-ab72-336a57fc06c3.jpg" alt="" /></figure><p>Создайте учетную запись администратора.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/388939c3-fcb6-4b89-a55d-f4fe486fa2fa.jpg" alt="" /></figure><p>После успешной настройки вы увидите сообщение о готовности Jenkins к использованию.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/52a5bfeb-60e2-4adb-831e-64a190032a49.jpg" alt="" /></figure><p>Jenkins со стандартными плагинами установлен и готов к интеграции в проект. Теперь создадим ноду и назначим ей выполнение задачи.</p><h2>Настройка рабочих агентов (nodes)</h2><p>Создадим первого слейва через SSH.</p><p>Для этого нужно установить два дополнительных плагина — SSH Agent и SSH Slaves. С их помощью Jenkins сможет добавлять агентов по SSH и запоминать учетные данные для подключения к нодам.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/f113cd3a-eff8-47db-9923-846f60317707.jpg" alt="" /></figure><p>Переходим в раздел «Manage Jenkins → Manage Nodes → New Node». Новой ноде зададим имя, краткое описание, количество потоков (executors), рабочую директорию, метки (labels).</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/a4abaf31-8454-41b8-8db7-8f1373df589d.jpg" alt="" /></figure><p>В Host вводим ip-адрес сервера, а для выбора способа подключения выбираем «Keys». В открывшемся окне вводим RSA-ключ и сохраняем данные входа.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/ffdc1a22-532c-49ae-b9b6-b0253380941c.jpg" alt="" /></figure><p>Чтобы задача запускалась на созданной ноде и не нагружала мастер-сервер, нужно указать это в настройках пайплайна.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/2d9bf55c-e309-4438-a267-4fc4d2bde5a2.jpg" alt="" /></figure><p>В поле Label нужно ввести метку, которую вы указывали при создании ноды. Теперь после запуска пайплайна по кнопке «Build Now» нагрузка будет распределяться между потоками указанного агента.</p><h2>Создание и настройка пайплайнов в Jenkins</h2><p><b>Пайплайн </b>— это набор плагинов для определения модели сборки, тестирования и развертывания кода. С помощью пайплайнов можно увидеть жизненный цикл этих процессов.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/0f0e58d7-cb3c-4bc4-bbd0-29371fba1c5d.jpg" alt="" /></figure><p>Типы пайплайнов:</p><ul><li>Скриптовые — гибкий синтаксис. Исполняемый код загружается из xml-файла.</li><li>Декларативные — более структурированный синтаксис. Исполняемый код извлекается из репозитория.</li></ul><p>Пайплайны определяются в файле Jenkinsfile, он хранится в репозитории с кодом проекта.</p><p>При описании пайплайнов верхнего уровня рекомендуется использовать декларативный тип, так как в нем можно определить действия после каждого стейджа.</p><p>Для создания первого пайплайна воспользуемся официальными мануалами Jenkins с описанием <a href="https://jenkins.io/doc/book/pipeline/syntax">синтаксиса</a> и <a href="https://jenkins.io/doc/pipeline/steps/">степов</a> на языке <a href="https://www.jenkins.io/doc/pipeline/steps/workflow-cps/">Groove</a>.</p><h2>Создание простого пайплайна</h2><p>Для создания задачи войдите в аккаунт Jenkins. На главной странице нажмите «New Item», введите имя для пайплайна и выберите тип «Pipeline».</p><p>В окне конфигурации перейдите к секции «Pipeline». В поле «Script» введите базовый скрипт пайплайна из <a href="https://www.jenkins.io/doc/book/pipeline/getting-started/">официального руководства</a>. Сохраните конфигурацию.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/326b0361-3271-4fbe-a756-1dc35b24c5e5.jpg" alt="" /></figure><p>Вернитесь на страницу проекта и нажмите «Build Now», чтобы запустить пайплайн. После запуска вы увидите новую сборку в истории. Нажмите на номер сборки и выберите «Console Output», чтобы просмотреть результаты выполнения каждого этапа.</p><h2>Работа с многоэтапными пайплайнами</h2><p>Пайплайны поддерживают параллельную обработку этапов:</p><ul><li>используя parallel, можно запускать несколько этапов одновременно;</li><li>при помощью when в пайплайне реализуется ветвление;</li><li>для обработки ошибок используются блоки post;</li><li>чтобы переиспользовать блоки кода, можно определять переменные окружения в environment;</li><li>с помощью <a href="https://www.jenkins.io/doc/book/pipeline/shared-libraries/">Shared Libraries</a> общую логику можно вынести в отдельные библиотеки и использовать одно решение на разных проектах.</li></ul><p>В примере многоэтапного пайплайна определены этапы подготовки, параллельной сборки и тестирования, а также условного развертывания:</p><p>Завершается пайплайн блоком post-обработки, он выполняется независимо от результата основных этапов.</p><h2>Интеграция Jenkins с системами контроля версий</h2><p>Необходимо установить плагин «Git». Далее в настройках проекта появится поле, где можно указать URL репозитория. Также нужно выбрать ветку, которую Jenkins будет отслеживать для запуска сборок.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-09-13/0e141974-0590-4bb4-a8f4-5b38c75e9d88.jpg" alt="" /></figure><p>В Jenkins можно отслеживать нескольких веток одновременно, используя шаблоны. Например, всех коммитов, начинающихся с «feature». Также Jenkins позволяет настроить триггеры, которые будут запускать сборку при создании нового тега в репозитории.</p><p>Отслеживать изменения между сборками поможет плагин «Git Changes». Он показывает все изменения, которые были внесены в код с момента последней успешной сборки.</p><h2>Автоматизация тестирования и развертывания</h2><p>Начать можно с модульных тестов. Для проекта на <a href="https://plugins.jenkins.io/maven-plugin">Maven</a> Jenkinsfile мог бы содержать следующий этап:</p><p>Затем можно добавить интеграционные тесты, которые проверяют взаимодействие между различными частями системы. Для нагрузочных или UI-тестов можно <a href="https://stackoverflow.com/questions/49787577/how-to-integrate-jmeter-selenium-webdriver-to-jenkins">интегрировать JMeter и Selenium</a>.</p><p>После успешного прохождения всех тестов Jenkins может автоматически запустить процесс развертывания приложения. Например, для веб-проекта можно настроить автоматическую публикацию на сервер <a href="https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-with-jenkins/reverse-proxy-configuration-apache/">Apache</a> или <a href="https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-with-jenkins/reverse-proxy-configuration-nginx/">Nginx</a>.</p><h2>Оптимизация и управление Jenkins</h2><p>В настройках каждого пайплайна есть опция «<a href="https://plugins.jenkins.io/discard-old-build">Discard old builds</a>». Включите ее и укажите, сколько недель хранить данные — достаточно 2–3 недель. Если нужно хранить дольше, лучше сохранять логи отдельно, как файлы на другом диске.</p><p>Выберите размер памяти для Jenkins. В файле настроек Jenkins (обычно это jenkins.xml или jenkins.service) добавьте параметр -Xmx2g — это выделит 2 ГБ памяти, можно больше.</p><p>Включите логи для отслеживания памяти. Так вы сможете обнаружить причину проблемы, если Jenkins начнет тормозить. В настройках сервера найдите опцию «<a href="https://www.jenkins.io/blog/2016/11/21/gc-tuning/">Enable GC logging</a>» и включите её.</p><p>При написании скриптов для пайплайнов следуйте рекомендациям Jenkins. Они есть на официальном сайте в разделе «<a href="https://www.jenkins.io/doc/book/pipeline/pipeline-best-practices/">Pipeline Code → Best practices</a>».</p><p>Где возможно, переписывайте Groovy скрипты на Bash, чтобы код сразу выполнялся на нодах, не нагружая мастер-сервер.</p><p>Используйте плагин <a href="https://plugins.jenkins.io/role-strategy/">Role-based Authorization Strategy</a> для тонкой настройки прав доступа. Ограничьте доступ к мастер-ноде Jenkins, разрешая выполнение задач только на агентах.</p><h2>Практические кейсы и примеры использования Jenkins</h2><p>Сила Jenkins в его способности интегрироваться с другими инструментами DevOps. Например, с <a href="https://www.jenkins.io/doc/book/installing/docker/">Docker</a> для сборки и тестирования в изолированном окружении. А связка Jenkins и <a href="https://www.jenkins.io/doc/book/installing/kubernetes/">Kubernetes</a> открывает возможности для масштабирования и управления ресурсами.</p><p>Jenkins можно настроить на регулярную проверку обновлений используемых библиотек. При обнаружении новых версий, система автоматически проверит их совместимость с текущим кодом, и если все в порядке, создаст pull request с предложением обновления.</p><h2>Скрипты и примеры</h2><p>Рассмотрим пример простого Jenkinsfile для Java-проекта. Этот файл определяет pipeline, который включает этапы сборки, тестирования и развертывания приложения.</p><p>На этапе сборки выполняется команда ‘mvn clean package’, затем запускаются тесты с помощью ‘mvn test’. На этапе развертывания создается Docker-образ приложения и отправляется в репозиторий.</p><p>Преимущество работы с Jenkins в автоматизации рутинных задач скриптами. Например, можно создать bash-скрипт для автоматического обновления версии в файле package.json и создания соответствующего git-тега:</p><p><i>Рассказывайте в комментариях, в каких проектах вы использовали Jenkins.</i></p>]]></content:encoded>
    </item>
  </channel>
</rss>