CI/CD
Pipeline de integración y deploy continuo con Bitbucket Pipelines.
Flujo de Deployment
flowchart LR
A[Push a<br/>Bitbucket] --> B[Pipeline<br/>Trigger]
B --> C[Build<br/>Docker Image]
C --> D[Push a<br/>Docker Hub]
D --> E[Deploy en<br/>Servidor]
style A fill:#2684FF
style D fill:#2496ED
Bitbucket Pipelines
bitbucket-pipelines.yml
definitions:
services:
docker:
memory: 4096
caches:
pnpm: $HOME/.local/share/pnpm/store
pipelines:
default:
- step:
name: Build and Push Docker Image
services:
- docker
caches:
- docker
- pnpm
script:
# Tag con los últimos 7 caracteres del commit
- export IMAGE_TAG=${BITBUCKET_COMMIT:0:7}
- export IMAGE_NAME=mundoit/$BITBUCKET_REPO_SLUG
# Login a Docker Hub
- docker login --username $DOCKER_HUB_USER --password $DOCKER_HUB_PASSWORD
# Build con cache
- docker build
--cache-from $IMAGE_NAME:latest
-t $IMAGE_NAME:$IMAGE_TAG
-t $IMAGE_NAME:latest
.
# Push ambos tags
- docker push $IMAGE_NAME:$IMAGE_TAG
- docker push $IMAGE_NAME:latest
Tags de Imagen
Cada build genera dos tags:
| Tag | Ejemplo | Descripción |
|---|---|---|
| Commit hash | a1b2c3d |
Últimos 7 caracteres del commit |
| latest | latest |
Siempre la última versión |
flowchart TD
A[Commit abc1234567890] --> B[Build]
B --> C[mundoit/erp-wms-sync:abc1234]
B --> D[mundoit/erp-wms-sync:latest]
Variables de Repositorio
Configurar en Bitbucket → Repository settings → Repository variables:
| Variable | Descripción | Secured |
|---|---|---|
DOCKER_HUB_USER |
Usuario de Docker Hub | No |
DOCKER_HUB_PASSWORD |
Password o Access Token | ✅ Sí |
Cache
Docker Cache
Cachea las capas de Docker para builds más rápidos.
pnpm Cache
Cachea el store de pnpm para no descargar dependencias en cada build.
Proceso de Build
sequenceDiagram
participant Dev as Developer
participant BB as Bitbucket
participant Pipe as Pipeline
participant DH as Docker Hub
participant Srv as Server
Dev->>BB: git push
BB->>Pipe: Trigger pipeline
Pipe->>Pipe: docker build
Note over Pipe: Stage 1: Builder<br/>Stage 2: Runtime
Pipe->>DH: docker push :abc1234
Pipe->>DH: docker push :latest
Note over Srv: Manual o automático
Srv->>DH: docker pull :latest
Srv->>Srv: Restart container
Deploy Manual
Después del push a Docker Hub, ejecutar en el servidor:
# Opción 1: Script
./update-sync.sh
# Opción 2: Manual
docker pull mundoit/erp-wms-sync:latest
docker rm -f rodamar_sync
docker run -d \
--name rodamar_sync \
--network rodamar_backend \
--restart always \
--env-file .env \
-p 127.0.0.1:8080:8080 \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
mundoit/erp-wms-sync:latest
Script de Actualización
#!/bin/bash
#!/bin/bash
# update-sync.sh - Actualiza el container de sync
set -e
IMAGE="mundoit/erp-wms-sync:latest"
CONTAINER="rodamar_sync"
NETWORK="rodamar_backend"
ENV_FILE=".env"
echo "🔄 Pulling latest image..."
docker pull $IMAGE
echo "🛑 Stopping and removing old container..."
docker rm -f $CONTAINER 2>/dev/null || true
echo "🚀 Starting new container..."
docker run -d \
--name $CONTAINER \
--network $NETWORK \
--restart always \
--env-file $ENV_FILE \
-p :8080:8080 \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
$IMAGE
echo "✅ Done! Checking status..."
docker ps | grep $CONTAINER
echo ""
echo "📋 Logs: docker logs -f $CONTAINER"
Troubleshooting
Build falla por memoria
Push a Docker Hub falla
- Verificar credenciales en Repository variables
- Verificar que el usuario tiene permisos en el repo de Docker Hub