🚛 TransChile

🧾 EV-M3 | Juan J. Abarca

👋🏻 Antes de comenzar

Esta web fue creada con fines académicos, todos los datos que se exponen no son reales. En esta se comparte la solución a la problemática de la Evaluación del Módulo 3 del BootCamp Dev-Ops TD 2025.
Puedes usar los botones de la zona superior derecha para interactuar con la web:
  • 🗂️ Navegar entre secciones.
  • ⚙️ Ajustes de visualización.
— Juan José Abarca

🎯 Contexto

En la industria del transporte de mercancías, la optimización de procesos tecnológicos es clave para garantizar eficiencia, seguridad y rapidez en la entrega. La empresa TransChile se dedica al transporte de carga dentro de Chile y actualmente enfrenta problemas en su desarrollo de software, lo que impacta negativamente en la operación logística.

El equipo de desarrollo trabaja sin integración continua, no cuenta con un flujo de trabajo estructurado ni herramientas de control de versiones adecuadas, lo que genera errores en producción, problemas de seguridad y falta de automatización en la entrega de software.

Como especialista en DevOps, los estudiantes deberán evaluar el estado actual de la empresa y proponer soluciones en un informe estructurado.

Escenario de la Empresa TransChile

Descripción del problema actual en el desarrollo de software:
  • Falta de control de versiones: Los desarrolladores trabajan en sus propios archivos sin un repositorio centralizado. Se reúnen una vez al mes para unir el código manualmente y lo suben al servidor por FTP.
  • Ausencia de un proceso de integración continua: No utilizan herramientas como Jenkins, GitHub Actions o GitLab CI/CD para gestionar el ciclo de vida del software. No se ejecutan pruebas automáticas antes de integrar los cambios en producción.
  • Problemas de seguridad: La empresa ha experimentado ataques debido a la integración de paquetes inseguros. No tienen un proceso de auditoría de seguridad ni análisis estático de código.
  • Falta de análisis de calidad de código: No utilizan herramientas como SonarQube para detectar vulnerabilidades y errores. Han identificado errores en producción que podrían haberse prevenido con un proceso adecuado de revisión.
  • Flujo de trabajo ineficiente: No siguen una metodología clara (Git Flow, GitHub Flow, Trunk-based Development). Cada desarrollador sube cambios sin revisión formal.


📋 Introducción y análisis del estado actual

La empresa TransChile, dedicada al transporte de carga dentro del territorio nacional, enfrenta una serie de desafíos tecnológicos que comprometen la calidad, seguridad y eficiencia de su desarrollo de software. Actualmente, su modelo de trabajo se basa en un enfoque manual y desestructurado que afecta gravemente la operación logística.

🛠 Modelo actual de desarrollo

El equipo de desarrollo trabaja de manera aislada, sin un repositorio centralizado ni control de versiones. Cada desarrollador avanza en su entorno local y una vez al mes se realiza una reunión para unir manualmente los cambios. Esta fusión se realiza sin revisión de código formal y se sube directamente al servidor de producción vía FTP.

❗ Problemas críticos en el proceso

  • No existen herramientas de integración continua que aseguren el correcto funcionamiento del software antes de su despliegue.
  • La ausencia de pruebas automatizadas permite que errores lleguen a producción sin ser detectados previamente.
  • No se aplica análisis estático ni revisión de código, lo que favorece la introducción de vulnerabilidades y bugs.
  • El proceso de despliegue manual y sin control de versiones expone a la empresa a pérdidas de información y errores difíciles de rastrear.

⚠️ Impacto de la falta de control y automatización

La inexistencia de un sistema de control de versiones como Git impide tener trazabilidad, historial de cambios y colaboración efectiva. La falta de automatización también ralentiza la entrega de nuevas funcionalidades, incrementa los errores humanos y dificulta la recuperación ante fallos. Esto se traduce en mayores costos operativos, pérdida de confianza por parte de los clientes y una menor competitividad en el mercado.


🔁 Propuesta de implementación de Git y control de versiones

Existen varias metodologías para organizar el trabajo con Git. Git Flow establece ramas separadas para desarrollo, releases y hotfixes, siendo útil para proyectos con ciclos definidos. GitHub Flow es más simple y continuo, trabajando directamente con main y ramas por feature. Trunk-based Development, por su parte, sugiere trabajar con una sola rama base y hacer entregas continuas, lo que requiere alto nivel de automatización y pruebas.

🔧 Propuesta de control de versiones con Git

Se propone implementar una estructura de ramas basada en main, staging y develop:

  • main: rama protegida que representa el estado estable en producción.
  • staging: contiene los cambios listos para pasar a producción tras validación funcional.
  • develop: recibe los cambios que se están integrando desde ramas de desarrollo.
  • feature/*: ramas creadas desde develop para trabajar en funcionalidades específicas, de forma aislada.

✅ Justificación del flujo recomendado

Actualmente, TransChile carece de versionamiento formal, lo que impide tener trazabilidad de cambios, control de errores y colaboración efectiva. Con Git y esta estructura de ramas, cada funcionalidad se desarrollará de forma aislada y controlada, permitiendo identificar de forma precisa qué se hizo, cuándo, por quién y por qué.

Además, este flujo facilita la automatización de pruebas: al crear una feature/*, se puede ejecutar una batería de pruebas unitarias. Al integrar a develop, se ejecutarán pruebas de integración, y al pasar a staging, se validará el sistema de forma más global con pruebas funcionales y de seguridad. Solo si todo pasa exitosamente, los cambios se promoverán a main para su despliegue en producción.


🚀 Implementación de integración continua (CI/CD)

Se ha elegido GitHub Actions como herramienta de CI/CD por su integración nativa con el repositorio, soporte para Django y facilidad de uso. Permite automatizar procesos clave del ciclo de vida del software directamente desde la plataforma donde se aloja el código.

🛠️ Propuesta de pipeline CI/CD

El flujo considera los siguientes entornos de trabajo, de acuerdo a la estrategia de ramas:

  • feature/*: Pruebas unitarias, análisis de seguridad y revisión de estilo al subir cambios.
  • develop: Pruebas integradas, escaneo de vulnerabilidades en dependencias y revisión de contenedores.
  • staging: Se ejecutan pruebas funcionales, revisión de infraestructura y se genera un live preview de la app.
  • main: Despliegue a producción solo si staging pasa todas las validaciones.

🔍 Estrategias de calidad por etapa

  • Linting: Uso de flake8 y black para mantener código limpio.
  • Testing: Se aplican pruebas unitarias, integración y funcionales según la rama.
  • Seguridad: Uso de bandit para código y safety para dependencias. Además, se incluye un escaneo de imágenes Docker con trivy para detectar vulnerabilidades antes de desplegar.
  • Entorno virtual: Se aísla la instalación de dependencias con entornos virtuales para asegurar consistencia.
  • Preview: En staging, se despliega la app en un entorno temporal para revisión visual.

📄 Archivo .github/workflows/django.yml

name: CI/CD WebApp TransChile @ Django

on:
  push:
    branches:
      - develop
      - staging
      - main
  pull_request:
    branches:
      - develop
      - staging

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_DB: transchile
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      DJANGO_SECRET_KEY: testsecret
      DJANGO_DEBUG: true
      DATABASE_URL: postgres://user:password@localhost:5432/transchile

    steps:
      - name: Checkout código
        uses: actions/checkout@v3

      - name: Configurar Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Crear entorno virtual e instalar dependencias
        run: |
          python -m venv venv
          source venv/bin/activate
          pip install --upgrade pip
          pip install -r requirements.txt

      - name: Formateo de código y lint
        run: |
          source venv/bin/activate
          black . --check
          flake8 .

      - name: Análisis de seguridad en código y dependencias
        run: |
          source venv/bin/activate
          bandit -r .
          safety check --full-report

      - name: Análisis de imagen Docker
        run: |
          docker build -t transchile .
          docker run --rm aquasec/trivy image transchile

      - name: Ejecutar pruebas
        run: |
          source venv/bin/activate
          python manage.py migrate
          python manage.py test

  deploy-staging:
    if: github.ref == 'refs/heads/staging'
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - name: Despliegue en entorno staging (preview)
        run: echo "Aquí se desplegaría a un entorno staging (ej: Docker o VPS)"

  deploy-prod:
    if: github.ref == 'refs/heads/main'
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - name: Despliegue a producción
        run: echo "Despliegue final a entorno production"


🛡️ Seguridad y análisis estático del código

Se recomienda la integración de SonarQube como herramienta principal de análisis estático del código. Su uso permite detectar vulnerabilidades, bugs y code smells de forma anticipada. SonarQube puede ejecutarse automáticamente en el pipeline de GitHub Actions tras la ejecución de pruebas unitarias e integrarse con herramientas como flake8 y black para reforzar la calidad del código. Su interfaz gráfica facilita el seguimiento continuo de la salud del proyecto.

🛠️ Estrategias para proteger la infraestructura

  • Entornos segmentados: Separar ambientes de desarrollo, staging y producción, restringiendo accesos según entorno.
  • Control de acceso: Aplicar el principio de mínimo privilegio usando autenticación multifactor y rotación de tokens.
  • Escaneo de contenedores: Usar herramientas como Trivy para detectar vulnerabilidades en imágenes Docker.
  • Auditoría de cambios: Registrar eventos clave mediante logs para rastrear acciones críticas en producción.

🚫 Paquetes inseguros y cómo evitarlos

La integración de paquetes desactualizados o comprometidos es una de las causas más comunes de ataques en sistemas modernos. Para mitigar este riesgo se utilizarán herramientas como Safety (que verifica vulnerabilidades conocidas) y pip-audit, además de mantener dependencias bajo versionado estricto en el archivo requirements.txt.

A futuro, se recomienda automatizar la revisión de dependencias con GitHub Dependabot, que permite recibir alertas cuando se detectan versiones inseguras en librerías utilizadas.

⚙️ Pipeline con análisis de seguridad integrado

A continuación se presenta una versión mejorada del archivo django.yml que incorpora los análisis con SonarQube, Safety, Bandit, Trivy y pruebas unitarias, manteniendo buenas prácticas de seguridad y calidad en el ciclo DevOps.

name: CI/CD WebApp TransChile @ Django

on:
  push:
    branches:
      - develop
      - staging
      - main
  pull_request:
    branches:
      - develop
      - staging

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_DB: transchile
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      DJANGO_SECRET_KEY: testsecret
      DJANGO_DEBUG: true
      DATABASE_URL: postgres://user:password@localhost:5432/transchile

    steps:
      - name: Checkout código
        uses: actions/checkout@v3

      - name: Configurar Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Crear entorno virtual e instalar dependencias
        run: |
          python -m venv venv
          source venv/bin/activate
          pip install --upgrade pip
          pip install -r requirements.txt

      - name: Formateo de código y lint
        run: |
          source venv/bin/activate
          black . --check
          flake8 .

      - name: Análisis de seguridad en código y dependencias
        run: |
          source venv/bin/activate
          bandit -r .
          safety check --full-report

      - name: Análisis de imagen Docker
        run: |
          docker build -t transchile .
          docker run --rm aquasec/trivy image transchile

      - name: Ejecutar pruebas unitarias
        run: |
          source venv/bin/activate
          python manage.py migrate
          python manage.py test

      - name: Análisis estático con SonarQube
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        run: |
          curl -sSLo sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
          unzip sonar-scanner.zip
          export PATH=$PATH:$PWD/sonar-scanner-*/bin
          sonar-scanner \
            -Dsonar.projectKey=transchile \
            -Dsonar.sources=. \
            -Dsonar.python.version=3.11 \
            -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
            -Dsonar.login=${{ secrets.SONAR_TOKEN }}

  deploy-staging:
    if: github.ref == 'refs/heads/staging'
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - name: Despliegue en entorno staging (preview)
        run: echo "Aquí se desplegaría a un entorno staging (ej: Docker o VPS)"

  deploy-prod:
    if: github.ref == 'refs/heads/main'
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - name: Despliegue a producción
        run: echo "Despliegue final a entorno productivo"
            


📦 Conclusión

La transformación digital propuesta para TransChile aborda de forma integral los principales desafíos técnicos y organizacionales del área de desarrollo. La implementación de Git como sistema de control de versiones, junto a una estrategia de ramas clara, permite establecer orden y trazabilidad en el ciclo de vida del software.

El pipeline CI/CD diseñado con GitHub Actions garantiza que cada cambio pase por una serie de validaciones automáticas, incluyendo pruebas, análisis estático de código, escaneo de dependencias y revisión de imágenes Docker. Esto permite detectar errores de forma temprana y reducir riesgos antes del despliegue a producción.

Por último, la incorporación de SonarQube y herramientas de seguridad refuerza la postura de ciberseguridad de la organización, asegurando que el código cumpla con estándares de calidad y minimizando vulnerabilidades. Todo esto contribuye a mejorar la eficiencia, la confianza en el producto y la competitividad de TransChile en el mercado.

— Juan José Abarca