Introducción

La integración continua (CI) y la entrega continua (CD) son prácticas esenciales en el desarrollo de software moderno. Docker facilita estas prácticas al proporcionar un entorno consistente y reproducible para construir, probar y desplegar aplicaciones. En esta sección, aprenderás cómo integrar Docker en tus pipelines de CI/CD para mejorar la eficiencia y la fiabilidad de tus despliegues.

Objetivos

  • Entender los conceptos básicos de CI/CD.
  • Configurar un pipeline de CI/CD utilizando Docker.
  • Integrar Docker con herramientas populares de CI/CD como Jenkins, GitLab CI y GitHub Actions.
  • Automatizar la construcción, prueba y despliegue de aplicaciones Dockerizadas.

Conceptos Básicos de CI/CD

Integración Continua (CI)

La integración continua es una práctica de desarrollo de software en la que los desarrolladores integran su código en un repositorio compartido varias veces al día. Cada integración es verificada por una build automatizada (incluyendo pruebas) para detectar errores lo antes posible.

Entrega Continua (CD)

La entrega continua es una extensión de la integración continua que asegura que el código puede ser desplegado en producción en cualquier momento. Esto se logra automatizando el proceso de despliegue para que las aplicaciones puedan ser lanzadas de manera rápida y segura.

Configurando un Pipeline de CI/CD con Docker

Paso 1: Preparar el Repositorio

  1. Estructura del Proyecto: Asegúrate de que tu proyecto esté organizado de manera que sea fácil de construir y desplegar. Un ejemplo de estructura de proyecto podría ser:

    my-app/
    ├── Dockerfile
    ├── src/
    ├── tests/
    ├── .gitlab-ci.yml
    └── .github/
        └── workflows/
            └── ci-cd.yml
    
  2. Dockerfile: Define un Dockerfile para construir la imagen de tu aplicación.

    # Dockerfile
    FROM python:3.8-slim
    
    WORKDIR /app
    
    COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    
    COPY . .
    
    CMD ["python", "app.py"]
    

Paso 2: Configurar Jenkins para CI/CD

  1. Instalar Jenkins: Si no tienes Jenkins instalado, puedes usar Docker para instalarlo rápidamente.

    docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
    
  2. Configurar Jenkins Pipeline: Crea un nuevo pipeline en Jenkins y configura el Jenkinsfile.

    pipeline {
        agent any
    
        stages {
            stage('Build') {
                steps {
                    script {
                        docker.build('my-app')
                    }
                }
            }
            stage('Test') {
                steps {
                    script {
                        docker.image('my-app').inside {
                            sh 'pytest tests/'
                        }
                    }
                }
            }
            stage('Deploy') {
                steps {
                    script {
                        docker.image('my-app').push('my-repo/my-app:latest')
                    }
                }
            }
        }
    }
    

Paso 3: Configurar GitLab CI/CD

  1. Archivo .gitlab-ci.yml: Define el pipeline en el archivo .gitlab-ci.yml.

    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t my-app .
    
    test:
      stage: test
      script:
        - docker run my-app pytest tests/
    
    deploy:
      stage: deploy
      script:
        - docker tag my-app my-repo/my-app:latest
        - docker push my-repo/my-app:latest
    

Paso 4: Configurar GitHub Actions

  1. Archivo de Workflow: Define el workflow en .github/workflows/ci-cd.yml.

    name: CI/CD
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
    
          - name: Set up Docker Buildx
            uses: docker/setup-buildx-action@v1
    
          - name: Build Docker image
            run: docker build -t my-app .
    
          - name: Run tests
            run: docker run my-app pytest tests/
    
          - name: Log in to Docker Hub
            run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
    
          - name: Push Docker image
            run: docker push my-repo/my-app:latest
    

Ejercicio Práctico

Ejercicio 1: Configurar un Pipeline de CI/CD con GitHub Actions

  1. Objetivo: Configurar un pipeline de CI/CD para una aplicación Dockerizada utilizando GitHub Actions.
  2. Instrucciones:
    • Crea un repositorio en GitHub.
    • Añade un Dockerfile y un archivo de workflow en .github/workflows/ci-cd.yml.
    • Configura el workflow para construir, probar y desplegar la imagen Docker.
    • Asegúrate de que el pipeline se ejecute correctamente al hacer push a la rama main.

Solución

  1. Crear Repositorio: Crea un nuevo repositorio en GitHub.

  2. Añadir Dockerfile: Añade el siguiente Dockerfile al repositorio.

    FROM python:3.8-slim
    
    WORKDIR /app
    
    COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    
    COPY . .
    
    CMD ["python", "app.py"]
    
  3. Añadir Workflow: Añade el siguiente archivo de workflow en .github/workflows/ci-cd.yml.

    name: CI/CD
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
    
          - name: Set up Docker Buildx
            uses: docker/setup-buildx-action@v1
    
          - name: Build Docker image
            run: docker build -t my-app .
    
          - name: Run tests
            run: docker run my-app pytest tests/
    
          - name: Log in to Docker Hub
            run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
    
          - name: Push Docker image
            run: docker push my-repo/my-app:latest
    
  4. Configurar Secretos: Añade los secretos DOCKER_USERNAME y DOCKER_PASSWORD en la configuración del repositorio en GitHub.

  5. Probar Pipeline: Haz push a la rama main y verifica que el pipeline se ejecute correctamente.

Conclusión

En esta sección, has aprendido cómo configurar un pipeline de CI/CD utilizando Docker. Has visto ejemplos prácticos de cómo integrar Docker con Jenkins, GitLab CI y GitHub Actions. Estas habilidades te permitirán automatizar la construcción, prueba y despliegue de tus aplicaciones Dockerizadas, mejorando la eficiencia y fiabilidad de tus despliegues.

En el próximo módulo, profundizaremos en la orquestación de contenedores con Docker Swarm y Kubernetes, lo que te permitirá gestionar aplicaciones complejas en producción.

© Copyright 2024. Todos los derechos reservados