ci: enable Actions unit for repository
Build and Deploy / Check and Build (push) Failing after 5m23s
Build and Deploy / Deploy to Production (push) Has been skipped

This commit is contained in:
2026-05-27 14:19:58 +09:00
parent 03a46498fe
commit 570d3b5d2d
2 changed files with 290 additions and 0 deletions
+48
View File
@@ -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}}"
@@ -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<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`
```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://<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` (в корне проекта)
```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 → контейнер обновился автоматически