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)
1) Configurer le Workflow
1.1) 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.
name: Deploy
on:
push:
tags:
- '*'
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 :
on:
push:
branches:
- main
1.2) Définir une job et implémenter ses étapes
jobs:
deploy:
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.
jobs:
deploy:
....
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install SSH key # Installer une clé privée SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add server's SSH key to known_hosts
run: ssh-keyscan -H IP_SERVER >> ~/.ssh/known_hosts
- name: Deploy files via SSH
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 }}
2) 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 :
-----BEGIN OPENSSH PRIVATE KEY-----
VOTRE CLE PRIVEE
-----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.
Back to top3) 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 :
4) Le fichier deploy.yml complet
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install SSH key # Installer une clé privée SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add server's SSH key to known_hosts
run: ssh-keyscan -H 54.37.12.207 >> ~/.ssh/known_hosts
- name: Deploy files via SSH
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 :
- name: Clear cache
run: ssh preprod@54.37.12.207 "cd public_html/ && ./vendor/bin/drush cache:rebuild"
Tout est absolument personnalisable !
Source :
- Repo git du tutoriel : https://github.com/geoffreylopez/deploy-ssh-by-github-workflow/
- Documentation officielle : https://docs.github.com/fr/actions/quickstart