Jenkins: обзор для собеса

↑ Этап 3 · CI-CD

Обязательно~6 мин чтенияУровень: middle

Зачем это на собесе

Jenkins всё ещё встречается в enterprise; достаточно уверенно ориентироваться: Pipeline, агенты, плагины, минусы.

Что такое Jenkins

Open-source сервер автоматизации на Java: «мастер» (controller) оркестрирует, агенты (nodes) выполняют. Огромная экосистема плагинов (~1800+). Самостоятельно хостится: вы отвечаете за обновления, бэкапы, безопасность, масштабирование.

Jenkinsfile (Declarative Pipeline)

pipeline {
  agent { docker { image 'mcr.microsoft.com/dotnet/sdk:9.0' } }
  options { timeout(time: 30, unit: 'MINUTES'); disableConcurrentBuilds(); buildDiscarder(logRotator(numToKeepStr: '20')) }
  environment { REGISTRY = 'registry.example.com'; IMAGE = "${REGISTRY}/clinic/api" }
  parameters { choice(name: 'ENV', choices: ['staging', 'prod'], description: 'Окружение') }
 
  stages {
    stage('Build') { steps { sh 'dotnet build -c Release' } }
    stage('Test') {
      steps { sh 'dotnet test --logger trx' }
      post { always { junit '**/*.trx' } }
    }
    stage('Image') {
      when { branch 'main' }
      steps {
        withCredentials([usernamePassword(credentialsId: 'registry', usernameVariable: 'U', passwordVariable: 'P')]) {
          sh '''
            echo "$P" | docker login -u "$U" --password-stdin $REGISTRY
            docker build -t $IMAGE:$GIT_COMMIT .
            docker push $IMAGE:$GIT_COMMIT
          '''
        }
      }
    }
    stage('Deploy') {
      when { branch 'main' }
      input { message 'Выкатить в prod?'; ok 'Да'; submitter 'release-managers' }
      steps { sh "./deploy.sh ${params.ENV} ${GIT_COMMIT}" }
    }
  }
  post {
    failure { slackSend channel: '#ci', message: "Сборка упала: ${env.BUILD_URL}" }
    cleanup { cleanWs() }
  }
}

Scripted Pipeline — Groovy с node { ... }, гибкость без структуры; Declarative рекомендуется.

Основные понятия

ПонятиеОписание
ControllerUI, планирование, хранение конфигурации (JENKINS_HOME)
Agent / nodeисполнитель: постоянный или эфемерный (Docker, Kubernetes plugin)
Pipeline, Stage, Stepконвейер, стадии, шаги
Multibranch Pipelineавтоматически создаёт пайплайн на каждую ветку/PR по Jenkinsfile
Shared Libraryобщий код пайплайнов в отдельном репозитории (@Library('ci-lib') _)
Credentialsхранилище секретов (пароли, токены, SSH-ключи, сертификаты), маскирование в логах
PluginsGit, Pipeline, Docker, Kubernetes, Blue Ocean, SonarQube, Credentials, Role Strategy
TriggersSCM poll, webhook, cron (cron('H 2 * * *')), upstream
Jenkins Configuration as Code (JCasC)конфигурация Jenkins в YAML

Агенты в Kubernetes:

agent { kubernetes { yaml '''
  apiVersion: v1
  kind: Pod
  spec:
    containers:
    - name: dotnet
      image: mcr.microsoft.com/dotnet/sdk:9.0
      command: [sleep]
      args: [infinity]
''' } }

Плюсы и минусы

ПлюсыМинусы
гибкость, плагины на всё«ад плагинов»: совместимость, уязвимости, поддержка
зрелость, большое сообществоустаревший UI, Groovy, отладка пайплайнов
on-premise, полный контрольадминистрирование: обновления, бэкапы, масштабирование
Shared Librariesконфигурация в UI (дрейф) без JCasC; разные подходы в разных командах
любые ОС/агентыбезопасность: много исторических уязвимостей

Практики

  • Pipeline as Code (Jenkinsfile в репозитории), JCasC + плагины зафиксированы (plugins.txt), Jenkins в контейнере/на Kubernetes;
  • эфемерные агенты, а не долгоживущие (чистота, безопасность);
  • не запускать сборки на controller (executors = 0);
  • Credentials и Vault, доступ по ролям (Role Strategy/Matrix), SSO (OIDC/LDAP);
  • обновление LTS-версий, резервные копии JENKINS_HOME;
  • Shared Library для стандартных шагов;
  • timeout, retry, cleanWs, ротация старых сборок;
  • мониторинг (Prometheus plugin).

Jenkins и GitLab CI/GitHub Actions

Jenkins — если уже много legacy-пайплайнов, нужна строгая on-prem-инфраструктура, сложные оркестрации. Для новых проектов чаще выбирают встроенный CI платформы: меньше обслуживания, интеграция с MR/PR.

Что сказать на собесе

  • «Использовал для сборки и деплоя: Multibranch, Declarative Pipeline, Shared Library; агенты — Docker/K8s; секреты — Credentials/Vault»;
  • «Сейчас предпочитаю GitLab CI: конфигурация рядом с кодом, нет отдельного сервера»;
  • знание проблем: плагины, Groovy sandbox, безопасность скриптов.

Вопросы с ответами