From 38a299e5b999aa15746608ebd65241bfc58bcf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=A1=D0=B0?= =?UTF-8?q?=D0=B1=D0=B8=D0=BB=D0=B8=D0=BD?= Date: Fri, 5 Jun 2026 20:54:33 +0300 Subject: [PATCH] =?UTF-8?q?CI/CD=20=D0=BF=D0=B0=D0=B9=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=B9=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build-and-test.yml | 55 ++++++++++++++++++++ .gitea/workflows/deploy-stage.yml | 47 +++++++++++++++++ docker/.env.stage | 12 +++++ docker/ApiTests.Dockerfile | 12 +---- docker/docker-compose.stage.yml | 81 +++++++++++++++++++++++++++++ 5 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 .gitea/workflows/build-and-test.yml create mode 100644 .gitea/workflows/deploy-stage.yml create mode 100644 docker/.env.stage create mode 100644 docker/docker-compose.stage.yml diff --git a/.gitea/workflows/build-and-test.yml b/.gitea/workflows/build-and-test.yml new file mode 100644 index 0000000..2eecbb7 --- /dev/null +++ b/.gitea/workflows/build-and-test.yml @@ -0,0 +1,55 @@ +name: Test & Deploy to Snapdeploy +on: + push: + branches: [ master ] + +jobs: + build-test-deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # ---------- Сборка основного образа ---------- + - name: Build eventhub image + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile + load: true + tags: eventhub:latest + + # ---------- Сборка тестового образа поверх eventhub ---------- + - name: Build API test image + uses: docker/build-push-action@v4 + with: + context: . + file: docker/ApiTests.Dockerfile + load: true + tags: eventhub-api-tests:latest + + # ---------- Запуск тестов ---------- + - name: Run API tests + run: | + docker run --rm eventhub-api-tests:latest + + # ---------- Пуш основного образа в Registry (опционально) ---------- + - name: Push eventhub image to Gitea Registry + if: success() + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: git.sabilin.com/eventhub/eventhub:test + + # ---------- Деплой на Snapdeploy ---------- + - name: Deploy to Snapdeploy + if: success() + run: | + # TODO: замените на реальный вызов API Snapdeploy + echo "Deploying to Snapdeploy test environment..." + # curl -X POST https://api.snapdeploy.dev/deploy \ + # -H "Authorization: Bearer ${{ secrets.SNAPDEPLOY_TOKEN }}" \ + # ... \ No newline at end of file diff --git a/.gitea/workflows/deploy-stage.yml b/.gitea/workflows/deploy-stage.yml new file mode 100644 index 0000000..667fd3d --- /dev/null +++ b/.gitea/workflows/deploy-stage.yml @@ -0,0 +1,47 @@ +name: Deploy to Stage +on: + push: + tags: + - 'v*' + +jobs: + deploy-stage: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Gitea Container Registry + uses: docker/login-action@v2 + with: + registry: git.sabilin.com + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_PASSWORD }} + + - name: Build and push eventhub + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: git.sabilin.com/eventhub/eventhub:stage + + - name: Build and push bot-emulator + uses: docker/build-push-action@v4 + with: + context: ./docker/bot-emulator-users + push: true + tags: git.sabilin.com/eventhub/bot-emulator-users:stage + + - name: Deploy to stage server + uses: appleboy/ssh-action@v0.1.5 + with: + host: ${{ secrets.STAGE_SSH_HOST }} + username: ${{ secrets.STAGE_SSH_USER }} + key: ${{ secrets.STAGE_SSH_PRIVATE_KEY }} + script: | + cd /opt/eventhub-stage + docker pull git.sabilin.com/eventhub/eventhub:stage + docker pull git.sabilin.com/eventhub/bot-emulator-users:stage + docker stack deploy -c docker-compose.stage.yml eventhub-stage --with-registry-auth \ No newline at end of file diff --git a/docker/.env.stage b/docker/.env.stage new file mode 100644 index 0000000..8bcefc2 --- /dev/null +++ b/docker/.env.stage @@ -0,0 +1,12 @@ +RELEASE_COOKIE=FuNHSU3SIiW8ICu2XIbl0pvpxAhpBvO2Wki7CT6q2bpHDSlQ8p7gtUgjnyXpPJU5 +GRAFANA_ADMIN_PASSWORD=admin +JWT_SECRET=IDhKNFRLZFDYgPvVXwg4T7hAviQ2I1VGeEn5vXufQXK3AAErZuhMWy8J1uxJ0kGF +TRAEFIK_LOG_PATH=/app/traefik/logs/access.log +ADMIN_SUPER_EMAIL=superadmin@eventhub.local +ADMIN_SUPER_PASSWORD=123456 +ADMIN_EMAIL=admin@eventhub.local +ADMIN_PASSWORD=123456 +ADMIN_MODER_EMAIL=moderator@eventhub.local +ADMIN_MODER_PASSWORD=123456 +ADMIN_SUPPORT_EMAIL=support@eventhub.local +ADMIN_SUPPORT_PASSWORD=123456 \ No newline at end of file diff --git a/docker/ApiTests.Dockerfile b/docker/ApiTests.Dockerfile index 7b11427..5a00955 100644 --- a/docker/ApiTests.Dockerfile +++ b/docker/ApiTests.Dockerfile @@ -1,26 +1,18 @@ # ============================================================ -# Одноэтапный Dockerfile (сборка и рантайм в одном образе) +# Одноэтапный Dockerfile # ============================================================ FROM erlang:28-alpine # Устанавливаем инструменты для сборки и runtime-зависимости RUN apk add \ - # для сборки - #git curl gcc make musl-dev \ rust cargo openssl-dev libsodium-dev - #\ - # для рантайма - #openssl libstdc++ libgcc ncurses-libs - -# Рабочая директория -#RUN mkdir -p log/test/ct # Копируем конфигурацию и исходники COPY rebar.config ./ COPY include/ include/ COPY src/ src/ -COPY test/api_SUITE.erl test/ +COPY test/api_*_SUITE.erl test/ COPY test/api/ test/api/ # Компилируем и запускаем тесты diff --git a/docker/docker-compose.stage.yml b/docker/docker-compose.stage.yml new file mode 100644 index 0000000..df54c51 --- /dev/null +++ b/docker/docker-compose.stage.yml @@ -0,0 +1,81 @@ +version: "3.8" + +services: + # ================== Балансировщик ================== + traefik: + image: traefik:latest + command: + - "--log.level=DEBUG" + - "--api.insecure=true" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.web.address=:80" + ports: + - "80:80" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + networks: + - eventhub-net + deploy: + replicas: 1 + restart_policy: + condition: any + + # ================== Кластер EventHub ================== + eventhub: + image: git.sabilin.com/eventhub/eventhub:stage + hostname: "eventhub-node{{.Task.Slot}}" + environment: + - NODE_NAME=eventhub-node{{.Task.Slot}} + - RELEASE_COOKIE=${RELEASE_COOKIE} + - JWT_SECRET=${JWT_SECRET} + - ADMIN_SUPER_EMAIL=${ADMIN_SUPER_EMAIL} + - ADMIN_SUPER_PASSWORD=${ADMIN_SUPER_PASSWORD} + - ADMIN_EMAIL=${ADMIN_EMAIL} + - ADMIN_PASSWORD=${ADMIN_PASSWORD} + - CLUSTER_MODE=true + - DNS_NAME=eventhub-node + networks: + eventhub-net: + aliases: + - eventhub-node + volumes: + - eventhub-data:/app/data + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/health"] + interval: 10s + timeout: 5s + retries: 3 + start_period: 30s + deploy: + replicas: 1 + endpoint_mode: dnsrr + restart_policy: + condition: any + + # ================== Эмулятор ботов ================== + bot-emulator-users: + image: git.sabilin.com/eventhub/bot-emulator-users:stage + environment: + - ADMIN_API_HOST=http://eventhub-node:8445 + - CLIENT_API_HOST=http://eventhub-node:8080 + - ADMIN_EMAIL=${ADMIN_EMAIL} + - ADMIN_PASSWORD=${ADMIN_PASSWORD} + - BOT_PASSWORD=${BOT_PASSWORD} + - STARTUP_DELAY=30 + - DEBUG=true + networks: + - eventhub-net + depends_on: + - eventhub + deploy: + replicas: 0 + restart_policy: + condition: any + +networks: + eventhub-net: + driver: overlay + +volumes: + eventhub-data: \ No newline at end of file