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