8.9 KiB
8.9 KiB
План внедрения локального 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 через веб-интерфейс
- Открыть
http://localhost:3000(или через Caddy:https://git.example.com) - Пройти начальную настройку (Register)
- Создать репозиторий
max-telegram-bridge-bot - Скопировать токен регистрации 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 → контейнер обновился автоматически