Credit : Illustration backtotheweb.fr
Deployer une application avec GitHub Actions
GitHub Actions en bref
Après avoir fait ça sur des dizaines de serveurs, voici ma méthode.
GitHub Actions permet d'automatiser le build, les tests et le deploiement de votre application a chaque push ou pull request. C'est gratuit pour les depots publics et inclut 2000 minutes/mois pour les depots prives.
Structure d'un workflow
Les workflows sont definis dans .github/workflows/ au format YAML :
# .github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches: [main]
workflow_dispatch: # Permet le declenchement manuel
env:
NODE_VERSION: '20'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run linter
run: npm run lint
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/monapp
git pull origin main
npm ci --production
npx prisma migrate deploy
pm2 restart monapp
Configurer les secrets
Les informations sensibles sont stockees dans Settings > Secrets and variables > Actions :
# Generez une cle SSH dediee au deploiement
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_deploy
Ajoutez ces secrets dans GitHub :
SERVER_HOST: l'IP de votre serveur IONOSSERVER_USER: le nom d'utilisateur SSHSSH_PRIVATE_KEY: le contenu de~/.ssh/github_deploy
Ajoutez la cle publique sur le serveur :
cat ~/.ssh/github_deploy.pub >> ~/.ssh/authorized_keys
Retour d'expérience : on utilise cette config sur tous nos serveurs clients.
Deploiement Docker
Pour les applications containerisees, buildez et deployez l'image :
# .github/workflows/docker-deploy.yml
name: Docker Deploy
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
monuser/monapp:latest
monuser/monapp:${{ github.sha }}
- name: Deploy on server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull monuser/monapp:latest
docker compose -f /opt/monapp/docker-compose.yml up -d
docker image prune -f
Notifications et badges
Ajoutez une notification Slack en cas d'echec :
- name: Notify on failure
if: failure()
uses: 8398a7/action-slack@v3
with:
status: failure
text: "Deploiement echoue sur ${{ github.repository }}"
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
Ajoutez un badge de statut dans votre README :

Bonnes pratiques
- Utilisez
npm ciau lieu denpm installpour des builds reproductibles - Cachez les dependances avec l'option
cachedes actions setup - Limitez les deploiements a la branche
mainavec la conditionif - Utilisez
workflow_dispatchpour pouvoir declencher manuellement - Taguez vos images Docker avec le SHA du commit pour la tracabilite
GitHub Actions transforme votre pipeline de deploiement vers votre serveur IONOS en un processus automatique et fiable.