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