From 570d3b5d2dec1f5242913c83c3d873c557961f0a Mon Sep 17 00:00:00 2001 From: dmysob Date: Wed, 27 May 2026 14:19:58 +0900 Subject: [PATCH] ci: enable Actions unit for repository --- .gitea/workflows/deploy.yml | 48 ++++ plans/2026-05-27-ci-cd-implementation-plan.md | 242 ++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 plans/2026-05-27-ci-cd-implementation-plan.md diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..9980ca5 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,48 @@ +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 binary + 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: | + echo "Waiting for container to start..." + timeout /t 10 + docker ps --filter "name=bridge" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" diff --git a/plans/2026-05-27-ci-cd-implementation-plan.md b/plans/2026-05-27-ci-cd-implementation-plan.md new file mode 100644 index 0000000..50039a1 --- /dev/null +++ b/plans/2026-05-27-ci-cd-implementation-plan.md @@ -0,0 +1,242 @@ +# План внедрения локального CI/CD через Gitea в Docker + +## 1. Текущее состояние (AS-IS) + +```mermaid +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) + +```mermaid +flowchart LR + subgraph "Windows Server" + Gitea[Gitea Container
порт 3000] + Runner[Gitea Actions Runner
act_runner] + Registry[Локальный Docker Registry
порт 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` + +```yaml +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\...`): + +```bash +# Добавить Gitea как remote +git remote add gitea http://: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` (в корне проекта) + +```yaml +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`](docker-compose.yml) в `C:\docker\DockerCompose_directory\max-telegram-bridge-bot-0.3.2`: + +```yaml +services: + bridge: + build: . + image: max-telegram-bridge-bot:latest + restart: unless-stopped + env_file: .env + # ... остальное без изменений +``` + +Добавление `image:` необязательно, но помогает Docker кэшировать и помечать образы. + +### Шаг 6: Синхронизировать prod-папку с Gitea + +На Windows Server (`C:\docker\...`): + +```powershell +# Удалить старую 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: Тестирование полного цикла + +```mermaid +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 → контейнер обновился автоматически