Какие шаги ты делал при настройке и использовании Jenkins?

«Какие шаги ты делал при настройке и использовании Jenkins?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой опыт с Jenkins охватывает его развёртывание, настройку и интеграцию в DevOps-процессы.

1. Развёртывание и базовая настройка:

  • Устанавливал Jenkins чаще всего в Kubernetes через официальный Helm-чарт для высокой доступности и лёгкого масштабирования. Для простых случаев — в Docker-контейнере.
  • Первым делом настраивал безопасность: включал авторизацию (интегрировал с корпоративным LDAP/AD или GitHub OAuth) и настраивал матрицу прав через Role-Based Authorization Strategy.

2. Конфигурация как код (Configuration as Code):

  • Внедрял Jenkins Configuration as Code (JCasC). Все глобальные настройки, инструменты (JDK, Maven, Docker), плагины и облака агентов описывались в YAML-файле, который применялся при старте. Это делало конфигурацию воспроизводимой и версионируемой.

3. Построение пайплайнов:

  • Переводил проекты с Freestyle jobs на Pipeline-as-Code с Jenkinsfile. Использовал Declarative Pipeline за его чёткую структуру. Пример многостадийного пайплайна для Java-приложения:
    pipeline {
        agent { label 'docker' }
        tools { maven 'Maven-3.8' }
        stages {
            stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/...' } }
            stage('Build & Test') {
                steps {
                    sh 'mvn clean compile'
                    sh 'mvn test'
                }
                post { always { junit 'target/surefire-reports/*.xml' } }
            }
            stage('Build Docker Image') {
                steps {
                    script {
                        docker.build("my-app:${env.BUILD_NUMBER}")
                    }
                }
            }
            stage('Deploy to Staging') {
                steps { sh 'kubectl apply -f k8s/manifests-staging.yaml' }
            }
        }
    }

4. Управление агентами (воркерами):

  • Настраивал динамические агенты в Kubernetes через плагин kubernetes. Для каждой сборки создавался временный pod с нужным набором инструментов (образ из Dockerfile), что обеспечивало чистоту окружения и эффективное использование ресурсов кластера.

5. Интеграция и расширение:

  • Интегрировал с SonarQube для статического анализа кода, с Trivy для сканирования образов на уязвимости.
  • Настраивал webhook-интеграцию с GitLab/GitHub для автоматического запуска сборок при пуше в определённые ветки.
  • Реализовывал продвижение артефактов между средами (stage, prod) с подтверждением (approval step) и отправкой уведомлений в Slack.

6. Надёжность и мониторинг:

  • Настраивал резервное копирование конфигурации через плагин ThinBackup.
  • Подключал экспортер метрик Jenkins к Prometheus и визуализировал ключевые показатели (время сборок, очередь, статусы) в Grafana.