Расскажите о вашем опыте работы с Jenkins

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

Ответ

Я использовал Jenkins в качестве CI/CD-сервера на нескольких проектах, в основном для сборки Java-приложений и деплоя в Kubernetes.

Мой опыт включает:

  • Разработка и поддержка пайплайнов: Писал как Declarative, так и Scripted Pipeline на Groovy. Старался делать их идемпотентными и модульными, вынося повторяющуюся логику в Shared Libraries.
  • Интеграция с экосистемой: Настраивал интеграцию с GitHub/GitLab через webhooks, запуск сборок по пулл-реквестам, отправку уведомлений в Slack. Использовал плагины для работы с Docker (docker.build, docker.withRegistry), Kubernetes (kubernetes), и для деплоя (Ansible, SSH).
  • Оптимизация и управление: Настраивал распределенную модель с динамическими агентами в Kubernetes (используя plugin kubernetes), что позволяло масштабировать вычислительные мощности под нагрузку. Внедрял кеширование зависимостей (Maven, npm) для ускорения сборок.
  • Безопасность и best practices: Работал с Credentials Plugin для безопасного хранения секретов, настраивал RBAC для управления доступом команд к их джобам.

Пример Declarative Pipeline для сборки Java-приложения и деплоя в K8s:

pipeline {
    agent {
        kubernetes {
            yaml '''
            apiVersion: v1
            kind: Pod
            spec:
              containers:
              - name: jdk
                image: maven:3.8-openjdk-17
                command: ["cat"]
                tty: true
            '''
        }
    }
    environment {
        DOCKER_REGISTRY = 'registry.example.com'
        KUBE_CONFIG = credentials('k8s-cluster-config')
    }
    stages {
        stage('Build & Test') {
            steps {
                container('jdk') {
                    sh 'mvn clean package'
                }
            }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    docker.build("${DOCKER_REGISTRY}/myapp:${env.BUILD_NUMBER}")
                }
            }
        }
        stage('Deploy to Staging') {
            steps {
                sh '''
                kubectl --kubeconfig=$KUBE_CONFIG set image deployment/myapp myapp=${DOCKER_REGISTRY}/myapp:${env.BUILD_NUMBER} -n staging
                kubectl --kubeconfig=$KUBE_CONFIG rollout status deployment/myapp -n staging
                '''
            }
        }
    }
}