Automatiser la construction d’un site statique Hugo et le déployer sur un serveur perso rien de plus simple. Avec une pipeline gitlab et rsync nous allons voir comment parvenir à ce résultat.
Création d’un utilisateur dédié
La première étape est de créer un utilisateur sur le système. Il est utilisé pour copier les fichiers générés par le build et sert spécificquement à la connection depuis Gitlab. Ses droits sont limités.
adduser gitlabci
usermod -a -G www-data gitlabci
chown -R gitlabci:www-data /var/www/mysite
Génération des clefs RSA
Une paire de clefs RSA est générées pour l’utilisateur gitlabci nouvellement créé. Cela va permettre la connection rsync depuis gitlab sur le serveur afin de copier les fichiers générés lors du build par gitlab-ci.
su gitlabci
ssh-keygen -t rsa -b 4096
cd .ssh
cp id_rsa_id.pub authorized.keys
ssh-keygen va créer deux fichiers dans le répertoire ~/.ssh/ de l’utilisateur gitlabci :
- id_rsa → valeur de la variable SSH_PRIVATE_KEY utilisée dans le fichier de configuration .gitlab-ci.yml. Celle-ci est à créer dans la configuration du dépôt gitlab dans le menu “Settings → CI/CD” onglet “Variables”.
- id_rsa.pub → est à copier dans le fichier ~/.ssh/authorized_keys de l’utilisateur gitlabci sur le serveur
Configuration Gitlab
La configuration du build et du déploiement est fait dans le fichier .gitlab-ci.yml qui est à créer à la racine du projet. Celui-ci décrit les étapes et commandes à executer par la pipeline lors d’un push sur la branche master du dépôt gitlab.
Notre fichier gitlab-ci contient deux étapes :
- build : la construction des pages statiques du site avec Hugo
- deploy : le déploiement automatique sur la serveur grâce à rsync
stages:
- build
- deploy
build:
stage: build
image: cibuilds/hugo
script:
- hugo version
- hugo -d public_html
artifacts:
paths:
- public_html
only:
- master
deploy:
stage: deploy
image: alpine:latest
before_script:
- apk update && apk add openssh-client bash rsync
- eval $(ssh-agent -s)
script:
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
- chmod 700 ~/.ssh/id_rsa
- rsync -hrvz --delete --exclude=_ -e 'ssh -p 22' public_html/ "${SSH_USER_HOST_LOCATION}"
only:
- master
Comme pour SSH_PRIVATE_KEY, la variable SSH_USER_HOST_LOCATION est à créer dans la configuration du dépôt gitlab dans le menu “Settings -> CI/CD” onglet “Variables”.
Elle indique le répertoire accueillant la copie des pages générées pendant le build sur le serveur : par exemple “gitlabci@serveur.com:/var/www/mysite/”.