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

Параметризация и использование шаблона CI/CD


Передача параметров в пайплайн

Все параметры, которые влияют на сборку и деплой, задаются в .gitlab-ci.yml в блоках workflow.rules.

Для каждой ветки/тега указываются свои значения переменных.

Пример для stage:

workflow:
  rules:
    - if: '$CI_COMMIT_BRANCH == "stage"'
      variables:
        STAND: stage
        NAMESPACE: bi-stage
        RELEASE_NAME: ${SERVICE_NAME}
        CHART_NAME: ${SERVICE_NAME}
        CHART_VERSION: "0.0.1-stage"
        K8S_HUSTLER_BRANCH: universal-chart-stage
        HELM_SET_ARGS: >-
          --set universal-chart.services.main.image.name.stage=${IMAGE_NAME}
          --set universal-chart.global.env=stage
          --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}

Когда GitLab запускает пайплайн для ветки stage, он автоматически подставляет эти переменные.


BUILD_ARGS — аргументы сборки Docker

В сборку образа аргументы попадают через BUILD_ARGS:

docker build -f ${DOCKERFILE_PATH} ${BUILD_ARGS} -t ${IMAGE_NAME} .

Пример:

variables:
  BUILD_ARGS: "--build-arg CI_COMMIT_SHORT_SHA=${CI_COMMIT_SHORT_SHA}"

Для фронтенда часто добавляют:

BUILD_ARGS: "--build-arg ENDPOINT=stage --build-arg NPM_NEXUS_TOKEN=${NPM_NEXUS_TOKEN}"

Формирование IMAGE_NAME

Имя образа формируется автоматически:

IMAGE_NAME = ${CR}/${RELEASE_NAME}:${STAND}_${CI_COMMIT_SHORT_SHA}

Пример: cr.yandex/bi-backend:stage_abc123def


HELM_SET_ARGS — параметры деплоя

HELM_SET_ARGS содержит --set аргументы для helm:

HELM_SET_ARGS: >-
  --set universal-chart.services.main.image.name.stage=${IMAGE_NAME}
  --set universal-chart.global.env=stage
  --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}

Важно: путь к образу теперь universal-chart.services.<service-name>.image.name.<env>.


Раскатка с ветки в нужный namespace

Всё работает автоматически по имени ветки или тегу:

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

GitLab подставит правильные переменные из workflow.rules:

  • STAND — определяет окружение
  • NAMESPACE — куда деплоим
  • RELEASE_NAME — имя релиза Helm
  • CHART_VERSION — версия chart
  • HELM_SET_ARGS — аргументы для helm

Основные переменные

Переменная Описание
CR Container registry (cr.yandex/crp3ccidau046kdj8g9q)
HELM_REGISTRY OCI registry для чартов
SAREX_REGISTRY_KEY JSON-ключ для docker login (группа)
HELM_REGISTRY_KEY JSON-ключ для helm registry (группа)
SERVICE_NAME Имя сервиса
RELEASE_NAME Имя Helm-релиза
STAND stage / preprod / production
NAMESPACE Целевой namespace
CHART_VERSION Версия чарта
CHART_NAME Имя чарта
K8S_HUSTLER_BRANCH Ветка k8s-hustler
DOCKERFILE_PATH Путь к Dockerfile
BUILD_ARGS Аргументы для docker build
HELM_SET_ARGS Аргументы для helm upgrade
CI_TRIGGER_SOURCE Источник триггера (app / infra)

Feature flags

Переменная По умолчанию Описание
ENABLE_BUILD_IMAGE "true" Сборка Docker-образа
ENABLE_BUILD_CHART "true" Сборка Helm-чарта
ENABLE_DEPLOY "true" Включение деплоя
ENABLE_STATE_UPDATE "false" Обновление values в k8s-hustler