Introducció

La integració contínua (CI) i el desplegament continu (CD) són pràctiques essencials en el desenvolupament de programari modern. Docker facilita aquestes pràctiques proporcionant un entorn consistent i replicable per a la construcció, prova i desplegament d'aplicacions. En aquest tema, explorarem com utilitzar Docker en un flux de treball CI/CD.

Objectius

  • Entendre els conceptes bàsics de CI/CD.
  • Aprendre a configurar un pipeline CI/CD amb Docker.
  • Integrar Docker amb eines de CI/CD com Jenkins, GitLab CI/CD i GitHub Actions.
  • Implementar bones pràctiques per a CI/CD amb Docker.

Conceptes Bàsics de CI/CD

Integració Contínua (CI)

  • Definició: La integració contínua és una pràctica de desenvolupament de programari on els desenvolupadors integren el seu codi en un repositori compartit diverses vegades al dia.
  • Objectiu: Detectar errors ràpidament i millorar la qualitat del programari.
  • Eines: Jenkins, GitLab CI, Travis CI, CircleCI, etc.

Desplegament Continu (CD)

  • Definició: El desplegament continu és una pràctica on el codi que passa totes les etapes del pipeline de CI es desplega automàticament a l'entorn de producció.
  • Objectiu: Reduir el temps de lliurament del programari i assegurar que sempre estigui en un estat desplegable.
  • Eines: Kubernetes, Docker Swarm, AWS CodeDeploy, etc.

Configurant un Pipeline CI/CD amb Docker

Pas 1: Crear un Dockerfile

El primer pas és crear un Dockerfile per a la teva aplicació. Aquest fitxer defineix com es construirà la imatge Docker de la teva aplicació.

# Exemple de Dockerfile per a una aplicació Node.js
FROM node:14

# Estableix el directori de treball
WORKDIR /app

# Copia els fitxers de l'aplicació
COPY package*.json ./

# Instal·la les dependències
RUN npm install

# Copia el codi de l'aplicació
COPY . .

# Exposa el port de l'aplicació
EXPOSE 3000

# Comanda per executar l'aplicació
CMD ["npm", "start"]

Pas 2: Configurar una eina de CI/CD

Jenkins

  1. Instal·lar Jenkins: Pots instal·lar Jenkins en un contenidor Docker.

    docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
    
  2. Configurar un Job de Jenkins:

    • Crea un nou Job de tipus "Pipeline".
    • Defineix el pipeline utilitzant un Jenkinsfile.
    pipeline {
        agent any
    
        stages {
            stage('Build') {
                steps {
                    script {
                        docker.build('my-app')
                    }
                }
            }
            stage('Test') {
                steps {
                    script {
                        docker.image('my-app').inside {
                            sh 'npm test'
                        }
                    }
                }
            }
            stage('Deploy') {
                steps {
                    script {
                        docker.image('my-app').push('my-repo/my-app:latest')
                    }
                }
            }
        }
    }
    

GitLab CI/CD

  1. Configurar .gitlab-ci.yml:

    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t my-app .
    
    test:
      stage: test
      script:
        - docker run my-app npm test
    
    deploy:
      stage: deploy
      script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - docker push $CI_REGISTRY/my-repo/my-app:latest
    

GitHub Actions

  1. Configurar workflow.yml:

    name: CI/CD Pipeline
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
    
          - name: Build Docker image
            run: docker build -t my-app .
    
          - name: Test Docker image
            run: docker run my-app npm test
    
          - name: Push Docker image
            run: |
              echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
              docker push my-app:latest
    

Bones Pràctiques per a CI/CD amb Docker

  • Utilitza imatges base lleugeres: Redueix la mida de les imatges utilitzant imatges base lleugeres com alpine.
  • Capa de caché: Aprofita la caché de Docker per accelerar la construcció d'imatges.
  • Escaneja vulnerabilitats: Utilitza eines com Trivy per escanejar vulnerabilitats en les imatges Docker.
  • Automatitza proves: Assegura't que totes les proves s'executin automàticament en el pipeline de CI/CD.
  • Desplegament segur: Implementa mecanismes de rollback per a desplegaments fallits.

Exercici Pràctic

Objectiu

Configurar un pipeline CI/CD per a una aplicació Node.js utilitzant GitHub Actions.

Passos

  1. Crea un repositori a GitHub.
  2. Afegeix un Dockerfile al repositori.
  3. Crea un fitxer workflow.yml a .github/workflows/.
  4. Defineix el pipeline CI/CD al workflow.yml.
  5. Comprova que el pipeline s'executa correctament en fer un push al repositori.

Solució

  1. Dockerfile:

    FROM node:14
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    CMD ["npm", "start"]
    
  2. workflow.yml:

    name: CI/CD Pipeline
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
    
          - name: Build Docker image
            run: docker build -t my-app .
    
          - name: Test Docker image
            run: docker run my-app npm test
    
          - name: Push Docker image
            run: |
              echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
              docker push my-app:latest
    

Conclusió

En aquest tema, hem après com configurar un pipeline CI/CD utilitzant Docker. Hem explorat com integrar Docker amb diverses eines de CI/CD i hem implementat bones pràctiques per assegurar un pipeline eficient i segur. Amb aquests coneixements, estàs preparat per automatitzar la construcció, prova i desplegament de les teves aplicacions utilitzant Docker.

© Copyright 2024. Tots els drets reservats