Déploiement continu avec Gitlab

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 :

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 :

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/”.