Saltar a contenido

Documentación: Configuración de CI/CD en GitHub Actions

Esta configuración permite realizar un flujo CI/CD automatizado en GitHub Actions para construir una imagen Docker, subirla a GitHub Container Registry (GHCR) y desplegarla en un servidor remoto mediante SSH.

|__.github
    |__workflows
        |__base.yaml
name: clase_01

on: 
  push:
    branches:
      - clase

jobs:
  create-docker-image:
    runs-on: ubuntu-latest

    concurrency: 
      group: ${{ github.ref }}
      cancel-in-progress: true

    steps:
      - name: checkout code
        uses: actions/checkout@v2

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GH_TOKEN }}

      - name: Build and push ${{secrets.IMAGE}}
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest
        continue-on-error: false

  deploy:
    needs: create-docker-image
    runs-on: ubuntu-latest
    steps:
      - name: Install sshpass
        run: sudo apt-get install -y sshpass

      - name: SSH into Server
        env:
            SSHPASS: ${{ secrets.AUTH_PASS }}
        run: |
          sshpass -p '${{secrets.AUTH_PASS}}' ssh -o StrictHostKeyChecking=no ${{secrets.AUTH_SERVER}} << EOF
            docker login ghcr.io -u ${{ secrets.PROFILE }} -p ${{secrets.GH_TOKEN}}
            docker pull ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest
            docker rm -f ${{secrets.IMAGE}} 2>/dev/null
            docker run -d \
              --name ${{secrets.IMAGE}} \
              --network host \
              --cap-add=SYS_ADMIN \
              --user 0:0\
              -e PORT=${{ secrets.PORT }} \
              -e TELEGRAM_TOKEN=${{ secrets.TELEGRAM_TOKEN }} \
              --restart always \
              ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest
          EOF

Configuración Básica del Workflow

name: cicd

on: 
  push:
    branches:
      - main

Este bloque define que el flujo CI/CD se ejecutará automáticamente en la rama main al hacer push de cambios.

Jobs: Tareas Definidas

1. Job create-docker-image

Este job construye una imagen Docker y la sube a GHCR.

jobs:
  create-docker-image:
    runs-on: ubuntu-latest
    concurrency: 
      group: ${{ github.ref }}
      cancel-in-progress: true
    steps:
      - name: checkout code
        uses: actions/checkout@v2

checkout code : Clona el repositorio actual para acceder al código fuente.

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GH_TOKEN }}

Login to GitHub Container Registry : Autentica al flujo con GHCR usando el token GH_TOKEN guardado en GitHub Secrets.

      - name: Build and push ${{secrets.IMAGE}}
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest

Build and push : Construye la imagen Docker y la sube al registro de GitHub usando el nombre de la imagen y perfil definidos en los secretos IMAGE y PROFILE. Se asegura que cualquier error detenga la ejecución del flujo.

2. Job deploy

Este job se ejecuta después del éxito de create-docker-image y realiza el despliegue en el servidor remoto.

  deploy:
    needs: create-docker-image
    runs-on: ubuntu-latest
    steps:
      - name: Install sshpass
        run: sudo apt-get install -y sshpass

Install sshpass : Instala sshpass para facilitar la autenticación SSH sin requerir interacción del usuario.

      - name: SSH into Server
        env:
            SSHPASS: ${{ secrets.AUTH_PASS }}
        run: |
          sshpass -p '${{secrets.AUTH_PASS}}' ssh -o StrictHostKeyChecking=no ${{secrets.AUTH_SERVER}} << EOF
            docker login ghcr.io -u ${{ secrets.PROFILE }} -p ${{secrets.GH_TOKEN}}
            docker pull ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest
            docker rm -f ${{secrets.IMAGE}} 2>/dev/null
            docker run -d \
              --name ${{secrets.IMAGE}} \
              --network host \
              --cap-add=SYS_ADMIN \
              --user 0:0\
              -e PORT=${{ secrets.PORT }} \
              -e YOUR_ENV_KEY=${{ secrets.YOUR_ENV_VALUE }} \
              --restart always \
              ghcr.io/${{ secrets.PROFILE }}/${{secrets.IMAGE}}:latest
          EOF

SSH into Server : Este paso conecta al servidor remoto, autentica en GHCR, descarga la última versión de la imagen, elimina el contenedor anterior (si existe) y lanza un nuevo contenedor en segundo plano con las configuraciones necesarias, incluyendo variables de entorno definidas en los secretos PORT y YOUR_ENV_KEY.

Resumen

Esta configuración de GitHub Actions automatiza la construcción, el despliegue y la actualización de un contenedor Docker en un servidor remoto a partir de cambios en la rama principal, simplificando el flujo de CI/CD.