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.
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 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 Docker
Configurer les variables d'environnement et secrets
Récupérer le nom de domaine et le mot de passe des certificats
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.
-
Dans le tableau de bord Stackhero, sélectionnez votre service Docker "production" et cliquez sur le bouton "Configurer".
Obtenir les paramètres du service -
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 service
Définir le nom de domaine et le mot de passe des certificats dans GitHub
-
Dans GitHub, ouvrez votre projet.
-
Allez dans Settings > Environments, puis cliquez sur New environment.
Configuration des environnements GitHub -
Dans le champ Name, saisissez "production" et validez.
Définir l'environnement -
Cliquez sur le bouton No restriction et choisissez Selected branches and tags.
Définir les restrictions d'environnement -
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'environnement
Définir la branche d'environnement -
Sous Environment secrets, cliquez sur Add secret.
Ajouter un secret -
Pour le secret, utilisez
STACKHERO_CERTIFICATES_PASSWORDcomme nom et collez votre mot de passe des certificats dans le champ Value.
Définir le secret du mot de passe des certificats -
Sous Environment variables, cliquez sur Add variable.
Définir les variables -
Utilisez
STACKHERO_ENDPOINTcomme 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 endpoint
Si vous avez personnalisé le nom de domaine de votre service, pensez à utiliser votre domaine personnalisé à la place de <XXXXXX>.stackhero-network.com.
Personnaliser le fichier de configuration Docker Compose
Si le fichier
docker-compose.ymlest 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
Configurer le workflow GitHub Actions
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 production
C'est tout. Votre configuration est maintenant prête pour déployer automatiquement votre code en production avec GitHub Actions.
Création de l'environnement de staging
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.
Utiliser 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 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).
- Dans 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 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"
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, 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).