Comment déployer un site Jekyll à l’aide de Git Hooks sur Ubuntu 16.04

L’auteur a sélectionné le Fonds Diversity in Tech pour recevoir un don dans le cadre du Write for DOnations programme.

introduction

Jekyll est un générateur de sites statiques qui offre certains des avantages d’un système de gestion de contenu (CMS) tout en évitant les problèmes de performances et de sécurité engendrés par ces sites pilotés par des bases de données. Il est «compatible avec les blogs» et inclut des fonctionnalités spéciales pour gérer le contenu organisé par date, bien que son utilité ne se limite pas aux sites de blogs. Jekyll convient parfaitement aux personnes qui ont besoin de travailler hors ligne, qui préfèrent les éditeurs légers aux formulaires Web pour la maintenance du contenu et qui souhaitent utiliser le contrôle de version pour suivre les modifications apportées à leur site Web.

Dans ce didacticiel, nous allons configurer un environnement de production afin qu’il utilise Nginx pour héberger un site Jekyll, ainsi que Git pour suivre les modifications et régénérer le site lorsque vous transférez les modifications dans le référentiel de site. Nous allons également installer et configurer + git-shell + pour protéger en outre votre serveur de production contre les accès non autorisés. Enfin, nous allons configurer votre ordinateur de développement local pour travailler avec et transférer les modifications dans le référentiel distant.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Étape 1 - Configurer un compte utilisateur Git

Pour des raisons de sécurité, nous allons commencer par créer un compte utilisateur qui hébergera un référentiel Git pour le site Jekyll. Cet utilisateur exécutera le script Git hooks, que nous allons créer pour régénérer le site lorsque les modifications sont reçues. La commande suivante créera un utilisateur nommé * git *:

sudo adduser git

Il vous sera demandé de saisir et de répéter un mot de passe, puis de saisir des informations de base non obligatoires sur l’utilisateur. À la fin, il vous sera demandé de confirmer les informations en tapant * Y *:

OutputAdding user `git' ...
Adding new group `git' (1001) ...
Adding new user `git' (1001) with group `git' ...
Creating home directory `/home/git' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for git
Enter the new value, or press ENTER for the default
       Full Name []:
       Room Number []:
       Work Phone []:
       Home Phone []:
       Other []:
Is the information correct? [Y/n]

Nous allons également préparer la racine Web pour contenir le site généré. Tout d’abord, supprimez la page Web par défaut du répertoire + / var / www / html:

sudo rm /var/www/html/index.nginx-debian.html

Maintenant, définissez la propriété sur le répertoire sur l’utilisateur * git *, afin que cet utilisateur puisse mettre à jour le contenu du site lorsque les modifications sont reçues, et la propriété du groupe sur le groupe + www-data +. Ce groupe garantit que les serveurs Web peuvent accéder aux fichiers situés dans `+ / var / www / html + et les gérer:

sudo chown :www-data /var/www/html

Avant de poursuivre le didacticiel, copiez votre clé SSH sur votre nouvel utilisateur * git * afin de pouvoir accéder en toute sécurité à votre serveur de production à l’aide de Git. Vous pouvez le faire en suivant https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04#step-four-%E2%80%94-add-public-key -authentication- (recommandé) [étape quatre du tutoriel Initial Server Setup avec Ubuntu 16.04]. La méthode la plus simple consiste à utiliser la commande + ssh-copy-id, mais vous pouvez également copier la clé manuellement.

Créons maintenant un référentiel Git pour votre site Jekyll, puis configurez les points d’ancrage Git pour le reconstruire à la mise à jour.

Étape 2 - Configurer un référentiel Git

Votre référentiel Git contiendra des données sur votre site Git, y compris un historique des modifications et des validations. Dans cette étape, nous allons configurer le référentiel Git sur le serveur de production avec un hook post-réception qui régénérera votre site.

Le référentiel sera situé dans le répertoire de base de l’utilisateur * git *. Par conséquent, si vous vous êtes déconnecté de ce compte utilisateur à l’étape précédente, utilisez la commande + su + pour changer de rôle:

su -

Dans le répertoire de base, créez un dossier qui contiendra votre référentiel Git. Il est nécessaire que le répertoire soit dans le répertoire personnel et nommé avec le format + .git +, afin que les commandes + git + puissent le découvrir. Habituellement, le ` devrait être le nom de votre site, ainsi `+ git +` peut facilement reconnaître les sites et les référentiels. Nous appellerons notre site `:

mkdir ~/.git

Basculez vers le répertoire et initialisez le référentiel Git à l’aide de la commande + git init +. L’indicateur + - bare + configure le référentiel pour l’hébergement sur le serveur et permet la collaboration entre plusieurs utilisateurs:

cd ~/.git
git init --bare

La sortie contient des informations sur le référentiel initialisé avec succès:

OutputInitialized empty Git repository in

Si vous ne voyez pas ce type de sortie, suivez les journaux à l’écran pour résoudre le problème avant de poursuivre le didacticiel.

Le dossier que nous avons créé contient les répertoires et les fichiers nécessaires à l’hébergement de votre référentiel. Vous pouvez vérifier son contenu en tapant ce qui suit:

ls
Outputbranches  config  description  HEAD  hooks  info  objects  refs

Si vous ne voyez pas ce type de sortie, assurez-vous d’avoir basculé dans le répertoire approprié et d’avoir exécuté avec succès + git init +.

Le répertoire * hooks * contient les scripts utilisés pour les hooks Git. Par défaut, il contient un exemple de fichier pour chaque type de hook Git afin que vous puissiez facilement commencer. Pour les besoins de ce tutoriel, nous utiliserons le hook * post-receive * pour régénérer le site une fois que le référentiel aura été mis à jour avec les dernières modifications.

Créez le fichier nommé + post-receive + dans le répertoire + hooks + et ouvrez-le dans l’éditeur de texte de votre choix:

nano ~//hooks/post-receive

Nous allons configurer le hook pour cloner les dernières modifications dans le répertoire temporaire, puis pour le régénérer et enregistrer le site généré sur + / var / www / html + afin que vous puissiez y accéder facilement.

Copiez le contenu suivant dans le fichier:

~ / sammy-blog.git / hooks / post-receive

#!/usr/bin/env bash

GIT_REPO=$HOME/.git
TMP_GIT_CLONE=/tmp/
PUBLIC_WWW=

git clone $GIT_REPO $TMP_GIT_CLONE
pushd $TMP_GIT_CLONE
bundle exec jekyll build -d $PUBLIC_WWW
popd
rm -rf $TMP_GIT_CLONE

exit

Une fois que vous avez terminé, enregistrez le fichier et fermez l’éditeur de texte.

Assurez-vous que le script est exécutable pour que l’utilisateur * git * puisse l’exécuter lorsque les modifications sont reçues:

chmod +x ~//hooks/post-receive

À ce stade, nous disposons d’un référentiel Git entièrement configuré et d’un hook Git de post-réception pour mettre à jour votre site lorsque des modifications sont reçues. Avant de transférer le site dans le référentiel, nous allons également sécuriser notre serveur de production en configurant + git-shell +, un shell interactif capable de fournir aux utilisateurs diverses commandes Git lorsqu’ils se connectent via SSH.

Étape 3 - Configuration de Git Shell pour désactiver les connexions interactives

Les utilisateurs peuvent implémenter + git-shell + des manières suivantes: en tant que shell interactif, en leur fournissant diverses commandes lorsqu’ils se connectent via SSH, ce qui leur permet de créer de nouveaux référentiels ou d’ajouter de nouvelles clés SSH, ou en tant que shell non interactif, désactiver l’accès à la console du serveur via SSH, tout en leur permettant d’utiliser les commandes + git + pour gérer les référentiels existants.

Si vous partagez la clé SSH de l’utilisateur * git * avec n’importe qui, celui-ci aura accès à une session Bash interactive via SSH. Cela représente une menace pour la sécurité, car les utilisateurs pourraient accéder à d’autres données, non liées au site. Nous allons configurer + git-shell + en tant que shell non interactif, de sorte que vous ne pouvez pas démarrer une session Bash interactive à l’aide de l’utilisateur * git *.

Assurez-vous d’être connecté en tant qu’utilisateur * git *. Si vous avez quitté la session après l’étape précédente, vous pouvez utiliser la même commande qu’avant pour vous reconnecter:

su - git

Commencez par créer un répertoire + git-shell-orders, nécessaire au bon fonctionnement de` + git-shell`:

mkdir ~/git-shell-commands

Le fichier + no-interactive-shell est utilisé pour définir le comportement si vous ne souhaitez pas autoriser l’accès interactif au shell. Ouvrez-le donc dans l’éditeur de texte de votre choix:

nano ~/git-shell-commands/no-interactive-login

Copiez le contenu suivant dans le fichier. Cela garantira que le message de bienvenue sera affiché si vous essayez de vous connecter via SSH:

~ / git-shell-orders / no-interactive-login

#!/usr/bin/env bash

printf '%s\n' "You've successfully authenticated to the server as $USER user, but interactive sessions are disabled."

exit 128

Une fois que vous avez terminé, enregistrez le fichier et fermez votre éditeur de texte.

Nous devons nous assurer que le fichier est exécutable, pour que + git-shell puisse l’exécuter:

chmod +x ~/git-shell-commands/no-interactive-login

Revenez à votre utilisateur sudo non-root afin que vous puissiez modifier les propriétés de notre utilisateur * git *. Si vous avez utilisé la commande + su + précédente, vous pouvez fermer la session en utilisant:

exit

Enfin, nous devons changer le shell pour l’utilisateur * git * en + git-shell:

sudo usermod -s $(which git-shell)

Vérifiez que vous ne pouvez pas accéder au shell interactif en exécutant SSH à partir de la machine de développement:

ssh git@

Vous devriez voir un message comme celui ci-dessous. Si ce n’est pas le cas, assurez-vous de disposer des clés SSH appropriées et suivez les étapes précédentes pour résoudre le problème avant de poursuivre le didacticiel.

OutputWelcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)
...
You've successfully authenticated to the server as git user, but interactive sessions are disabled.
Connection to  closed.

Ensuite, vous allez configurer votre ordinateur de développement local pour utiliser ce référentiel Git, puis nous transférerons votre site dans le référentiel. Enfin, nous nous assurerons que votre site est généré et que vous pouvez y accéder à partir du navigateur Web.

Étape 4 - Transférer les modifications dans le référentiel

Nous avons maintenant initialisé et configuré un référentiel Git sur le serveur de production. Sur la machine de développement, nous devons initialiser un référentiel local contenant des données sur le référentiel distant et les modifications apportées dans le référentiel local.

Sur votre machine de développement, accédez au répertoire contenant le site:

cd ~/www

Nous devons initialiser un référentiel Git dans le répertoire racine du site afin de pouvoir transférer du contenu dans le référentiel distant:

git init

La sortie contient un message sur l’initialisation réussie du référentiel:

OutputInitialized empty Git repository in

Si vous ne voyez pas ce type de sortie, suivez les messages à l’écran pour résoudre le problème avant de continuer.

Créez maintenant un objet distant, qui représente l’objet Git utilisé pour le suivi des référentiels distants et des branches sur lesquelles vous travaillez. Habituellement, la télécommande par défaut s’appelle * origine *, nous l’utiliserons donc pour les besoins de ce tutoriel.

La commande suivante créera une télécommande * origin *, qui suivra le référentiel * sammy-blog * sur le serveur de production à l’aide de l’utilisateur * git *:

git remote add origin git@:.git

Aucune sortie indique une opération réussie. Si vous voyez un message d’erreur, assurez-vous de le résoudre avant de passer à l’étape suivante.

Chaque fois que vous souhaitez appliquer des modifications au référentiel distant, vous devez les valider, puis les envoyer dans le référentiel distant. Une fois que le référentiel distant a reçu la validation, votre site sera régénéré avec les dernières modifications en place.

Les commits sont utilisés pour suivre les modifications que vous apportez. Ils contiennent un message de validation utilisé pour décrire les modifications apportées à cette validation. Il est recommandé de garder des messages courts mais concis, y compris des détails sur les modifications les plus importantes apportées au commit.

Avant de valider des modifications, nous devons choisir les fichiers à valider. La commande suivante marque tous les fichiers pour validation:

git add .

Aucune sortie indique une exécution réussie de la commande. Si vous voyez des erreurs, assurez-vous de les résoudre avant de continuer.

Ensuite, validez toutes les modifications à l’aide de l’indicateur + -m +, qui inclura le message de validation. Comme il s’agit de notre premier commit, nous l’appellerons * “Initial commit” *:

git commit -m "Initial commit."

La sortie contient une liste de répertoires et de fichiers modifiés dans cette validation:

Commit output 10 files changed, 212 insertions(+)
create mode 100644 .gitignore
create mode 100644 404.html
create mode 100644 Gemfile
create mode 100644 Gemfile.lock
create mode 100644 _config.yml
create mode 100644 _posts/2017-09-04-link-test.md
create mode 100644 about.md
create mode 100644 assets/postcard.jpg
create mode 100644 contact.md
create mode 100644 index.md

Si vous voyez des erreurs, assurez-vous de les résoudre avant de poursuivre le didacticiel.

Enfin, utilisez la commande suivante pour appliquer les modifications validées au référentiel distant:

git push origin master

La sortie contiendra des informations sur la progression de la poussée. Une fois terminé, vous verrez des informations telles que:

Push outputCounting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/sammy-blog'...
remote: done.
remote: /tmp/sammy-blog ~/sammy-blog.git
remote: Configuration file: /tmp/sammy-blog/_config.yml
remote:             Source: /tmp/sammy-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/sammy-blog.git
To [email protected]:sammy-blog.git
* [new branch]      master -> master

Si vous ne le faites pas, suivez les journaux à l’écran pour résoudre le problème avant de poursuivre le didacticiel.

À ce stade, votre site est chargé sur le serveur et, après une courte période, il est régénéré. Naviguez dans votre navigateur Web jusqu’à + http: // +. Vous devriez voir votre site opérationnel. Si vous ne le faites pas, suivez les étapes précédentes pour vous assurer d’avoir tout fait comme prévu.

Afin de régénérer votre site lorsque vous modifiez quelque chose, vous devez ajouter des fichiers à la validation, les valider, puis transmettre les modifications, comme vous l’avez fait pour la validation initiale.

Une fois que vous avez modifié vos fichiers, utilisez les commandes suivantes pour ajouter tous les fichiers modifiés à la validation. Si vous avez créé de nouveaux fichiers, vous devrez également les ajouter avec + git add +, comme nous l’avons fait avec la validation initiale. Lorsque vous êtes prêt à valider vos fichiers, vous souhaitez inclure un autre message de validation décrivant vos modifications. Nous appellerons notre message * "fichiers mis à jour" *:

git commit -am "updated files"

Enfin, envoyez les modifications au référentiel distant.

git push origin master

La sortie ressemblera à ce que vous avez vu avec votre poussée initiale:

Push outputCounting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/sammy-blog'...
remote: done.
remote: /tmp/sammy-blog ~/sammy-blog.git
remote: Configuration file: /tmp/sammy-blog/_config.yml
remote:             Source: /tmp/sammy-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/sammy-blog.git
To [email protected]:sammy-blog.git
* [new branch]      master -> master

À ce stade, votre site est fraîchement généré et les dernières modifications sont à la place.

Conclusion

Dans ce tutoriel, vous avez appris à déployer votre site Web après avoir transféré des modifications dans votre référentiel Git. Si vous souhaitez en savoir plus sur Git, consultez notre série de tutoriels Git.

Et si vous souhaitez en savoir plus sur les autres points d’ancrage Git, vous pouvez consulter la page https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment -tasks [Comment utiliser les crochets Git pour automatiser les tâches de développement et de déploiement].