Files
call-center/.gitlab-ci.yml
T

155 lines
4.7 KiB
YAML

stages:
- test
- build
- deploy
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
APP_IMAGE_REPOSITORY: "$CI_REGISTRY_IMAGE/app"
ASTERISK_IMAGE_REPOSITORY: "$CI_REGISTRY_IMAGE/asterisk"
APP_IMAGE_TAG: "$CI_COMMIT_SHA"
ASTERISK_IMAGE_TAG: "$CI_COMMIT_SHA"
APP_IMAGE: "$CI_REGISTRY_IMAGE/app:$CI_COMMIT_SHA"
ASTERISK_IMAGE: "$CI_REGISTRY_IMAGE/asterisk:$CI_COMMIT_SHA"
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_HOST: "tcp://docker:2376"
DOCKER_TLS_VERIFY: "1"
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
default:
cache:
paths:
- .cache/pip
.python_job:
image: python:3.11-slim
before_script:
- python -m pip install --upgrade pip
- pip install -r requirements.txt
test:
extends: .python_job
stage: test
script:
- pytest -q
postgres-readiness:
extends: .python_job
stage: test
services:
- name: postgres:16-alpine
alias: postgres
- name: rabbitmq:3-management
alias: rabbitmq
variables:
POSTGRES_DB: mvpcc
POSTGRES_USER: mvp
POSTGRES_PASSWORD: mvp
DATABASE_URL: postgresql://mvp:mvp@postgres:5432/mvpcc
SCHEMA_MANAGEMENT_MODE: migrations
CC_DATA_DIR: .testdata_pg
EVENT_BUS_ENABLED: "0"
EVENT_BUS_URL: amqp://guest:guest@rabbitmq:5672/
APP_TOKEN_SECRET: ci-secret
ALLOW_LEGACY_HEADER_AUTH: "1"
TELEGRAM_BOT_ENABLED: "0"
WHATSAPP_OUTBOUND_ENABLED: "0"
AI_PROVIDER: stub
AI_TELEGRAM_ENABLED: "0"
AI_WHATSAPP_ENABLED: "0"
AI_VOICE_ENABLED: "0"
script:
- python scripts/migrate_core_db.py
- pytest -q tests/test_postgres_readiness.py
.docker_build:
image: docker:27
services:
- name: docker:27-dind
alias: docker
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" --password-stdin
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- if: '$CI_COMMIT_TAG'
build-app-image:
extends: .docker_build
stage: build
needs:
- test
- postgres-readiness
script:
- docker build -t "$APP_IMAGE" .
- docker push "$APP_IMAGE"
- |
if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
docker tag "$APP_IMAGE" "$APP_IMAGE_REPOSITORY:latest"
docker push "$APP_IMAGE_REPOSITORY:latest"
fi
- |
if [ -n "$CI_COMMIT_TAG" ]; then
docker tag "$APP_IMAGE" "$APP_IMAGE_REPOSITORY:$CI_COMMIT_TAG"
docker push "$APP_IMAGE_REPOSITORY:$CI_COMMIT_TAG"
fi
build-asterisk-image:
extends: .docker_build
stage: build
needs:
- test
- postgres-readiness
script:
- docker build -f deployment/asterisk/Dockerfile -t "$ASTERISK_IMAGE" .
- docker push "$ASTERISK_IMAGE"
- |
if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
docker tag "$ASTERISK_IMAGE" "$ASTERISK_IMAGE_REPOSITORY:latest"
docker push "$ASTERISK_IMAGE_REPOSITORY:latest"
fi
- |
if [ -n "$CI_COMMIT_TAG" ]; then
docker tag "$ASTERISK_IMAGE" "$ASTERISK_IMAGE_REPOSITORY:$CI_COMMIT_TAG"
docker push "$ASTERISK_IMAGE_REPOSITORY:$CI_COMMIT_TAG"
fi
deploy-production:
stage: deploy
image: alpine:3.21
needs:
- build-app-image
- build-asterisk-image
environment:
name: production
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- printf '%s\n' "$DEPLOY_SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
- ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
script:
- test -n "$DEPLOY_HOST"
- test -n "$DEPLOY_USER"
- test -n "$DEPLOY_PATH"
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p '$DEPLOY_PATH/deployment'"
- rsync -av deployment/ "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/deployment/"
- |
ssh "$DEPLOY_USER@$DEPLOY_HOST" \
"mkdir -p '$DEPLOY_PATH/.data_local/generated_ivr_yandex/ivr' '$DEPLOY_PATH/.data_local/recordings' '$DEPLOY_PATH/.asterisk_assets'"
- |
ssh "$DEPLOY_USER@$DEPLOY_HOST" \
"printf 'APP_IMAGE=%s\nASTERISK_IMAGE=%s\n' '$APP_IMAGE' '$ASTERISK_IMAGE' > '$DEPLOY_PATH/deployment/.env.images'"
- |
ssh "$DEPLOY_USER@$DEPLOY_HOST" \
"echo '$CI_REGISTRY_PASSWORD' | docker login '$CI_REGISTRY' -u '$CI_REGISTRY_USER' --password-stdin && \
cd '$DEPLOY_PATH/deployment' && \
docker compose --env-file .env.images -f docker-compose.server.registry.yml pull && \
docker compose --env-file .env.images -f docker-compose.server.registry.yml up -d && \
docker compose --env-file .env.images -f docker-compose.asterisk.server.registry.yml pull && \
docker compose --env-file .env.images -f docker-compose.asterisk.server.registry.yml up -d"
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: manual
allow_failure: false