Après le passage de ce blog à jekyll, je voulais expliquer la manière dont je m'y suis pris. Il n'y a rien de compliqué, juste un gain de temps pour ceux qui voudrait le faire.

Je voulais expérimenter les générateur de site statique et les utiliser pour remplir les micros hébergements que fourni OVH avec ces domaines. J'avais déjà testé jekyll avec les pages github pour mes projets, je suis donc reparti avec pour ovh.

J'ai commencé par créer un projet jekyll fonctionnel sur ma machine. Ensuite j'y ai rajouté le fichier de pipeline pour publier jekyll sur les pages gitlab :

image: ruby:2.3 

variables:
  JEKYLL_ENV: production
  LC_ALL: C.UTF-8 

before_script: 
  - bundle install 

pages: 
  stage: deploy 
  script: 
  - bundle exec jekyll build -d public 
  artifacts: 
    paths: 
      - public 
  only: 
    - master

Cela m'a permis de vérifier que le pipeline fonctionnait correctement et de tester les gitlab pages en même temps. :) Mais mon but est de publier sur mon hébergement OVH.

Ayant vu récement que même les petits hébergements gratuits (10 mo) liés aux domaines était accessible via sftp, j'ai voulu que l'upload se fasse avec cette méthode. Par contre, le scp ne fonctionne pas seul fonctionne le sftp. Ce qui apporte un problème, car le sftp ne seais pas créer les répertoires lors des copies de fichiers multiples. J'ai donc "triché" avec un peu de bash :) .

Voici le fichier de pipeline qui en résulte :

image: ruby:2.3 

variables:
  JEKYLL_ENV: production
  LC_ALL: C.UTF-8 

before_script: 
  - chmod 755 /builds/thepozer/thepozer/.ssh
  - chmod 600 /builds/thepozer/thepozer/.ssh/ovh_deploy
  - bundle install 

ovh_deploy: 
  stage: deploy 
  script: 
  - bundle exec jekyll build -d public 
  - find public/* -type d | ( while read dir ; do echo "mkdir ${dir#public/}" ;  done ; echo "put -r public/*" ; echo "exit") | sftp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i .ssh/ovh_deploy thepozerc@ssh.cluster014.ovh.net:www/
  artifacts: 
    paths: 
      - public 
  only: 
    - master

Pour ce qui est de la création des répertoires, j'ai fait simplement un find pour qu'il me liste les répertoires, puis j'ai transmit cette liste à un petit script bash qui va convertir chacun des répertoires en un mkdir. Enfin il ajoute la commande de copie de fichier et le exit de fin. Toutes ces commandes sont transmises à la commande sftp.

Par exemple, avec la structure suivante de fichiers

.
├── 404.html
├── cv
│   └── index.html
├── edito
│   └── 2018
│       └── 07
│           └── 21
│               └── passage-a-jekyll.html
├── feed.xml
├── index.html
├── javascript
│   └── 2017
│       └── 04
│           └── 09
│               └── navez-besoin-de-jquery.html
├── mysql
│   ├── 2010
│   │   └── 10
│   │       └── 19
│   │           └── backup-all-mysql-user-from-server.html
│   └── 2017
│       └── 04
│           └── 04
│               └── decoupe-de-fichier-sql.html
└── projects
    ├── gmysqlcc
    │   ├── changelog.html
    │   └── index.html
    ├── index.html
    ├── quickpad
    │   └── index.html
    └── simpledit
        └── index.html

Il va générer la liste de commandes sftp suivante :

mkdir cv
mkdir edito
mkdir edito/2018
mkdir edito/2018/07
mkdir edito/2018/07/21
mkdir javascript
mkdir javascript/2017
mkdir javascript/2017/04
mkdir javascript/2017/04/09
mkdir mysql
mkdir mysql/2010
mkdir mysql/2010/10
mkdir mysql/2010/10/19
mkdir mysql/2017
mkdir mysql/2017/04
mkdir mysql/2017/04/04
mkdir projects
mkdir projects/gmysqlcc
mkdir projects/quickpad
mkdir projects/simpledit
put -r public/*
exit

Tous les répertoires sont créés avant la copie des fichiers. Par contre je ne supprime rien de ce qu'il y avait avant, j'écrase juste les fichiers déjà présents.

Et enfin, J'ai ajouté une clé ssh sans mot de passe dans mon dépot git privé pour le déploiement dans un répertoire .ssh à la racine. J'utilise la partie before_script pour mettre à jour les permissions pour les clés ssh.

C'est avec ce pipeline que je livre ce site sur mon hébergement mutualisé. Il peux être facilement adapté à d'autres hébergement.