Comment utiliser Github Workflow pour déployer son code ?
Pour la première fois, j'utilise les actions manuelles de Github (Workflows) pour déployer mon code sur un serveur distant en passant par SSH. De la configuration sur github au contenu du fichier .github/workflows/deploy.yml, je vous accompagnerai dans toutes les étapes.
Disclaimer
Comme énoncé dans le résumé de l'article, j'utilise les workflows github pour la première fois. Je ne suis donc pas un utilisateur expérimenté et aguerrit. Certains concepts sont améliorables, optimisables ou bien peuvent être faits autrement. Si vous avez du temps, vous pouvez contribuer à ce tutoriel en créant une merge request à sur le repo ci-dessous.
Lien direct vers le repo git de cet article : https://github.com/geoffreylopez/deploy-ssh-by-github-workflow/
Pré-requis
- Un repository sur github
- Accès SSH à un serveur distant
- Une paire de clé SSH publique et privée (pour la connexion sans mot de passe)
Configurer le Workflow
Nom et déclenchement de l'action
Pour cet exemple, nous allons appeler notre Workflow "Deploy". Veuillez donc créer en conséquence le fichier .github/workflows/deploy.yml (créez le répertoire ci nécessaire).
Nous allons d'abord spécifier son nom et quand est-ce que nous souhaitons que le workflow se déclenche.
1name: Deploy23on:4 push:5 tags:6 - '*'
Ces premières lignes sont plutôt simples à comprendre. Dans cet exemple, la tâche github se déclenchera à chaque nouveau tag créé et poussé dans notre repo git. Si vous voulez le déclencher à chaque push sur la branche main, voici comment vous y prendre :
1on:2 push:3 branches:4 - main
Définir une job et implémenter ses étapes
1jobs:2 deploy:3 runs-on: ubuntu-latest
Nous spécifions dans la variable runs-on la dernière version d'ubuntu.
Créons à présent nos étapes qui nous permettrons de déployer notre code à un endroit défini de notre serveur.
1jobs:2 deploy:3 ....45 steps:6 - name: Checkout code7 uses: actions/checkout@v489 - name: Install SSH key # Installer une clé privée SSH10 uses: webfactory/ssh-agent@v0.5.311 with:12 ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}1314 - name: Add server's SSH key to known_hosts15 run: ssh-keyscan -H IP_SERVER >> ~/.ssh/known_hosts1617 - name: Deploy files via SSH18 run: rsync -avz --delete app/ SSH_USER@IP_SERVER:public_html/
- Veillez à bien remplacer les variables "SSH_USER" (1 occurence) et "IP_SERVER" (2 occurences)
- Remplacez 'app/' par le chemin vers votre code cible de votre repo git
- Spécifiez bien à la place de 'public_html' le chemin sur le serveur vers lequel vous souhaitez déployer votre code
Cela est presque fonctionnel, mais si vous testez, vous aurez une erreur car nous n'avons pas encore déclarer notre variable secrète : {{ secrets.SSH_PRIVATE_KEY }}
Déclarer un secret pour notre action github
Dans les paramètres de votre repo github, vous avez un onglet "Secrets and variables". Cliquez ensuite sur "Actions".

Créez un nouveau "Environment secrets" en cliquant sur le bouton vers "New repository secret" et nommez le "SSH_PRIVATE_KEY".
En valeur, vous devez mettre votre clé privée (id_rsa) qui doit ressembler à cela :
1-----BEGIN OPENSSH PRIVATE KEY-----2VOTRE CLE PRIVEE3-----END OPENSSH PRIVATE KEY-----
Ne la communiquez à personne. Cette clé est strictement personnelle.
Votre clé publique (id_rsa.pub) doit être insérée dans le fichier .ssh/authorized_keys du serveur.
Attention, cette étape est indispensable pour que votre workflow puisse se connecter sans mot de passe et de manière automatique au serveur qui attend votre code.
Déclenchez votre workflow Github
Vous n'avez plus qu'à commit et à push sur la branche ou à créer le tag pour que votre action github se déclenche automatiquement.
Pour suivre vos actions, vous pouvez vous rendre dans l'onglet "Actions" où tous les workflows de votre repository seront présentés.
Voici la notre :

Le fichier deploy.yml complet
1name: Deploy23on:4 push:5 branches:6 - main78jobs:9 deploy:10 runs-on: ubuntu-latest11 steps:12 - name: Checkout code13 uses: actions/checkout@v41415 - name: Install SSH key # Installer une clé privée SSH16 uses: webfactory/ssh-agent@v0.5.317 with:18 ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}1920 - name: Add server's SSH key to known_hosts21 run: ssh-keyscan -H 54.37.12.207 >> ~/.ssh/known_hosts2223 - name: Deploy files via SSH24 run: rsync -avz --delete app/ preprod@54.37.12.207:tmp/
Conclusion
Vous pouvez aller plus loin dans la personnalisation de votre action en allant dans la documentation github. Par exemple, voici comment vider le cache avec drush après un déploiement d'un drupal par un workflow github :
1 - name: Clear cache2 run: ssh preprod@54.37.12.207 "cd public_html/ && ./vendor/bin/drush cache:rebuild"
Tout est absolument personnalisable !