Jenkins (Инструмент CI/CD с открытым исходным кодом)

⌘K

Jenkins (Инструмент CI/CD с открытым исходным кодом)

Jenkins — это open-source платформа для автоматизации процессов непрерывной интеграции и доставки (CI/CD). Она построена на Java и предлагает гибкую, расширяемую архитектуру для сборки, тестирования и деплоймента приложений в любых средах. Jenkins поддерживает pipeline-as-code, масштабирование через агенты и интеграцию с сотнями внешних систем — от Git и Docker до Kubernetes и Slack.


Возможности Jenkins

  • Pipeline-as-Code: декларативное или скриптовое описание пайплайна через Jenkinsfile;
  • Интеграции: поддержка SCM (Git, GitHub, GitLab, Bitbucket), облаков (AWS, GCP, Azure), контейнеризации (Docker, Kubernetes) и нотификаций (Slack, Email, Mattermost);
  • Автоматизация любых этапов: unit-тесты, сборка артефактов, статический анализ, деплой;
  • Поддержка плагинов: более 1800 плагинов для любой задачи — от уведомлений до Helm/CDK/Terraform;
  • Параллельные и распределённые сборки: через master-agent архитектуру;
  • Управление конфигурацией: через UI, REST API, Groovy-скрипты или Jenkins Configuration as Code (JCasC).

Пример Jenkinsfile (декларативный pipeline)

pipeline {
  agent any

  environment {
    IMAGE_TAG = "${env.BUILD_NUMBER}"
  }

  stages {
    stage('Checkout') {
      steps {
        git 'https://github.com/my-org/my-app.git'
      }
    }

    stage('Test') {
      steps {
        sh 'npm ci && npm test'
      }
    }

    stage('Build Docker Image') {
      steps {
        sh "docker build -t my-app:${IMAGE_TAG} ."
      }
    }

    stage('Push to Registry') {
      steps {
        withCredentials([usernamePassword(credentialsId: 'docker-creds', passwordVariable: 'PASS', usernameVariable: 'USER')]) {
          sh "echo $PASS | docker login -u $USER --password-stdin"
          sh "docker push my-app:${IMAGE_TAG}"
        }
      }
    }
  }
}

📌 Этот пайплайн делает: git checkout → тесты → сборка Docker-образа → пуш в реестр.


Где запускается Jenkins

  • На физических и виртуальных серверах (Linux, Windows, macOS);
  • В Kubernetes — через Jenkins Operator или Helm-чарт;
  • В облаках — AWS EC2, GCP VM, Azure VM, или через Jenkins X;
  • На CI-агентах с Docker-in-Docker — для полной изоляции задач.

Почему Jenkins до сих пор актуален

  • Максимальная гибкость — подходит для нестандартных пайплайнов и нестандартных проектов;
  • Широкая экосистема плагинов — от статических анализаторов до deployment-менеджеров;
  • Развёртывание в изолированной среде — без зависимости от SaaS;
  • Поддержка GitOps, Multi-branch pipelines, triggers по Webhook, cron и т.п.

Jenkins — это проверенный временем инструмент, ставший де-факто стандартом в DevOps-инфраструктуре. Особенно популярен там, где важна кастомизация, контроль и независимость от внешних CI/CD-платформ.


Реализация Jenkins-пайплайна с деплоем в Kubernetes через Helm, плюс пример конфигурации Jenkins через код (JCasC) и настройка агентов в Kubernetes.

Jenkinsfile с Helm-деплоем в Kubernetes

pipeline {
  agent any

  environment {
    CHART_DIR = 'helm/my-app'
    IMAGE_TAG = "${env.BUILD_NUMBER}"
    RELEASE_NAME = "my-app-prod"
    KUBE_CONTEXT = "kubernetes-context"
  }

  stages {
    stage('Checkout') {
      steps {
        git 'https://github.com/my-org/my-app.git'
      }
    }

    stage('Build and Push Docker') {
      steps {
        sh """
          docker build -t ghcr.io/my-org/my-app:${IMAGE_TAG} .
          echo "${DOCKER_TOKEN}" | docker login ghcr.io -u "${DOCKER_USER}" --password-stdin
          docker push ghcr.io/my-org/my-app:${IMAGE_TAG}
        """
      }
    }

    stage('Helm Deploy to Kubernetes') {
      steps {
        withKubeConfig([credentialsId: 'kubeconfig-credentials']) {
          sh """
            helm upgrade --install ${RELEASE_NAME} ${CHART_DIR} \
              --namespace production \
              --set image.repository=ghcr.io/my-org/my-app \
              --set image.tag=${IMAGE_TAG}
          """
        }
      }
    }
  }
}

📌 Этот пайплайн клонирует код, билдит образ, пушит его и разворачивает приложение через Helm в Kubernetes.


Пример JCasC (jenkins.yaml)

jenkins:
  systemMessage: "Jenkins — CI/CD via as-code"
  numExecutors: 2
  mode: NORMAL

  securityRealm:
    local:
      allowsSignup: false
      users:
        - id: admin
          password: admin123

  authorizationStrategy:
    loggedInUsersCanDoAnything:
      allowAnonymousRead: false

  tools:
    jdk:
      installations:
        - name: "OpenJDK"
          home: "/usr/lib/jvm/java-11-openjdk"

  nodes:
    - name: "k8s-agent"
      remoteFS: "/home/jenkins"
      launcher:
        kubernetes:
          yaml: |
            apiVersion: v1
            kind: Pod
            metadata:
              labels:
                jenkins: agent
            spec:
              containers:
                - name: jnlp
                  image: jenkins/inbound-agent
                  args: ["\$(JENKINS_SECRET)", "\$(JENKINS_NAME)"]

📌 Этот файл разворачивает Jenkins с пользователем, executor’ами и агентом в Kubernetes через podTemplate.