ci: add complete CI/CD pipeline for Docker images
Some checks failed
Build and Push Docker Images / build-and-push (./archon-ui-main, ./archon-ui-main/Dockerfile, frontend) (push) Failing after 1m45s
Build and Push Docker Images / build-and-push (./python, ./python/Dockerfile.agents, agents) (push) Failing after 6s
Build and Push Docker Images / build-and-push (./python, ./python/Dockerfile.mcp, mcp) (push) Failing after 7s
Build and Push Docker Images / build-and-push (./python, ./python/Dockerfile.server, server) (push) Failing after 6s
Build and Push Docker Images / summary (push) Has been skipped
Test Build / build (push) Failing after 3s

- Add build-push-images.yml workflow for automated builds
- Build and push all 4 images (server, mcp, frontend, agents)
- Support versioning: latest, semver, commit SHA
- Add docker-compose.registry.yml for registry images
- Add REGISTRY.md documentation for DevOps team

Images will be pushed to:
- git.automatizase.com.br/luis.erlacher/archon/server
- git.automatizase.com.br/luis.erlacher/archon/mcp
- git.automatizase.com.br/luis.erlacher/archon/frontend
- git.automatizase.com.br/luis.erlacher/archon/agents

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Luis Erlacher 2025-10-05 13:03:00 -03:00
parent ccd2dca77a
commit bb0cd077ab
3 changed files with 461 additions and 0 deletions

View File

@ -0,0 +1,123 @@
name: Build and Push Docker Images
on:
push:
branches:
- main
tags:
- 'v*'
workflow_dispatch:
env:
REGISTRY: git.automatizase.com.br
REGISTRY_PATH: luis.erlacher/archon
jobs:
build-and-push:
runs-on: wsl
strategy:
matrix:
include:
- name: server
context: ./python
dockerfile: ./python/Dockerfile.server
- name: mcp
context: ./python
dockerfile: ./python/Dockerfile.mcp
- name: frontend
context: ./archon-ui-main
dockerfile: ./archon-ui-main/Dockerfile
- name: agents
context: ./python
dockerfile: ./python/Dockerfile.agents
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Gitea Container Registry
run: |
echo "${{ secrets.GITEA_TOKEN }}" | docker login ${{ env.REGISTRY }} -u ${{ secrets.GITEA_USERNAME }} --password-stdin
- name: Extract version metadata
id: meta
run: |
# Se for uma tag, usa a tag como versão
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
else
# Senão, gera versão baseada no número do run
VERSION="v1.0.${{ github.run_number }}"
fi
COMMIT_SHA="${{ github.sha }}"
SHORT_SHA=${COMMIT_SHA:0:7}
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT
- name: Build and push ${{ matrix.name }} image
uses: docker/build-push-action@v5
with:
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
push: true
tags: |
${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:latest
${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:${{ steps.meta.outputs.version }}
${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:${{ steps.meta.outputs.short_sha }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:buildcache
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:buildcache,mode=max
summary:
needs: build-and-push
runs-on: wsl
steps:
- name: Extract version metadata
id: meta
run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
else
VERSION="v1.0.${{ github.run_number }}"
fi
COMMIT_SHA="${{ github.sha }}"
SHORT_SHA=${COMMIT_SHA:0:7}
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT
- name: Build Summary
run: |
echo "### 🚀 Docker Images Build & Push Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Version:** \`${{ steps.meta.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Commit:** \`${{ steps.meta.outputs.short_sha }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Registry:** \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "#### 📦 Images Pushed:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Service | Image | Tags |" >> $GITHUB_STEP_SUMMARY
echo "|---------|-------|------|" >> $GITHUB_STEP_SUMMARY
echo "| Server | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/server\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| MCP | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/mcp\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| Frontend | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/frontend\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| Agents | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/agents\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "#### 🔧 Docker Compose Usage:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`yaml" >> $GITHUB_STEP_SUMMARY
echo "services:" >> $GITHUB_STEP_SUMMARY
echo " archon-server:" >> $GITHUB_STEP_SUMMARY
echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/server:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo " archon-mcp:" >> $GITHUB_STEP_SUMMARY
echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/mcp:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo " archon-frontend:" >> $GITHUB_STEP_SUMMARY
echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/frontend:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo " archon-agents:" >> $GITHUB_STEP_SUMMARY
echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/agents:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY

241
REGISTRY.md Normal file
View File

@ -0,0 +1,241 @@
# Usando Imagens do Registry Gitea
Este documento descreve como usar as imagens Docker do Archon a partir do registry privado do Gitea.
## Registry Information
**Registry URL:** `git.automatizase.com.br`
**Repository:** `luis.erlacher/archon`
## Imagens Disponíveis
Todas as imagens são buildadas automaticamente via Gitea Actions e publicadas com múltiplas tags:
| Serviço | Imagem | Descrição |
|---------|--------|-----------|
| **Server** | `git.automatizase.com.br/luis.erlacher/archon/server` | FastAPI + Crawling + Socket.IO |
| **MCP** | `git.automatizase.com.br/luis.erlacher/archon/mcp` | MCP Server para IDEs |
| **Frontend** | `git.automatizase.com.br/luis.erlacher/archon/frontend` | React UI |
| **Agents** | `git.automatizase.com.br/luis.erlacher/archon/agents` | AI Agents (opcional) |
## Tags Disponíveis
Cada imagem é publicada com 3 tags:
- **`latest`** - Última versão estável da branch main
- **`v1.0.X`** - Versão semântica (X = número do build)
- **`SHORT_SHA`** - Hash curto do commit (7 caracteres)
### Exemplos:
```bash
git.automatizase.com.br/luis.erlacher/archon/server:latest
git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42
git.automatizase.com.br/luis.erlacher/archon/server:a3c2f1e
```
## Autenticação no Registry
### 1. Login com Docker
```bash
docker login git.automatizase.com.br
# Username: luis.erlacher
# Password: [seu token de acesso]
```
### 2. Gerar Token de Acesso
1. Acesse: https://git.automatizase.com.br/user/settings/applications
2. Clique em "Generate New Token"
3. Selecione permissões: `read:package`, `write:package`
4. Use o token gerado como senha no docker login
## Uso em Docker Compose
### Opção 1: Usar arquivo fornecido
```bash
# Copiar arquivo .env de exemplo
cp .env.example .env
# Editar variáveis de ambiente necessárias
nano .env
# Subir com imagens do registry
docker compose -f docker-compose.registry.yml up -d
# Com agents (opcional)
docker compose -f docker-compose.registry.yml --profile agents up -d
```
### Opção 2: Criar seu próprio compose
```yaml
services:
archon-server:
image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42
# ... configurações
archon-mcp:
image: git.automatizase.com.br/luis.erlacher/archon/mcp:v1.0.42
# ... configurações
archon-frontend:
image: git.automatizase.com.br/luis.erlacher/archon/frontend:v1.0.42
# ... configurações
```
## Uso em Kubernetes
### 1. Criar Secret para Registry
```bash
kubectl create secret docker-registry gitea-registry \
--docker-server=git.automatizase.com.br \
--docker-username=luis.erlacher \
--docker-password=<seu-token> \
--docker-email=lperlacher@gmail.com
```
### 2. Usar em Deployment
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: archon-server
spec:
template:
spec:
imagePullSecrets:
- name: gitea-registry
containers:
- name: server
image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42
ports:
- containerPort: 8181
```
## Versionamento
### Usando Tags Específicas (Recomendado para Produção)
```yaml
services:
archon-server:
image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42
```
**Vantagens:**
- Builds reproduzíveis
- Rollback fácil
- Não quebra com atualizações
### Usando Latest (Desenvolvimento)
```yaml
services:
archon-server:
image: git.automatizase.com.br/luis.erlacher/archon/server:latest
```
**Vantagens:**
- Sempre atualizado
- Ideal para staging/dev
## CI/CD Pipeline
O workflow `.gitea/workflows/build-push-images.yml` é disparado:
1. **Em push para main** - Cria versão `v1.0.X` e `latest`
2. **Em tags git** - Usa a tag como versão (ex: `v2.0.0`)
3. **Manual** - Via workflow_dispatch no Gitea Actions
### Criar Release com Tag
```bash
git tag -a v2.0.0 -m "Release version 2.0.0"
git push origin v2.0.0
```
Isso irá buildar e publicar todas as imagens com tag `v2.0.0`.
## Variáveis de Ambiente Necessárias
No Gitea Actions, configure os secrets:
- `GITEA_USERNAME` - Usuário do Gitea (luis.erlacher)
- `GITEA_TOKEN` - Token de acesso com permissões de package
### Configurar Secrets no Gitea
1. Acesse: https://git.automatizase.com.br/luis.erlacher/Archon/settings/secrets
2. Adicione:
- Name: `GITEA_USERNAME`, Value: `luis.erlacher`
- Name: `GITEA_TOKEN`, Value: `[seu token]`
## Troubleshooting
### Erro de Autenticação
```bash
# Verificar login
docker logout git.automatizase.com.br
docker login git.automatizase.com.br
# Pull de teste
docker pull git.automatizase.com.br/luis.erlacher/archon/server:latest
```
### Ver Versões Disponíveis
Acesse: https://git.automatizase.com.br/luis.erlacher/-/packages
### Limpar Imagens Antigas Localmente
```bash
docker images | grep "git.automatizase.com.br" | awk '{print $3}' | xargs docker rmi
```
## Para DevOps/SRE
### Helm Chart (exemplo básico)
```yaml
# values.yaml
image:
registry: git.automatizase.com.br
repository: luis.erlacher/archon
tag: v1.0.42
pullSecrets:
- gitea-registry
server:
image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}/server:{{ .Values.image.tag }}"
mcp:
image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}/mcp:{{ .Values.image.tag }}"
```
### ArgoCD Application
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: archon
spec:
source:
repoURL: https://git.automatizase.com.br/luis.erlacher/Archon.git
targetRevision: main
path: k8s/manifests
destination:
server: https://kubernetes.default.svc
namespace: archon
```
## Suporte
Para issues ou dúvidas:
- Issues: https://git.automatizase.com.br/luis.erlacher/Archon/issues
- CI/CD Logs: https://git.automatizase.com.br/luis.erlacher/Archon/actions

View File

@ -0,0 +1,97 @@
# Docker Compose usando imagens do Registry Gitea
# Para usar este arquivo: docker compose -f docker-compose.registry.yml up -d
services:
# Server Service (FastAPI + Socket.IO + Crawling)
archon-server:
image: git.automatizase.com.br/luis.erlacher/archon/server:latest
container_name: archon-server
ports:
- "${ARCHON_SERVER_PORT:-8181}:${ARCHON_SERVER_PORT:-8181}"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051}
- ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052}
- AGENTS_ENABLED=${AGENTS_ENABLED:-false}
- ARCHON_HOST=${HOST:-localhost}
networks:
- app-network
volumes:
- /var/run/docker.sock:/var/run/docker.sock
extra_hosts:
- "host.docker.internal:host-gateway"
# Lightweight MCP Server Service (HTTP-based)
archon-mcp:
image: git.automatizase.com.br/luis.erlacher/archon/mcp:latest
container_name: archon-mcp
ports:
- "${ARCHON_MCP_PORT:-8051}:${ARCHON_MCP_PORT:-8051}"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- TRANSPORT=sse
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- API_SERVICE_URL=http://archon-server:${ARCHON_SERVER_PORT:-8181}
- AGENTS_ENABLED=${AGENTS_ENABLED:-false}
- AGENTS_SERVICE_URL=${AGENTS_SERVICE_URL:-http://archon-agents:${ARCHON_AGENTS_PORT:-8052}}
- ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052}
networks:
- app-network
depends_on:
- archon-server
extra_hosts:
- "host.docker.internal:host-gateway"
# AI Agents Service (ML/Reranking) - Opcional
archon-agents:
image: git.automatizase.com.br/luis.erlacher/archon/agents:latest
profiles:
- agents
container_name: archon-agents
ports:
- "${ARCHON_AGENTS_PORT:-8052}:${ARCHON_AGENTS_PORT:-8052}"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
networks:
- app-network
# Frontend
archon-frontend:
image: git.automatizase.com.br/luis.erlacher/archon/frontend:latest
container_name: archon-ui
ports:
- "${ARCHON_UI_PORT:-3737}:3737"
environment:
- VITE_ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- HOST=${HOST:-localhost}
- PROD=${PROD:-false}
- VITE_ALLOWED_HOSTS=${VITE_ALLOWED_HOSTS:-}
- VITE_SHOW_DEVTOOLS=${VITE_SHOW_DEVTOOLS:-false}
- DOCKER_ENV=true
networks:
- app-network
depends_on:
- archon-server
networks:
app-network:
driver: bridge