Рубрики
Uncategorized

Бесшовные CI / CD с Jenkins + Helm и Kubernetes

Есть много способов и платформ, которые вы можете использовать для решения CI / CD для вашей компании. Как мы были … Tagged с Кубернетами, дежопами.

Есть много способов и платформ, которые вы можете использовать для решения CI / CD Для вашей компании в наши дни. Как мы уже использовали Jenkins Jobs для развертываний, и все в команде знали это Ну, это был очевидный выбор, но мы перешли к трубопроводам.

Для реализации этого вам нужно:

  • А Кубернаны кластер, где вы собираетесь развернуть ваши приложения
  • Хелм файлы развертывания для вашего приложения
  • Дженкинс Трубопроводы CI

Дженкинс принесет филиалы и теги от выбранного репозитория и выполняют все шаги, определенные для трубопровода внутри вашего проекта Jenkinsfile Отказ

Kubernetes — это инструмент Orchestration для контейнеров, поэтому мы должны быть развертывающими приложения в качестве контейнеров Docker, чтобы они могли работать и управлять внутри этого инструмента оркестрации.

Хелм — «диспетчер пакетов» для Куберанес. Он читает, анализируют и вводит значения в серию «шаблонов HELM», которые в результатах в серии объектов Кубератеса. Затем Helm связывают все эти объекты в релиз руля и устанавливают его в настроенные кластере Kubernetes. Вы можете поставить для Helm некоторые входные значения для настройки каждой установки, которая достаточно гибкой, чтобы установить, например, то же приложение, настроенное по-разному для нескольких сред (E.G dev, постановка и производство).

Вот пример нашего декларативного файла трубопровода Дженкинса:

pipeline {
    agent {
        kubernetes {
            label 'my-app'
            yamlFile 'JenkinsKubernetesPod.yaml'
        }
    }
    stages {
        stage('Run unit tests') {
            steps {
              // The needed steps for your testing
            }
        }

        stage('Build application') {
            steps {
              // Build the app
            }
        }

        stage('Docker publish') {
            steps {
              // Publish a docker image for your application 
            }
        }

        stage('Deployment') {
            steps {
                script {
                  container('helm') {
                      // Init authentication and config for your kubernetes cluster
                      sh("helm init --client-only --skip-refresh")
                      sh("helm upgrade --install --wait prod-my-app ./helm --namespace prod")
                    }
                }
            }
        }
    }
}

Вы должны включить файл с именем «jenkinsfile» в вашем репозитории проекта, и Jenkins будет использовать его для определения трубопровода. Для краткости я только включал шаг развертывания. На этом этапе вы будете называть монтаж или обновление руля. Это будет применять Helm Обновление Вашему ранее установленным выпуске HELM или, если релиз не существует, Helm будет выполнять helm установить с данным именем выпуска (например, приложение E.g. prod-my-app).

Хорошей идеей, чтобы включить пространство имен в качестве префикса или суффикса для названия выпуска HELM, потому что имена выпуска являются только именем для Helm и не устанавливаются как часть пространства имен Kubernetes.

Если вы попытаетесь установить Выпуск-манекен на пространство имен dev и а Выпуск-манекен на пространство имен Постановка это не удастся, потому что Выпуск-манекен Уже существует, и Helm не заботится о пространстве имен. Чтобы решить это, мы включаем префикс пространства имен на имя выпуска.

Убедитесь, что вы настроили свое приложение для запуска как Kubernetes развертывание или Сосредоточенное положение или избегайте простоя между развертываниями. Проверьте Развертывание.ямль Хелм шаблон ниже:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-dp
spec:
  replicas: 2
  minReadySeconds: 60
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: {{ .Values.app.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
    spec:
      containers:
      - name: {{ .Values.app.name }}
        image: {{ .Values.app.image.repository }}/{{ .Values.app.image.name }}:{{ .Values.app.image.tag }}
        imagePullPolicy: Always
        envFrom:
        - configMapRef:
            name: config-{{ .Values.app.name }}
        ports:
        - name: http-{{ .Values.app.name }}
          protocol: TCP
          containerPort: 80

И вот и это, есть много концепций, чтобы научиться ставить все это вместе, но когда у вас все это приятно, вам никогда не придется прилагать большие усилия в развертывание новых приложений и управление выпусками.

Когда вы закончите, вы нажимаете коммиты в Master или создаете новый тег, и код появится на ваших серверах без большего количества щелчка.

Оригинал: «https://dev.to/sword-health/seamless-ci-cd-with-jenkins-helm-and-kubernetes-5e00»