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)
Back to top

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 }} 

Back to top

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

Secrets et variables de github workflow
secrets-and-variables-github-workflow.PNG

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 top

3) 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 : 

Image
Workflow github test en statut success
Back to top

4) Le fichier deploy.yml complet

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

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 :

Back to top
Rédigé par geoffrey le