ci: enable Actions unit for repository
This commit is contained in:
@@ -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 → контейнер обновился автоматически
|
||||||
Reference in New Issue
Block a user