Prérequis
La finalité est de déployer automatiquement notre blog via Github Action dès qu’on pousse une mise à jour sur notre repository.
Afin de déployer notre projet sur notre VPS, nous allons créér un dossier sur le VPS destiné à hébérger notre site web statique Hugo et donner les droits d’écriture à l’utilsateur courant.
sudo mkdir /var/www/html/blog
sudo chown $USER:www-data /var/www/html/blog
Apache est configuré pour que notre nom de domaine affiche le contenu du dossier /var/www/html/blog
Création du workflow
Commencons par créer le fichier qui va contenir notre scénario.
mkdir -p .github/workflows/
touch .github/workflows/build.yml
On édite le fichier build.yaml et on y rajoute le contenu suivant
name: build
on:
push:
branches:
- main
jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Update theme
# (Optional)If you have the theme added as submodule, you can pull it and use the most updated version
run: git submodule update --init --recursive
- name: Installing Homebrew and Hugo
run: |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>~/.bashrc
echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>~/.profile
echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH
source ~/.bashrc
source ~/.profile
brew --version
brew install hugo
- name: Build
run: hugo
- name: Install SSH Key
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.PRIVATE_SSH_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.KNOWN_HOSTS }}" > ~/.ssh/known_hosts
- name: Deploy
run: rsync --archive --delete --stats -e 'ssh -p 2227' 'public/' richard@${{ secrets.REMOTE_DEST }}:/var/www/html/blog
Explication du workflow
name: build
on:
push:
branches:
- main
Ici, le workflow s’éxecutera quand il y aura un push sur la branche main.
jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
Ensuite, on part sur une machine ubuntu et on y déploie les sources de notre repository
- name: Update theme
# (Optional)If you have the theme added as submodule, you can pull it and use the most updated version
run: git submodule update --init --recursive
On installe les sous-modules. Dans ce cas, cela correspond au theme PaperMod
- name: Installing Homebrew and Hugo
run: |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>~/.bashrc
echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>~/.profile
echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH
source ~/.bashrc
source ~/.profile
brew --version
brew install hugo
Dans cette étape, on télécharge le script d’installation de homebrew et on rajoute les binaires dans le PATH de notre machine. On conclut par l’installation de hugo
- name: Build
run: hugo
On lance la génération de notre site, il va créer un dossier public qui va contenir les pages générées.
- name: Install SSH Key
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.PRIVATE_SSH_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.KNOWN_HOSTS }}" > ~/.ssh/known_hosts
Dans cette partie, on crée un fichier de clé privé id_rsa avec les droits adéquats et on y copie la clé privé qu’on a généré sur notre ordinateur sachant qu’on a copié la clé publique sur le serveur qui va hébérger notre site. On renseigne le fichier know_hosts afin que l’on n’ai pas d’interactivité quand on lancera le rsync.
Les valeurs PRIVATE_SSH_KEY et KNOWN_HOSTS correspondent à des secrets qu’on a générés dans Github dans Settings\Secrets\Actions
- name: Deploy
run: rsync --archive --delete --stats -e 'ssh -p 2227' 'public/' richard@${{ secrets.REMOTE_DEST }}:/var/www/html/blog
Enfin, on synchronise le dossier public qui vient d’être généré avec le root directory apache de notre site internet.