Premiers pas avec jekyll

jekyll est un générateur de site Web statique, en Anglais « static site generator » ou SSG, qui permet de créer très rapidement un site à partir d’un contenu en Markdown ou en HTML.

Le fait qu’il soit le SSG utilisé par les pages GitHub le rend encore plus populaire, car cela permet de mettre en ligne un site en quelques minutes seulement, avec la possibilité éventuelle d’utiliser son propre nom de domaine.

1. Installer Jekyll

Pour installer Jekyll sur Debian ou Ubuntu, on commence par installer les dépendances nécessaires:

$ sudo apt-get install build-essential zlib1g-dev

Le paquet build-essential installe notamment gcc et make.

Puis on installe Ruby:

$ sudo apt-get install ruby-full

On configure le répertoire d’installation des paquets Ruby:

echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Et enfin on installe Jekyll:

$ gem install bundler jekyll

Ce qui prend un peu de temps.

On a alors les commandes bundle et jekyll dans le PATH.

2. Premier site avec Jekyll

On a commencer par créer un nouveau répertoire et se placer dedans:

$ mkdir jekyll_site
$ cd jekyll_site/

Ensuite on va créer un Gemfile, qui est en quelque sorte l’équivalent d’un Makefile pour Ruby.

On obtient le résultat suivant:

vagrant@ubuntu-focal:~/jekyll_site$ bundle init
Writing new Gemfile to /home/vagrant/jekyll_site/Gemfile
vagrant@ubuntu-focal:~/jekyll_site$ cat Gemfile 
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

Dans ce Gemfile, on va ajouter le contenu suivant:

gem "jekyll"

Puis lancer la commande:

$ bundle install

ou plus simplement:

$ bundle

Cela aura pour effet de créer un fichier Gemfile.lock avec toutes les caractéristiques des dépendances de notre projet ainsi que de leurs versions. Cela rappelle évidemment le fichier package-lock.json de npm.

Maintenant, on va ajouter un fichier index.html dans notre répertoire:

$ cat index.html 
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Home</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>

Et on va démarrer le serveur jekyll:

$ bundle exec jekyll serve --host 0.0.0.0
Configuration file: none
            Source: /home/vagrant/jekyll_site
       Destination: /home/vagrant/jekyll_site/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 0.01 seconds.
 Auto-regeneration: enabled for '/home/vagrant/jekyll_site'
    Server address: http://0.0.0.0:4000
  Server running... press ctrl-c to stop.

On utilise pour cela la commande bundle pour que la version de jekyll utilisée ainsi que celle des dépendances soient bien celles décrites dans les fichiers Gemfile et Gemfile.lock et ne dépendent pas de l’environnement de la machine.

Voilà, le serveur sert notre page HTML !

J’utilise ici --host 0.0.0.0 pour que le site jekyll soit accessible en dehors de la machine virtuelle sur laquelle je travaille. Sur une machine locale, ce n’est pas nécessaire.

Un paramètre très utile lorsqu’on démarre jekyll est --livereload afin de pouvoir éditer vos pages HTML et Markdown et de voir instantanément le résultat.

Attention: --livereload ne prend pas en compte un changement dans le fichier _config.yml.

3. Utiliser liquid et Front Matter

liquid est un langage de template développé par Shopify et rendu opensource par la suite.

Il permet notamment de définir des variables dans les pages, d’ajouter de la logique: if, for, case … et d’utiliser des filtres, par exemple mettre un texte en majuscule.

La définition des variables se fait avec une entête YAML en début de page, par exemple:

---
title: Home
number: 1
---

qui se nomme entête Front Matter.

Cette entête signale à jekyll qu’il doit parser les éventuelles syntaxes liquid dans les pages:

$ cat index.html 
---
title: Home
number: 1
---

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{{page.title}}</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <p>The page number is: {{page.number}}</p>
    <p>The page URL is: {{page.url}}</p>
  </body>
</html>

L’accès aux variables de la page se fait via la syntaxe {{page.variable}}.

Vous noterez que j’ai défini la variable number mais que la variable url est prédéfinie.

Il y en a d’autres comme:

  • {{page.title}}
  • {{page.content}}
  • {{page.excerpt}}

On peut aussi utiliser les variables au niveau du site, certaines sont prédéfinies comme:

  • {{site.url}}
  • {{site.time}}

Pour en définir d’autres, on devra le faire dans le fichier _config.yml du site Jekyll.

Plus de détails sur les variables avec Jekyll sur la page correspondante de la documentation.

Le résultat de notre page est le suivant:

Hello World!

The page number is: 1

The page URL is: /

4. Les layouts et inclusions

Les « layouts » sont des templates de pages qui permettent de mettre en commun une partie du contenu des pages, comme par exemple les liens vers les réseaux sociaux en bas de page, de telle sorte que le contenu des pages HTML s’en trouve allégé:

$ cat index.html
---
layout: default
title: Home
---
<h1>Hello World!</h1>

Le layout correspondant étant:

$ cat _layouts/default.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{{ page.title }}</title>
  </head>
  <body>
    {{ content }}
  </body>
</html>

Dans la page finale, le {{ content }} étant remplacé par:

<h1>Hello World!</h1>

Toujours afin de mettre en commun certaines parties de nos pages, on peut aussi utiliser le mot clé include du langage de template liquid.

On peut donc modifier le layout précédent:

$ cat _layouts/default.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{{ page.title }}</title>
  </head>
  <body>
    {% include navigation.html %}
    {{ content }}
  </body>
</html>

Avec:

$ cat _includes/navigation.html
<nav>
  <a href="/">Home</a>
  <a href="/about.html">About</a>
</nav>

pour inclure des liens de navigation sur chaque page.

5. La suite: Fichiers de données, thèmes, GitHub Pages …

Dans ce billet, nous avons vu comment installer jekyll, quelques notions concernant l’écosystème Ruby ainsi que les bases de l’utilisation de jekyll.

Il nous reste encore à découvrir de nombreux concepts de Jekyll comme les fichiers de données, intégrer des billets de blog ou la possibilité d’utiliser des thèmes et/ou des plugins ainsi que de publier notre site avec les pages GitHub.

D’autres billets seront donc à suivre !