Docker: Deployer avec GitHub Actions

Découvrez comment déployer vos conteneurs Docker avec GitHub Actions

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Docker cloud CaaS (Containers as a Service) prête à l'emploi offrant de nombreux avantages, notamment :

  • Déployez facilement vos containers en production avec un simple docker-compose up.
  • Nom de domaine personnalisable sécurisé avec HTTPS (par exemple, https://api.votre-entreprise.com, https://www.votre-entreprise.com, https://backoffice.votre-entreprise.com).
  • Performance optimale et sécurité robuste grâce à une VM privée et dédiée.
  • Mises à jour simplifiées en un clic.

Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution d'hébergement cloud Docker CaaS de Stackhero et déployer vos containers en production !

GitHub Actions facilite l'automatisation des tâches comme le déploiement de vos conteneurs Docker sur vos serveurs de production. Dans ce guide, vous allez découvrir comment configurer GitHub Actions de manière sécurisée et fiable pour déployer vos conteneurs Docker sur vos environnements de staging et de production.

Pour cette configuration, vous allez maintenir deux branches : staging et production. À chaque fois que vous poussez du code sur l'une de ces branches, le déploiement sera automatiquement effectué sur l'instance Stackhero correspondante.

Avoir une instance de staging n'est pas obligatoire. Vous pouvez suivre ce guide en utilisant uniquement une instance de production. Cependant, pour limiter les risques et déployer en toute confiance en production, il est fortement recommandé de disposer à la fois d'une instance de staging et d'une instance de production. Il s'agit d'une pratique standard dans l'industrie et d'une bonne pratique qui permet d'éviter de nombreux problèmes potentiels.

Avant de commencer, assurez-vous de disposer d'un compte GitHub et d'un repository hébergeant votre code.

Commencez par vous connecter à votre tableau de bord Stackhero et créez deux services Stackhero, un pour le staging et un pour la production. Pour mieux vous organiser et limiter les erreurs, vous pouvez renommer ces services en "Staging" et "Production".

Vous n'avez pas encore de compte Stackhero ? Vous pouvez en créer un gratuitement en deux minutes, puis déployer vos services Docker cloud en quelques clics seulement.

Exemple de services DockerExemple de services Docker

Pour permettre à GitHub Actions de se connecter à votre service Docker Stackhero, vous aurez besoin de deux informations : le nom de domaine de votre service et le mot de passe des certificats.

  1. Dans le tableau de bord Stackhero, sélectionnez votre service Docker "production" et cliquez sur le bouton "Configurer".

    Obtenir les paramètres du serviceObtenir les paramètres du service

  2. Copiez le "Nom de domaine" ainsi que le "Mot de passe des certificats Docker" pour les utiliser dans les étapes suivantes.

    Obtenir les paramètres du serviceObtenir les paramètres du service

  1. Dans GitHub, ouvrez votre projet.

  2. Allez dans Settings > Environments, puis cliquez sur New environment.

    Configuration des environnements GitHubConfiguration des environnements GitHub

  3. Dans le champ Name, saisissez "production" et validez.

    Définir l'environnementDéfinir l'environnement

  4. Cliquez sur le bouton No restriction et choisissez Selected branches and tags.

    Définir les restrictions d'environnementDéfinir les restrictions d'environnement

  5. Cliquez sur Add deployment branch or tag rule, saisissez "production" dans le champ Name pattern, puis cliquez sur Add rule.

    Définir la branche d'environnementDéfinir la branche d'environnement Définir la branche d'environnementDéfinir la branche d'environnement

  6. Sous Environment secrets, cliquez sur Add secret.

    Ajouter un secretAjouter un secret

  7. Pour le secret, utilisez STACKHERO_CERTIFICATES_PASSWORD comme nom et collez votre mot de passe des certificats dans le champ Value.

    Définir le secret du mot de passe des certificatsDéfinir le secret du mot de passe des certificats

  8. Sous Environment variables, cliquez sur Add variable.

    Définir les variablesDéfinir les variables

  9. Utilisez STACKHERO_ENDPOINT comme nom et collez l'endpoint de votre service Docker dans le champ Value. Vous trouverez cet endpoint dans votre tableau de bord Stackhero.

    Définir la variable endpointDéfinir la variable endpoint

Si vous avez personnalisé le nom de domaine de votre service, pensez à utiliser votre domaine personnalisé à la place de <XXXXXX>.stackhero-network.com.

Si le fichier docker-compose.yml est déjà à la racine de votre projet et que vous n'avez pas besoin de le personnaliser, vous pouvez passer cette section.

Par défaut, GitHub Actions recherche le fichier docker-compose.yml à la racine de votre projet. Si vous souhaitez utiliser un autre fichier ou une configuration différente, vous pouvez adapter la commande de déploiement. Par exemple, si vous utilisez notre boilerplate Node.js et Docker pour démarrer, vous pouvez créer une nouvelle variable d'environnement appelée STACKHERO_DEPLOY_COMMAND et la définir ainsi :

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

Sur votre machine locale, placez-vous dans votre dépôt Git et créez un dossier nommé .github/workflows. Dans ce dossier, créez un fichier nommé deploy-to-stackhero.yml avec le contenu suivant :

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

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # These branches trigger the deploy action on push.
    # Be sure to create an environment matching the branch name in GitHub (under Settings > Environments).
    # Then add the secret STACKHERO_CERTIFICATES_PASSWORD and variable STACKHERO_ENDPOINT in that environment.
    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:
        # The secret STACKHERO_CERTIFICATES_PASSWORD and the variable STACKHERO_ENDPOINT should be defined in the corresponding branch environment on GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command is optional. You can use it if you need to customize the Docker Compose command.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Vous pouvez valider vos modifications avec :

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

Pour créer une branche production, exécutez :

git checkout -b production

Puis poussez votre branche production sur GitHub :

git push --set-upstream origin production

Une fois votre code poussé, GitHub Actions le déploiera automatiquement sur votre instance Stackhero de production. Vous pouvez suivre la progression du déploiement dans l'onglet Actions de votre projet GitHub.

GitHub Actions ayant déployé en productionGitHub Actions ayant déployé en production

C'est tout. Votre configuration est maintenant prête pour déployer automatiquement votre code en production avec GitHub Actions.

La mise en place de l'environnement de staging suit les mêmes étapes que pour la production. Il suffit de répéter le processus en utilisant staging à la place de production.

Ensuite, créez une branche staging en exécutant :

git checkout -b staging

Et poussez votre branche staging sur GitHub :

git push --set-upstream origin staging

Après cela, GitHub Actions déploiera automatiquement votre branche staging sur l'instance Docker dédiée au staging.

Vous pouvez définir des variables d'environnement dans votre projet GitHub qui seront accessibles dans votre fichier docker-compose.yml. Cela est très utile si vous souhaitez déployer sur des domaines différents (par exemple, staging.my-company.com pour le staging et my-company.com pour la production).

  1. Dans GitHub, allez dans Settings > Environments et créez une variable d'environnement nommée WEBSITE_DOMAIN.
  2. Pour l'environnement de staging, définissez WEBSITE_DOMAIN sur "staging.my-company.com".
  3. Pour l'environnement de production, définissez WEBSITE_DOMAIN sur "my-company.com".

Ensuite, mettez à jour votre fichier .github/workflows/deploy-to-stackhero.yml pour transmettre la variable WEBSITE_DOMAIN à l'action GitHub Stackhero :

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to 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 }}

Mettez ensuite à jour votre fichier docker-compose.yml pour utiliser la variable WEBSITE_DOMAIN à la place d'un nom de domaine en dur :

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Utilise la variable d'environnement WEBSITE_DOMAIN comme nom de domaine.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Il est conseillé de protéger les branches production et staging pour éviter les pushs directs. Avec la protection des branches activée, les modifications passent par des pull requests, qui doivent être relues et fusionnées par une personne disposant des droits nécessaires. Cela permet de valider les fonctionnalités sur la plateforme de staging avant de les promouvoir en production après validation.

En suivant ce workflow, vous garantissez à la fois la sécurité (seuls les membres autorisés de l'équipe peuvent déployer sur les environnements de staging et de production) et la fiabilité (en testant les nouvelles fonctionnalités sur une plateforme de staging avant leur mise en production).