WebAtypique
Devops··2 min de lecture

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.

GL
Geoffrey LopezDéveloppeur Fullstack · Laravel & React
PartagerXin

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.

YAML
1name: Deploy
2
3on:
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 : 

YAML
1on:
2 push:
3 branches:
4 - main

Définir une job et implémenter ses étapes

YAML
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.

YAML
1jobs:
2 deploy:
3 ....
4
5 steps:
6 - name: Checkout code
7 uses: actions/checkout@v4
8
9 - name: Install SSH key # Installer une clé privée SSH
10 uses: webfactory/ssh-agent@v0.5.3
11 with:
12 ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
13
14 - name: Add server's SSH key to known_hosts
15 run: ssh-keyscan -H IP_SERVER >> ~/.ssh/known_hosts
16
17 - name: Deploy files via SSH
18 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".

Secrets et variables de github workflow

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 : 

Texte brut
1-----BEGIN OPENSSH PRIVATE KEY-----
2VOTRE CLE PRIVEE
3-----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 : 

Github Workflow Success

Le fichier deploy.yml complet

https://github.com/geoffreylopez/deploy-ssh-by-github-workflow/blob/main/.github/workflows/deploy.yml

YAML
1name: Deploy
2
3on:
4 push:
5 branches:
6 - main
7
8jobs:
9 deploy:
10 runs-on: ubuntu-latest
11 steps:
12 - name: Checkout code
13 uses: actions/checkout@v4
14
15 - name: Install SSH key # Installer une clé privée SSH
16 uses: webfactory/ssh-agent@v0.5.3
17 with:
18 ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
19
20 - name: Add server's SSH key to known_hosts
21 run: ssh-keyscan -H 54.37.12.207 >> ~/.ssh/known_hosts
22
23 - name: Deploy files via SSH
24 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 :

YAML
1 - name: Clear cache
2 run: ssh preprod@54.37.12.207 "cd public_html/ && ./vendor/bin/drush cache:rebuild"

Tout est absolument personnalisable !