Saltar a contenido

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

caches:
  - docker

Cachea las capas de Docker para builds más rápidos.

pnpm Cache

definitions:
  caches:
    pnpm: $HOME/.local/share/pnpm/store

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

definitions:
  services:
    docker:
      memory: 4096  # Aumentar si es necesario

Push a Docker Hub falla

  • Verificar credenciales en Repository variables
  • Verificar que el usuario tiene permisos en el repo de Docker Hub