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.
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
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.