Compare commits

...

3 Commits

5 changed files with 318 additions and 2 deletions

View File

@ -88,4 +88,5 @@ images/*
node_modules/ node_modules/
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
salvagebot

View File

@ -0,0 +1,76 @@
name: Build and Push Docker Image (Local Registry)
on:
push:
branches:
- main
- develop
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Tag for the Docker image'
required: false
default: 'latest'
env:
# Замените на ваш локальный registry URL
REGISTRY: registry.example.com
IMAGE_NAME: salvagedb/salvagedb-bot
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Local Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Generate tags
id: tags
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "tags=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref_type }}" == "tag" ]]; then
tag=${GITHUB_REF#refs/tags/}
echo "tags=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${tag},${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref_name }}" == "main" ]]; then
echo "tags=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:main" >> $GITHUB_OUTPUT
else
branch_name=$(echo "${{ github.ref_name }}" | sed 's/[^a-zA-Z0-9]/-/g')
echo "tags=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${branch_name}" >> $GITHUB_OUTPUT
fi
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.tags.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
labels: |
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.created=${{ github.event.head_commit.timestamp }}
- name: Summary
run: |
echo "## Docker Build Summary" >> $GITHUB_STEP_SUMMARY
echo "- **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
echo "- **Image:** ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
echo "- **Tags:** ${{ steps.tags.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
echo "- **Commit:** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY

View File

@ -0,0 +1,71 @@
name: Build and Push Docker Image
on:
push:
branches:
- main
- develop
tags:
- 'v*'
pull_request:
branches:
- main
env:
REGISTRY: docker.io
IMAGE_NAME: salvagedb-bot
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}
tags: |
# set latest tag for main branch
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
- name: Image digest
if: github.event_name != 'pull_request'
run: echo ${{ steps.build.outputs.digest }}

3
.gitignore vendored
View File

@ -9,4 +9,5 @@ wheels/
# Virtual environments # Virtual environments
.venv .venv
logs/ logs/
images/ images/
salvagebot

167
README_GITEA_ACTIONS.md Normal file
View File

@ -0,0 +1,167 @@
# Gitea Actions для автоматической сборки Docker образов
## Обзор
В проекте настроены два workflow для автоматической сборки Docker образов:
1. `docker-build.yml` - для публикации в Docker Hub
2. `docker-build-local.yml` - для публикации в локальный registry
## Настройка
### 1. Включение Gitea Actions
Убедитесь, что Actions включены в вашем Gitea instance:
```yaml
# app.ini
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://gitea.com
```
### 2. Настройка Secrets
#### Для Docker Hub (docker-build.yml):
В настройках репозитория -> Security -> Secrets добавьте:
- `DOCKER_USERNAME` - ваш username в Docker Hub
- `DOCKER_PASSWORD` - токен доступа или пароль Docker Hub
#### Для локального registry (docker-build-local.yml):
- `REGISTRY_USERNAME` - username для локального registry
- `REGISTRY_PASSWORD` - пароль для локального registry
### 3. Конфигурация registry
#### Docker Hub
Workflow использует `docker.io` по умолчанию. Образы будут доступны как:
```
docker.io/YOUR_USERNAME/salvagedb-bot:latest
docker.io/YOUR_USERNAME/salvagedb-bot:main
docker.io/YOUR_USERNAME/salvagedb-bot:v1.0.0
```
#### Локальный registry
Отредактируйте файл `.gitea/workflows/docker-build-local.yml`:
```yaml
env:
REGISTRY: your-registry.example.com # Замените на ваш URL
IMAGE_NAME: salvagedb/salvagedb-bot # Замените на желаемое имя
```
## Триггеры сборки
### Автоматические триггеры:
1. **Push в ветки `main` или `develop`**
- Создает образы с тегами: `latest`, `main`, `develop`
2. **Создание тегов начинающихся с `v`** (например, `v1.0.0`)
- Создает образы с семантическими тегами: `1.0.0`, `1.0`, `1`, `latest`
3. **Pull Request в `main`**
- Собирает образ для тестирования (не публикует)
### Ручной запуск:
Для локального registry доступен ручной запуск через веб-интерфейс Gitea:
- Actions -> Workflows -> "Build and Push Docker Image (Local Registry)"
- Можно указать произвольный тег
## Структура тегов
### Docker Hub workflow:
- `latest` - только для main ветки
- `main`, `develop` - соответствующие ветки
- `v1.0.0`, `1.0.0`, `1.0`, `1` - семантические версии
- `pr-123` - для pull requests
### Локальный registry workflow:
- `latest` - для main ветки и версионных тегов
- `main`, `develop` - соответствующие ветки
- Версионные теги как есть (`v1.0.0`)
- Произвольные теги при ручном запуске
## Оптимизация
### Кэширование
Workflows используют GitHub Actions cache для ускорения сборки:
- Кэшируются Docker слои между сборками
- Значительно ускоряет повторные сборки
### Мультиплатформенная сборка
Docker Hub workflow собирает образы для:
- `linux/amd64` (Intel/AMD)
- `linux/arm64` (ARM, включая Apple Silicon)
Локальный workflow собирает только для `linux/amd64` для экономии времени.
## Мониторинг
### Просмотр логов
1. Перейдите в Actions в веб-интерфейсе Gitea
2. Выберите нужный workflow run
3. Просмотрите детальные логи каждого шага
### Troubleshooting
#### Ошибки аутентификации:
- Проверьте правильность secrets
- Убедитесь, что токены имеют права на push
#### Ошибки сборки:
- Проверьте валидность Dockerfile
- Убедитесь, что все зависимости доступны
#### Проблемы с registry:
- Проверьте доступность registry
- Убедитесь в правильности URL
## Использование собранных образов
### Запуск локально:
```bash
# Docker Hub
docker run -d --name salvagedb-bot \
--env-file .env \
your-username/salvagedb-bot:latest
# Локальный registry
docker run -d --name salvagedb-bot \
--env-file .env \
registry.example.com/salvagedb/salvagedb-bot:latest
```
### Docker Compose:
```yaml
version: '3.8'
services:
bot:
image: your-username/salvagedb-bot:latest
# или
# image: registry.example.com/salvagedb/salvagedb-bot:latest
env_file: .env
restart: unless-stopped
```
## Безопасность
- Secrets хранятся зашифрованными в Gitea
- Токены должны иметь минимальные необходимые права
- Рекомендуется использовать отдельные токены для CI/CD
- Регулярно ротируйте access tokens
## Дополнительные возможности
### Уведомления
Можно добавить уведомления в Slack/Discord/Telegram о статусе сборки.
### Сканирование безопасности
Можно интегрировать сканеры уязвимостей (Trivy, Snyk).
### Деплой
Можно расширить workflow для автоматического деплоя в staging/production.