Docker: Desplegar con GitHub Actions

Aprenda a desplegar sus contenedores Docker utilizando GitHub Actions

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero ofrece una solución Docker cloud CaaS (Containers as a Service) lista para usar que proporciona una serie de beneficios, incluyendo:

  • Despliega fácilmente tus contenedores en producción con solo un docker-compose up.
  • Nombre de dominio personalizable asegurado con HTTPS (por ejemplo, https://api.tu-empresa.com, https://www.tu-empresa.com, https://backoffice.tu-empresa.com).
  • Rendimiento óptimo y seguridad robusta gracias a una VM privada y dedicada.
  • Actualizaciones sin esfuerzo con solo un clic.

Ahorra tiempo y simplifica tu vida: ¡solo toma 5 minutos probar la solución de alojamiento en la nube Docker CaaS de Stackhero y desplegar tus contenedores en producción!

GitHub Actions le permite automatizar tareas como el despliegue de sus contenedores Docker en servidores de producción. En esta guía, aprenderá a configurar GitHub Actions de manera segura y confiable para desplegar sus contenedores Docker en entornos de staging y producción.

Para esta configuración, mantendrá dos ramas: staging y production. El código enviado a cada rama se desplegará automáticamente en la instancia correspondiente de Stackhero.

Tener una instancia de staging no es obligatorio. Puede seguir esta guía utilizando solo una instancia de producción. Sin embargo, para reducir riesgos y aumentar la confianza al desplegar en producción, se recomienda encarecidamente tener tanto una instancia de staging como de producción. Esto es un estándar de la industria y una buena práctica que puede ayudarle a evitar muchos problemas potenciales.

Antes de comenzar, asegúrese de tener una cuenta de GitHub con un repositorio que aloje su código.

Comience iniciando sesión en su panel de control de Stackhero y creando dos servicios Stackhero: uno para staging y otro para producción. Para minimizar errores, puede renombrar estos servicios a "Staging" y "Production".

¿Aún no tiene una cuenta de Stackhero? Puede crear una de forma gratuita en solo dos minutos y luego crear sus servicios en la nube Docker con solo unos clics.

Ejemplo de servicios DockerEjemplo de servicios Docker

Para permitir que GitHub Actions se conecte a su servicio Docker de Stackhero, necesita dos piezas de información: el nombre de dominio de su servicio y la contraseña de los certificados.

  1. En el panel de control de Stackhero, seleccione su servicio Docker "production" y haga clic en el botón "Configure".

    Obtener configuraciones del servicioObtener configuraciones del servicio

  2. Copie el "Domain name" y la "Docker certificates password" para usarlos en los siguientes pasos.

    Obtener configuraciones del servicioObtener configuraciones del servicio

  1. Vaya a GitHub y seleccione su proyecto.

  2. Haga clic en Settings > Environments y luego en New environment.

    Configuración de entornos de GitHubConfiguración de entornos de GitHub

  3. En el campo Name, ingrese "production" y confirme.

    Configuración del entornoConfiguración del entorno

  4. Haga clic en el botón No restriction y seleccione Selected branches and tags.

    Configuración de restricciones de entornoConfiguración de restricciones de entorno

  5. Haga clic en Add deployment branch or tag rule, ingrese "production" en el campo Name pattern, y luego haga clic en Add rule.

    Configuración de la rama de entornoConfiguración de la rama de entorno Configuración de la rama de entornoConfiguración de la rama de entorno

  6. Bajo Environment secrets, haga clic en Add secret.

    Agregar secretoAgregar secreto

  7. Para el secreto, ingrese STACKHERO_CERTIFICATES_PASSWORD como nombre y pegue su contraseña de certificados como Value.

    Configuración del secreto de la contraseña de los certificadosConfiguración del secreto de la contraseña de los certificados

  8. Bajo Environment variables, haga clic en Add variable.

    Configuración de variablesConfiguración de variables

  9. Ingrese STACKHERO_ENDPOINT como nombre y pegue su endpoint de servicio Docker en el campo Value. Puede encontrar este endpoint en su panel de control de Stackhero.

    Configuración de la variable endpointConfiguración de la variable endpoint

Si ha personalizado el nombre de dominio de su servicio, use la versión personalizada en lugar de xxxxxx.stackhero-network.com.

Si el archivo docker-compose.yml está presente en la raíz de su proyecto y no se necesitan personalizaciones, puede ignorar esta sección.

Por defecto, GitHub Actions espera que el archivo Docker Compose docker-compose.yml esté en la raíz de su proyecto. Si necesita usar un archivo diferente, puede personalizar el comando de despliegue. Por ejemplo, si utiliza nuestro boilerplate de inicio con Node.js y Docker, puede crear una nueva variable de entorno llamada STACKHERO_DEPLOY_COMMAND y configurarla como sigue:

docker compose --env-file env.list --file docker/docker-compose.yml --file docker/docker-compose.production.yml up --build --remove-orphans -d

En su máquina local, navegue a su repositorio Git y cree un directorio llamado .github/workflows. En este directorio, cree un archivo llamado deploy-to-stackhero.yml con el siguiente contenido:

# File: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
description: Desplegar la rama "${{ github.ref_name }}" en Stackhero

on:
  push:
    # Estas ramas activan la acción de despliegue al hacer push.
    # Asegúrese de crear un entorno correspondiente al nombre de la rama en GitHub (bajo Settings > Environments).
    # Luego agregue el secreto STACKHERO_CERTIFICATES_PASSWORD y la variable STACKHERO_ENDPOINT en ese entorno.
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        # El secreto STACKHERO_CERTIFICATES_PASSWORD y la variable STACKHERO_ENDPOINT deben estar definidos en el entorno de rama correspondiente en GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command es opcional. Úselo si necesita personalizar el comando Docker Compose.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Confirme sus cambios ejecutando:

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

A continuación, cree una rama de producción ejecutando:

git checkout -b production

Finalmente, envíe su rama de producción a GitHub:

git push --set-upstream origin production

Una vez enviada, GitHub Actions desplegará automáticamente su código en su instancia de producción de Stackhero. Puede monitorear el despliegue visitando la pestaña Actions en su proyecto de GitHub.

GitHub Actions que desplegó en producciónGitHub Actions que desplegó en producción

¡Felicidades! Ahora puede desplegar su código en producción automáticamente utilizando GitHub Actions.

La configuración del entorno de staging es similar a la de producción. Simplemente repita los pasos anteriores, reemplazando production por staging.

Luego, cree una rama de staging ejecutando:

git checkout -b staging

Envíe su rama de staging a GitHub con:

git push --set-upstream origin staging

GitHub Actions desplegará automáticamente su rama de staging en la instancia Docker designada para staging.

Puede definir variables de entorno en su proyecto de GitHub que serán accesibles dentro de su archivo docker-compose.yml. Esto es útil si desea desplegar en diferentes dominios (por ejemplo, staging.my-company.com para staging y my-company.com para producción).

  1. En GitHub, vaya a Settings > Environments y cree una variable de entorno llamada WEBSITE_DOMAIN.
  2. Para el entorno de staging, establezca WEBSITE_DOMAIN en "staging.my-company.com".
  3. Para el entorno de producción, establezca WEBSITE_DOMAIN en "my-company.com".

Luego, actualice el archivo .github/workflows/deploy-to-stackhero.yml para pasar la variable WEBSITE_DOMAIN a la Acción de GitHub Stackhero:

name: Deploy to Stackhero
description: Desplegar la rama "${{ github.ref_name }}" en Stackhero

on:
  push:
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
      env:
        WEBSITE_DOMAIN: ${{ vars.WEBSITE_DOMAIN }}

Finalmente, actualice su archivo docker-compose.yml para usar la variable WEBSITE_DOMAIN en lugar de un nombre de dominio codificado:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Usa la variable de entorno WEBSITE_DOMAIN como nombre de dominio.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Es una buena práctica proteger las ramas production y staging para evitar envíos directos. Con la protección de ramas activada, se debe crear una pull request para la rama staging y luego fusionarla por alguien con los permisos necesarios. Una vez validada en la plataforma de staging, se puede seguir el mismo proceso para la rama production.

Este enfoque ayuda a garantizar tanto la seguridad (solo los miembros autorizados del equipo pueden desplegar en staging y producción) como la fiabilidad (las características se prueban en una plataforma de staging antes del despliegue en producción).