Docker: Déployer avec GitHub Actions
Apprenez à déployer vos conteneurs Docker en utilisant 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 vous permet d'automatiser des tâches telles que le déploiement de vos conteneurs Docker sur des serveurs de production. Dans ce guide, vous apprendrez à configurer GitHub Actions de manière sécurisée et fiable pour déployer vos conteneurs Docker sur des environnements de staging et de production.
Pour cette configuration, vous maintiendrez deux branches : staging et production. Le code poussé sur chaque branche sera automatiquement déployé 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 réduire les risques et renforcer la confiance lors du déploiement en production, il est fortement recommandé d'avoir à la fois une instance de staging et de production. C'est une norme de l'industrie et une bonne pratique qui peut vous aider à éviter de nombreux problèmes potentiels.
Avant de commencer, assurez-vous d'avoir un compte GitHub avec un dépôt hébergeant votre code.
Création des services Docker
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 minimiser 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 seulement deux minutes, puis créer vos services cloud Docker en quelques clics.
Exemple de services Docker
Configurer les variables d'environnement et les secrets
Obtenez le nom de domaine et le mot de passe des certificats
Pour permettre à GitHub Actions de se connecter à votre service Docker Stackhero, vous avez besoin de deux informations : le nom de domaine de votre service et le mot de passe des certificats.
-
Dans le tableau de bord de Stackhero, sélectionnez votre service Docker "production" et cliquez sur le bouton "Configurer".
Obtenir les paramètres du service -
Copiez le "Nom de domaine" et le "Mot de passe des certificats Docker" pour les utiliser dans les étapes suivantes.
Obtenir les paramètres du service
Définir le nom de domaine et le mot de passe des certificats sur GitHub
-
Allez sur GitHub et sélectionnez votre projet.
-
Cliquez sur Settings > Environments puis sur New environment.
Configuration des environnements GitHub -
Dans le champ Name, entrez "production" et confirmez.
Définition de l'environnement -
Cliquez sur le bouton No restriction et sélectionnez Selected branches and tags.
Définition des restrictions d'environnement -
Cliquez sur Add deployment branch or tag rule, entrez "production" dans le champ Name pattern, puis cliquez sur Add rule.
Définition de la branche d'environnement
Définition de la branche d'environnement -
Sous Environment secrets, cliquez sur Add secret.
Ajouter un secret -
Pour le secret, entrez
STACKHERO_CERTIFICATES_PASSWORDcomme nom et collez votre mot de passe des certificats comme Value.
Définition du secret du mot de passe des certificats -
Sous Environment variables, cliquez sur Add variable.
Définition des variables -
Entrez
STACKHERO_ENDPOINTcomme nom et collez votre endpoint de service Docker dans le champ Value. Vous pouvez trouver cet endpoint dans votre tableau de bord Stackhero.
Définition de la variable endpoint
Si vous avez personnalisé le nom de domaine de votre service, utilisez la version personnalisée au lieu de xxxxxx.stackhero-network.com.
Personnaliser le fichier de configuration Docker Compose
Si le fichier
docker-compose.ymlest présent à la racine de votre projet et qu'aucune personnalisation n'est nécessaire, vous pouvez ignorer cette section.
Par défaut, GitHub Actions s'attend à ce que le fichier Docker Compose docker-compose.yml soit à la racine de votre projet. Si vous devez utiliser un fichier différent, vous pouvez personnaliser la commande de déploiement. Par exemple, si vous utilisez notre boilerplate de démarrage avec Node.js et Docker, vous pouvez créer une nouvelle variable d'environnement nommée STACKHERO_DEPLOY_COMMAND et la définir comme suit :
docker compose --env-file env.list --file docker/docker-compose.yml --file docker/docker-compose.production.yml up --build --remove-orphans -d
Configurer le workflow GitHub Actions
Sur votre machine locale, naviguez vers votre dépôt Git et créez un répertoire nommé .github/workflows. Dans ce répertoire, 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: Déployer la branche "${{ github.ref_name }}" sur Stackhero
on:
push:
# Ces branches déclenchent l'action de déploiement lors d'un push.
# Assurez-vous de créer un environnement correspondant au nom de la branche sur GitHub (sous Settings > Environments).
# Puis ajoutez le secret STACKHERO_CERTIFICATES_PASSWORD et la variable STACKHERO_ENDPOINT dans cet environnement.
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:
# Le secret STACKHERO_CERTIFICATES_PASSWORD et la variable STACKHERO_ENDPOINT doivent être définis dans l'environnement de branche correspondant sur GitHub.
certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
endpoint: ${{ vars.STACKHERO_ENDPOINT }}
# deployment_command est optionnel. Utilisez-le si vous devez personnaliser la commande Docker Compose.
deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
Validez vos modifications en exécutant :
git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"
Ensuite, créez une branche de production en exécutant :
git checkout -b production
Enfin, poussez votre branche de production sur GitHub :
git push --set-upstream origin production
Une fois poussée, GitHub Actions déploiera automatiquement votre code sur votre instance de production Stackhero. Vous pouvez suivre le déploiement en visitant l'onglet Actions dans votre projet GitHub.
GitHub Actions qui a déployé en production
Félicitations ! Vous pouvez maintenant déployer automatiquement votre code en production en utilisant GitHub Actions.
Création de l'environnement de staging
La configuration de l'environnement de staging est similaire à celle de la production. Répétez simplement les étapes ci-dessus, en remplaçant production par staging.
Ensuite, créez une branche de staging en exécutant :
git checkout -b staging
Poussez votre branche de staging sur GitHub avec :
git push --set-upstream origin staging
GitHub Actions déploiera automatiquement votre branche de staging sur l'instance Docker désignée pour le staging.
Utilisation des variables d'environnement dans docker-compose.yml
Vous pouvez définir des variables d'environnement dans votre projet GitHub qui seront accessibles dans votre fichier docker-compose.yml. Cela est utile si vous souhaitez déployer sur différents domaines (par exemple, staging.my-company.com pour le staging et my-company.com pour la production).
- Sur GitHub, allez dans Settings > Environments et créez une variable d'environnement nommée
WEBSITE_DOMAIN. - Pour l'environnement de staging, définissez
WEBSITE_DOMAINsur "staging.my-company.com". - Pour l'environnement de production, définissez
WEBSITE_DOMAINsur "my-company.com".
Ensuite, mettez à jour le fichier .github/workflows/deploy-to-stackhero.yml pour passer la variable WEBSITE_DOMAIN à l'Action GitHub Stackhero :
name: Deploy to Stackhero
description: Déployer la branche "${{ github.ref_name }}" sur 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 }}
Enfin, mettez à jour votre fichier docker-compose.yml pour utiliser la variable WEBSITE_DOMAIN au lieu d'un nom de domaine codé 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"
Aller plus loin
Il est conseillé de protéger les branches production et staging pour éviter les pushs directs. Avec la protection des branches activée, une pull request doit être créée pour la branche staging puis fusionnée par une personne ayant les autorisations nécessaires. Une fois validée sur la plateforme de staging, le même processus peut être suivi pour la branche production.
Cette approche permet d'assurer à la fois la sécurité (seuls les membres autorisés de l'équipe peuvent déployer sur le staging et la production) et la fiabilité (les fonctionnalités sont testées sur une plateforme de staging avant le déploiement en production).