.gitlab-ci.yml•7.35 kB
include: _common.yml
# Werf configuration
.werf: &werf
variables:
WERF_ENV: dev
WERF_KUBE_CONTEXT: main
before_script:
- curl -sSL https://werf.io/install.sh | bash -s -- --ci
- source $(~/bin/trdl use werf ${WERF_VERSION_GLOBAL:-$WERF_VERSION})
- source $(werf ci-env gitlab --as-file)
stages:
- prebuild
- unittest
- checkapproves
- converge
- converge-back
- e2etest
- integration-test
- cleanup
.base_converge: &base_converge
stage: converge
before_script:
- !reference [.werf, before_script]
script:
- echo "Checking for Helm dependencies in Chart.yaml"
- if grep -q "^dependencies:" .helm/Chart.yaml; then werf helm dependency update .helm; else echo "No dependencies found, skipping update"; fi
- werf converge
--releases-history-max=3
--values .helm/values.dev.yaml
--set imageCredentials.password="$CI_JOB_TOKEN"
needs:
- Prebuild
except:
refs:
- schedules
variables:
- $CI_PROJECT_NAME == "radius-mcp-server"
tags:
- werf
.new_converge: &new_converge
stage: converge-back
before_script:
- !reference [.werf, before_script]
script:
- echo "Checking for Helm dependencies in Chart.yaml"
- if grep -q "^dependencies:" .helm/Chart.yaml; then werf helm dependency update .helm; else echo "No dependencies found, skipping update"; fi
- werf converge
--releases-history-max=3
--values .helm/values.dev.yaml
--set imageCredentials.password="$CI_JOB_TOKEN"
needs:
- Prebuild
- UnitTestBack
tags:
- werf
.back_test: &back_test
stage: e2etest
script:
- kubectl get po -n testing | grep $CI_PROJECT_NAME | grep -o "^\S*" | sed '/$CI_PROJECT_NAME/d' | sed '/Terminating/d'
- PODNAME="$(kubectl get po -n testing | grep $CI_PROJECT_NAME | grep -o "^\S*" | sed '/$CI_PROJECT_NAME-migrate/d' | sed '/Terminating/d')"
- echo $PODNAME
- kubectl -n testing exec $PODNAME -- sh -c "npm run test"
needs:
- Prebuild
except:
- schedules
when: manual
tags:
- werf
Prebuild:
stage: prebuild
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/
- if: $CI_COMMIT_REF_NAME =~ /develop/
- if: $CI_COMMIT_REF_NAME =~ /testing/
- if: $CI_COMMIT_REF_NAME =~ /prod20/
before_script:
- !reference [.werf, before_script]
script:
- werf build --repo ${WERF_REPO} --add-custom-tag %image%-$CI_COMMIT_REF_SLUG-latest;
tags:
- werf
UnitTestBack:
stage: unittest
needs:
- Prebuild
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/
tags:
- docker
image: $CI_REGISTRY_IMAGE:app-$CI_COMMIT_REF_SLUG-latest
services:
- postgres:15.1-alpine
variables:
POSTGRES_PASSWORD: postgres
TEST_POSTGRES_HOST: postgres
TEST_POSTGRES_USER: postgres
TEST_POSTGRES_DB_NAME: postgres
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_HOST_AUTH_METHOD: trust
SECRET_KEY: cca85d8361cbb40bc0e155c52d355521
NODE_ENV: test
CI: "true"
before_script:
- npm ci
- |
# Проверка валидности ветки (совместимо с sh)
branch_valid=false
# Основные ветки
case "$CI_COMMIT_REF_NAME" in
develop|testing|prod20|main)
branch_valid=true
echo "Ветка валидна: $CI_COMMIT_REF_NAME (основная ветка)"
;;
task-*)
# Проверяем task-XXXX/type/ паттерн
if echo "$CI_COMMIT_REF_NAME" | grep -E "^task-[0-9]+/(feat|feature|fix|improvement)/" > /dev/null; then
branch_valid=true
echo "Ветка валидна: $CI_COMMIT_REF_NAME (формат task-XXXX/type/)"
fi
;;
feat/*|feature/*|fix/*|improvement/*)
# Проверяем type/task-XXXX паттерн
if echo "$CI_COMMIT_REF_NAME" | grep -E "/(task-[0-9]+)" > /dev/null; then
branch_valid=true
echo "Ветка валидна: $CI_COMMIT_REF_NAME (формат type/task-XXXX)"
fi
;;
fix/task-*)
# Проверяем fix/task-XXXX паттерн
if echo "$CI_COMMIT_REF_NAME" | grep -E "^fix/task-[0-9]+" > /dev/null; then
branch_valid=true
echo "Ветка валидна: $CI_COMMIT_REF_NAME (формат fix/task-XXXX)"
fi
;;
cherry-pick*)
branch_valid=true
echo "Ветка валидна: $CI_COMMIT_REF_NAME (cherry-pick)"
;;
esac
if [ "$branch_valid" = "false" ]; then
echo "Ошибка: Неверный формат ветки: $CI_COMMIT_REF_NAME"
echo "Допустимые шаблоны:"
echo "1. task-XXXXX/(feat|feature|fix|improvement)/описание"
echo "2. (feat|feature|fix|improvement)/task-XXXXX-описание"
echo "3. fix/task-XXXXX-описание"
echo "4. cherry-pick[или /любой-текст]"
echo "5. develop|testing|prod20|main"
exit 1
fi
script:
- |
if [ "$CI_PROJECT_NAME" = "radius-mcp-server" ]; then
echo "Запуск тестов для проекта: $CI_PROJECT_NAME"
echo "=== Линтинг ==="
npm run lint
echo "=== Проверка форматирования ==="
npm run format:check
echo "=== Сборка проекта ==="
npm run build
echo "=== Unit тесты ==="
npm run test:unit
echo "=== Smoke тесты ==="
npm run test:smoke
echo "=== Покрытие кода ==="
npm run test:coverage
echo "=== Проверка качества ==="
npm run quality:check
echo "=== Все тесты завершены успешно ==="
else
echo "Пропускаем тесты для проекта: $CI_PROJECT_NAME"
fi
Converge Dev Standart:
<<: *base_converge
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: dev
only:
- develop
Converge Dev AfterTest:
<<: *new_converge
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/ && $CI_COMMIT_REF_NAME =~ /develop/
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: dev
Converge Production:
<<: *base_converge
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: production
only:
- prod20
Converge Production AfterTest:
<<: *new_converge
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/ && $CI_COMMIT_REF_NAME =~ /prod20/
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: production
Converge Testing:
<<: *base_converge
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: testing
only:
- testing
Converge Staging AfterTest:
<<: *new_converge
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/ && $CI_COMMIT_REF_NAME =~ /testing/
variables:
WERF_KUBE_CONTEXT: "main"
environment:
name: testing
Back Tests:
<<: *back_test
only:
- testing
Integration Tests:
stage: integration-test
script:
- chmod +x ci-integration-test.sh
- ./ci-integration-test.sh -e $CI_COMMIT_REF_NAME
needs:
- Prebuild
rules:
- if: $CI_PROJECT_NAME =~ /radius-mcp-server/ && $CI_COMMIT_REF_NAME =~ /(develop|testing|prod20)/
tags:
- werf
Check MR Approves:
extends: .cimr
Cleanup:
extends: .cleanup