Files
max-telegram-bridge-bot/plans/2026-05-27-ci-cd-implementation-plan.md
dmysob 570d3b5d2d
Build and Deploy / Check and Build (push) Failing after 5m23s
Build and Deploy / Deploy to Production (push) Has been skipped
ci: enable Actions unit for repository
2026-05-27 14:20:16 +09:00

8.9 KiB
Raw Permalink Blame History

План внедрения локального CI/CD через Gitea в Docker

1. Текущее состояние (AS-IS)

flowchart LR
    Dev[\\srv1\\smb\\... dev] -->|ручное копирование| Prod[C:\\docker\\... prod]
    Prod -->|docker-compose up -d --build| Container[Running Container]

Проблемы:

  • Деплой полностью ручной — копирование файлов через сетевую шару
  • Нет автоматической проверки кода перед деплоем
  • Нет истории изменений/версий на локальном сервере
  • Две разные git-истории (dev: main, prod: master) не синхронизированы

2. Целевая архитектура (TO-BE)

flowchart LR
    subgraph "Windows Server"
        Gitea[Gitea Container<br/>порт 3000]
        Runner[Gitea Actions Runner<br/>act_runner]
        Registry[Локальный Docker Registry<br/>порт 5000]
        Bridge[bridge + postgres]
        Caddy[Caddy reverse proxy]
    end

    subgraph "Dev (сетевая шара)"
        Dev[\\srv1\\smb\\...]
    end

    Dev -->|git push gitea main| Gitea
    Gitea -->|триггер push/tag| Runner
    Runner -->|docker build + push| Registry
    Runner -->|docker-compose up -d| Bridge
    Caddy -->|прокси| Gitea
    Caddy -->|прокси| Bridge

Компоненты

Компонент Роль Образ
Gitea Локальный Git-сервер + CI/CD (Gitea Actions) gitea/gitea:latest
act_runner Исполнитель Gitea Actions (регистрируется в Gitea) gitea/act_runner:latest
Docker Registry Локальное хранилище Docker-образов (опционально) registry:2
Bridge Целевое приложение ghcr.io/... или localhost:5000/bridge:latest

3. Пошаговый план

Шаг 1: Развернуть Gitea в Docker

Новый файл: C:\docker\DockerCompose_directory\gitea\docker-compose.yml

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    ports:
      - "3000:3000"   # Web UI
      - "2222:22"     # SSH
    volumes:
      - gitea_data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3

  act_runner:
    image: gitea/act_runner:latest
    container_name: act_runner
    restart: unless-stopped
    depends_on:
      - gitea
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - act_runner_data:/data
    environment:
      - GITEA_INSTANCE_URL=http://gitea:3000
      - GITEA_RUNNER_REGISTRATION_TOKEN=<получить из UI Gitea>
      - GITEA_RUNNER_NAME=windows-docker-runner

volumes:
  gitea_data:
  act_runner_data:

Ключевой момент: act_runner монтирует Docker-сокет хост-системы (/var/run/docker.sock). Это даёт runner'у права выполнять docker build, docker pull, docker-compose от имени хоста.

Шаг 2: Настроить Gitea через веб-интерфейс

  1. Открыть http://localhost:3000 (или через Caddy: https://git.example.com)
  2. Пройти начальную настройку (Register)
  3. Создать репозиторий max-telegram-bridge-bot
  4. Скопировать токен регистрации runner'а: Site Administration → Actions → Runners → Create Runner

Шаг 3: Перенести код в Gitea

На dev-машине (сетевой ресурс \\srv1\smb\...):

# Добавить Gitea как remote
git remote add gitea http://<SERVER_IP>:3000/BEARlogin/max-telegram-bridge-bot.git

# Залить код
git push gitea main

# Удалить старый remote origin если не нужен (GitHub)
git remote remove origin

Шаг 4: Создать Gitea Actions workflow

Новый файл: .gitea/workflows/deploy.yml (в корне проекта)

name: Build and Deploy
run-name: Deploy ${{ gitea.ref_name }}

on:
  push:
    branches: [main]
    tags: ['v*']

jobs:
  ci:
    name: Check and Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-go@v5
        with:
          go-version: '1.24'

      - name: Vet
        run: go vet ./...

      - name: Test
        run: go test ./...

      - name: Build
        run: CGO_ENABLED=1 go build -o max-telegram-bridge-bot .

  deploy:
    name: Deploy to Production
    needs: ci
    runs-on: ubuntu-latest
    if: ${{ gitea.ref_name == 'main' || startsWith(gitea.ref_name, 'v') }}
    steps:
      - uses: actions/checkout@v4

      - name: Build Docker image
        run: docker build -t max-telegram-bridge-bot:latest .

      - name: Deploy with Docker Compose
        working-directory: C:\docker\DockerCompose_directory\max-telegram-bridge-bot-0.3.2
        run: docker-compose up -d --build

      - name: Health check
        run: |
          timeout /t 10
          docker ps --filter "name=bridge" --format "{{.Status}}"

Шаг 5: Настроить Docker Compose для production через Gitea

Изменить docker-compose.yml в C:\docker\DockerCompose_directory\max-telegram-bridge-bot-0.3.2:

services:
  bridge:
    build: .
    image: max-telegram-bridge-bot:latest
    restart: unless-stopped
    env_file: .env
    # ... остальное без изменений

Добавление image: необязательно, но помогает Docker кэшировать и помечать образы.

Шаг 6: Синхронизировать prod-папку с Gitea

На Windows Server (C:\docker\...):

# Удалить старую git-историю (master)
Remove-Item -Recurse -Force .git

# Инициализировать заново от Gitea
git init
git remote add origin http://localhost:3000/BEARlogin/max-telegram-bridge-bot.git
git fetch origin
git checkout -b main origin/main

После этого C:\docker\... будет чистым working tree ветки main из Gitea.

Шаг 7: Тестирование полного цикла

flowchart TB
    A[Dev: git commit + push to Gitea] --> B[Gitea получает push]
    B --> C[Gitea Actions запускает workflow]
    C --> D[act_runner: go vet + test + build]
    D --> E[act_runner: docker build]
    E --> F[act_runner: docker-compose up -d]
    F --> G[Контейнер bridge перезапущен]

4. Файлы для создания/изменения

Файл Действие Назначение
C:\docker\DockerCompose_directory\gitea\docker-compose.yml Создать Стек Gitea + act_runner
.gitea/workflows/deploy.yml Создать Workflow для Gitea Actions
C:\docker\DockerCompose_directory\max-telegram-bridge-bot-0.3.2\docker-compose.yml Изменить Добавить image: тег
C:\docker\DockerCompose_directory\max-telegram-bridge-bot-0.3.2\.git Пересоздать Привязать к Gitea вместо GitHub

5. Риски и митигация

Риск Решение
Docker-сокет в контейнере (act_runner) —安全问题 act_runner изолирован, имеет доступ только к Docker API, не к хост-системе
Сетевая шара \\srv1\smb\... недоступна с Windows Server Gitea работает на самом сервере, dev-машина пушит через HTTP/SSH, сетевая шара не нужна
Потеря данных Gitea (репозитории) Volume gitea_data хранит всё; регулярный backup в docker volume backup
act_runner не может найти docker-compose Использовать docker compose (built-in) вместо docker-compose (отдельный плагин)

6. Критерии готовности

  • Gitea запущен на http://localhost:3000, доступен через Caddy
  • act_runner зарегистрирован и виден в UI Gitea (Site Admin → Actions)
  • Код из dev-шары залит в Gitea (git push gitea main)
  • Push в Gitea → Gitea Actions запускает go vet + go test + go build
  • Push в Gitea → Docker-образ собирается и контейнер перезапускается
  • Prod-папка C:\docker\... синхронизирована с Gitea (один remote)
  • Чистый тест: изменение в dev → git push → контейнер обновился автоматически