Перейти к содержанию

FAQ по CI/CD


Что нужно сделать, чтобы подключить репозиторий к сборке через CI/CD?

1. Создать .gitlab-ci.yml в корне репозитория

include:
  - project: 'generic/common-ci'
    file: '/common-security-scan.yaml'
  - project: 'generic/common-ci'
    file: '/universal-pipeline.yaml'
    ref: apps-business

variables:
  SERVICE_NAME: your-service
  DOCKERFILE_PATH: ./Dockerfile
  BUILD_ARGS: ""
  CI_TRIGGER_SOURCE: app

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

    - if: '$CI_COMMIT_BRANCH == "stage"'
      variables:
        STAND: stage
        NAMESPACE: your-service-stage
        RELEASE_NAME: ${SERVICE_NAME}
        CHART_NAME: ${SERVICE_NAME}
        CHART_VERSION: "0.0.1-stage"
        HELM_SET_ARGS: >-
          --set universal-chart.services.main.image.name.stage=${IMAGE_NAME}
          --set universal-chart.global.env=stage
    - when: never

2. Создать .helm/ директорию

.helm/Chart.yaml:

apiVersion: v2
name: your-service
version: 1.0.0
dependencies:
  - name: universal-chart
    repository: oci://cr.yandex/crp3ccidau046kdj8g9q/charts
    version: 0.1.7

.helm/values.yaml — см. примеры ниже.

3. Обновить зависимости

echo $HELM_REGISTRY_KEY | base64 -d | helm registry login cr.yandex --username json_key --password-stdin
helm dependency update .helm

Пример values.yaml для backend

universal-chart:
  global:
    env: stage

  services:
    main:
      enabled: true

      deployment:
        enabled: true
        name:
          _default: your-backend
        replicaCount:
          _default: 1
          production: 3
        port:
          _default: 8000
        resources:
          requests:
            memory:
              _default: "512Mi"
            cpu:
              _default: "250m"

      image:
        name:
          _default: cr.yandex/crp3ccidau046kdj8g9q/your-backend
        pullPolicy:
          _default: IfNotPresent

      service:
        enabled: true
        type:
          _default: ClusterIP
        port:
          _default: 8080
        targetPort:
          _default: 8000

      imagePullSecrets:
        enabled:
          _default: false
        name:
          _default: dockerhub

      envs:
        - name: DEBUG
          value:
            _default: "false"
            stage: "true"

      secretEnvs:
        - name: DB_PASSWORD
          secretName:
            _default: ya-pg-secret
          secretKey: password

      volumes:
        _default: []

      commitSha: ""
      gitlabUri: ""
      gitlabJobUrl: ""
      owner: "your-team"

  ingress:
    enabled: false

Пример values.yaml для frontend

universal-chart:
  global:
    env: stage

  services:
    frontend:
      enabled: true

      deployment:
        enabled: true
        name:
          _default: your-frontend
        replicaCount:
          _default: 1
        port:
          _default: 80
        resources:
          requests:
            memory:
              _default: "128Mi"
            cpu:
              _default: "100m"
        probes:
          liveness:
            enabled:
              _default: true
            type:
              _default: httpGet
            httpGet:
              path:
                _default: /
              port:
                _default: 80

      image:
        name:
          _default: cr.yandex/crp3ccidau046kdj8g9q/your-frontend
        pullPolicy:
          _default: IfNotPresent

      service:
        enabled: true
        port:
          _default: 80
        targetPort:
          _default: 80

      imagePullSecrets:
        enabled:
          _default: false
        name:
          _default: dockerhub

      envs: []

      volumes:
        _default: []

      commitSha: ""
      gitlabUri: ""
      gitlabJobUrl: ""
      owner: "your-team"

Несколько сервисов в одном репозитории

Например, backend + celery worker:

universal-chart:
  global:
    env: stage

  services:
    api:
      enabled: true
      deployment:
        enabled: true
        name:
          _default: backend
        port:
          _default: 8000
      image:
        name:
          _default: cr.yandex/.../backend
      service:
        enabled: true
        port:
          _default: 8080
        targetPort:
          _default: 8000

    celery:
      enabled: true
      deployment:
        enabled: true
        name:
          _default: celery
        command:
          _default:
            - celery
            - -A
            - config
            - worker
            - -B
            - -l
            - info
      image:
        name:
          _default: cr.yandex/.../backend
      service:
        enabled: false

В HELM_SET_ARGS передаём образ для обоих сервисов:

HELM_SET_ARGS: >-
  --set universal-chart.services.api.image.name.stage=${IMAGE_NAME}
  --set universal-chart.services.celery.image.name.stage=${IMAGE_NAME}
  --set universal-chart.global.env=stage

Как работает параметризация значений по окружениям

Универсальный чарт имеет возможность выбирать значения параметров на основе указанного окружения:

replicaCount:
  _default: 1      # используется если env не найден
  stage: 2         # используется для stage
  preprod: 2       # используется для preprod
  production: 5    # используется для production

Окружение устанавливается через global.env или --set universal-chart.global.env=stage.


envs, secretEnvs, volumes

envs — простые переменные окружения

envs:
  - name: DEBUG
    value:
      _default: "false"
      stage: "true"
  - name: API_HOST
    value:
      _default: "http://api.svc.cluster.local"

secretEnvs — ссылки на внешние секреты

secretEnvs:
  - name: DB_PASSWORD
    secretName:
      _default: ya-pg-secret
    secretKey: password
  - name: API_KEY
    secretName:
      _default: api-secret
      production: api-secret-prod
    secretKey: key

Важно: секреты создаются внешними средствами (Vault/Terraform), чарт только ссылается.

volumes — монтирование ConfigMap/Secret

volumes:
  _default:
    - name: config
      mountPath:
        _default: /etc/app
      readOnly:
        _default: true
      configMap:
        name:
          _default: app-config
        items:
          - key: config.yaml
            path:
              _default: config.yaml
    - name: certs
      mountPath:
        _default: /etc/ssl/certs
      secret:
        secretName:
          _default: tls-secret

Автоматическое определение окружения

Ветка/тег Окружение
stage stage
master preprod
vX.Y.Z production

Метаданные деплоя

Для трассировки деплоев передаются аннотации:

HELM_SET_ARGS: >-
  --set universal-chart.services.main.commitSha=${CI_COMMIT_SHA}
  --set universal-chart.services.main.gitlabUri=${CI_PROJECT_URL}
  --set universal-chart.services.main.gitlabJobUrl=${CI_JOB_URL}
  --set universal-chart.services.main.owner=${CI_PROJECT_NAMESPACE}

Эти значения попадают в аннотации Deployment.


Ingress / VirtualService

  • Виртуальные сервисы (Istio VirtualService) создаются отдельно по заявке
  • Шаблон заявки — в kb/vault/istio