So stellen Sie eine Jekyll-Site mit Git-Hooks unter Ubuntu 16.04 bereit

Der Autor hat Diversity in Tech Fund ausgewählt, um eine Spende als Teil des Write for DOnations zu erhalten Programm.

Einführung

Jekyll ist ein statischer Site-Generator, der einige der Vorteile eines Content Management Systems (CMS) bietet und gleichzeitig die Leistungs- und Sicherheitsprobleme vermeidet, die durch solche datenbankgesteuerten Sites verursacht werden. Es ist "Blog-fähig" und enthält spezielle Funktionen für den Umgang mit datumsorganisierten Inhalten, obwohl seine Nützlichkeit nicht auf Blogging-Sites beschränkt ist. Jekyll eignet sich besonders für Personen, die offline arbeiten, für die Inhaltspflege leichtgewichtige Editoren gegenüber Webformularen bevorzugen und die Versionskontrolle verwenden möchten, um Änderungen an ihrer Website nachzuverfolgen.

In diesem Tutorial konfigurieren wir eine Produktionsumgebung, in der Nginx zum Hosten einer Jekyll-Site verwendet wird, und Git, um Änderungen zu verfolgen und die Site neu zu generieren, wenn Sie Änderungen in das Site-Repository übertragen. Außerdem installieren und konfigurieren wir "+ git-shell +", um Ihren Produktionsserver zusätzlich vor unbefugtem Zugriff zu schützen. Schließlich konfigurieren wir Ihren lokalen Entwicklungscomputer für die Arbeit mit und übertragen Änderungen in das Remote-Repository.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Einrichten eines Git-Benutzerkontos

Aus Sicherheitsgründen erstellen wir zunächst ein Benutzerkonto, das ein Git-Repository für die Jekyll-Site hostet. Dieser Benutzer führt das Git-Hooks-Skript aus, das wir erstellen, um die Site bei Änderungen neu zu generieren. Mit dem folgenden Befehl wird ein Benutzer mit dem Namen * git * erstellt:

sudo adduser git

Sie werden aufgefordert, ein Kennwort einzugeben und zu wiederholen und anschließend nicht obligatorische Basisinformationen über den Benutzer einzugeben. Am Ende werden Sie aufgefordert, die Informationen durch Eingabe von * J * zu bestätigen:

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]

Wir bereiten auch das Web-Stammverzeichnis für die Speicherung der generierten Site vor. Entfernen Sie zunächst die Standardwebseite aus dem Verzeichnis "+ / var / www / html":

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

Setzen Sie nun den Eigentümer des Verzeichnisses auf den Benutzer "* git *", damit dieser Benutzer den Inhalt der Site aktualisieren kann, wenn Änderungen empfangen werden, und den Gruppeneigentum für die Gruppe "+ www-data ". Diese Gruppe stellt sicher, dass Webserver auf die Dateien zugreifen und diese verwalten können, die sich in ` / var / www / html +` befinden:

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

Bevor Sie mit dem Tutorial fortfahren, kopieren Sie Ihren SSH-Schlüssel auf Ihren neu erstellten * git * -Benutzer, damit Sie mit Git sicher auf Ihren Produktionsserver zugreifen können. Sie können dies tun, indem Sie https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04#step-four-%E2%80%94-add-public-key folgen -authentication- (empfohlen) [Schritt 4 des ersten Server-Setups mit Ubuntu 16.04 Tutorial]. Die einfachste Methode ist die Verwendung des Befehls "+ ssh-copy-id +". Sie können den Schlüssel jedoch auch manuell kopieren.

Jetzt erstellen wir ein Git-Repository für Ihre Jekyll-Site und konfigurieren Git-Hooks, um es beim Update neu zu erstellen.

Schritt 2 - Ein Git-Repository einrichten

Ihr Git-Repository enthält Daten zu Ihrer Git-Site, einschließlich eines Änderungs- und Festschreibungsverlaufs. In diesem Schritt richten wir das Git-Repository auf dem Produktionsserver mit einem Post-Receive-Hook ein, der Ihre Site neu generiert.

Das Repository befindet sich im Ausgangsverzeichnis des Benutzers * git *. Wenn Sie sich nach dem vorherigen Schritt von diesem Benutzerkonto abgemeldet haben, verwenden Sie den Befehl + su +, um die Rolle zu wechseln:

su -

Erstellen Sie im Ausgangsverzeichnis einen Ordner, der Ihr Git-Repository enthält. Es ist erforderlich, dass sich das Verzeichnis im Ausgangsverzeichnis befindet und im Format "+ .git " benannt ist, damit die Befehle " git +" es erkennen können. Normalerweise sollte "" der Name Ihrer Site sein, damit "+ git +" Sites und Repositorys leicht erkennen kann. Wir werden unsere Seite "" nennen:

mkdir ~/.git

Wechseln Sie in das Verzeichnis und initialisieren Sie das Git-Repository mit dem Befehl + git init +. Das + - bare + Flag richtet das Repository für das Hosting auf dem Server ein und ermöglicht die Zusammenarbeit zwischen mehreren Benutzern:

cd ~/.git
git init --bare

Die Ausgabe enthält Informationen zum erfolgreich initialisierten Repository:

OutputInitialized empty Git repository in

Wird eine solche Ausgabe nicht angezeigt, befolgen Sie die Bildschirmprotokolle, um das Problem zu beheben, bevor Sie mit dem Lernprogramm fortfahren.

Der von uns erstellte Ordner enthält die Verzeichnisse und Dateien, die zum Hosten Ihres Repositorys erforderlich sind. Sie können den Inhalt überprüfen, indem Sie Folgendes eingeben:

ls
Outputbranches  config  description  HEAD  hooks  info  objects  refs

Wenn diese Art von Ausgabe nicht angezeigt wird, stellen Sie sicher, dass Sie in das entsprechende Verzeichnis gewechselt und "+ git init +" erfolgreich ausgeführt haben.

Das * hooks * -Verzeichnis enthält Skripte, die für Git-Hooks verwendet werden. Standardmäßig enthält es eine Beispieldatei für jeden Git-Hook-Typ, damit Sie problemlos loslegen können. Für die Zwecke dieses Lernprogramms verwenden wir den * post-receive * -Hook, um die Site neu zu generieren, sobald das Repository mit den neuesten Änderungen aktualisiert wurde.

Erstellen Sie die Datei mit dem Namen "+ post-receive " im Verzeichnis " hooks +" und öffnen Sie sie im Texteditor Ihrer Wahl:

nano ~//hooks/post-receive

Wir werden den Hook so konfigurieren, dass er die neuesten Änderungen im temporären Verzeichnis klont und anschließend neu generiert und die generierte Site unter "+ / var / www / html +" speichert, damit Sie leicht darauf zugreifen können.

Kopieren Sie den folgenden Inhalt in die Datei:

~ / 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

Speichern Sie anschließend die Datei und schließen Sie den Texteditor.

Stellen Sie sicher, dass das Skript ausführbar ist, damit der Benutzer * git * es ausführen kann, wenn Änderungen eingehen:

chmod +x ~//hooks/post-receive

Zu diesem Zeitpunkt verfügen wir über ein vollständig konfiguriertes Git-Repository und einen Git-Post-Receive-Hook, um Ihre Site zu aktualisieren, wenn Änderungen eingehen. Bevor wir die Site in das Repository verschieben, sichern wir unseren Produktionsserver zusätzlich, indem wir "+ git-shell +" konfigurieren, eine interaktive Shell, die Benutzern verschiedene Git-Befehle zur Verfügung stellt, wenn sie eine Verbindung über SSH herstellen.

Schritt 3 - Konfigurieren der Git Shell zum Deaktivieren interaktiver Anmeldungen

Benutzer können "+ git-shell " auf folgende Arten implementieren: als interaktive Shell, die ihnen bei der Verbindung über SSH verschiedene Befehle zur Verfügung stellt, mit denen sie neue Repositorys erstellen oder neue SSH-Schlüssel hinzufügen können, oder als nicht interaktive Shell. Deaktivieren des Zugriffs auf die Serverkonsole über SSH, aber Ermöglichen der Verwendung von " git +" - Befehlen zum Verwalten vorhandener Repositorys.

Wenn Sie den SSH-Schlüssel für den * git * -Benutzer mit anderen teilen, haben diese über SSH Zugriff auf eine interaktive Bash-Sitzung. Dies stellt eine Sicherheitsbedrohung dar, da Benutzer auf andere, nicht standortbezogene Daten zugreifen können. Wir konfigurieren "+ git-shell +" als nicht interaktive Shell, sodass Sie mit dem Benutzer "* git *" keine interaktive Bash-Sitzung starten können.

Stellen Sie sicher, dass Sie als Benutzer * git * angemeldet sind. Wenn Sie die Sitzung nach dem vorherigen Schritt beendet haben, können Sie denselben Befehl wie zuvor verwenden, um sich erneut anzumelden:

su - git

Beginnen Sie mit der Erstellung eines "+ git-shell-commands" -Verzeichnisses, das benötigt wird, damit "+ git-shell" funktioniert:

mkdir ~/git-shell-commands

Die "+ no-interactive-shell" -Datei wird zum Definieren des Verhaltens verwendet, wenn Sie den Zugriff auf die interaktive Shell nicht zulassen möchten. Öffnen Sie sie daher im Texteditor Ihrer Wahl:

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

Kopieren Sie den folgenden Inhalt in die Datei. Es wird sichergestellt, dass die Willkommensnachricht angezeigt wird, wenn Sie versuchen, sich über SSH anzumelden:

~ / git-shell-commands / 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

Speichern Sie die Datei und schließen Sie den Texteditor.

Wir müssen sicherstellen, dass die Datei ausführbar ist, damit + git-shell sie ausführen kann:

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

Kehren Sie zu Ihrem Benutzer ohne Rootberechtigung zurück, damit Sie die Eigenschaften unseres Benutzers * git * ändern können. Wenn Sie den vorherigen Befehl + su + verwendet haben, können Sie die Sitzung mit folgendem Befehl schließen:

exit

Zuletzt müssen wir die Shell für den * git * Benutzer in die + git-shell ändern:

sudo usermod -s $(which git-shell)

Stellen Sie sicher, dass Sie nicht auf die interaktive Shell zugreifen können, indem Sie SSH auf dem Entwicklungscomputer ausführen:

ssh git@

Sie sollten eine Nachricht wie die folgende sehen. Wenn dies nicht der Fall ist, vergewissern Sie sich, dass Sie über die entsprechenden SSH-Schlüssel verfügen, und wiederholen Sie die vorherigen Schritte, um das Problem zu beheben, bevor Sie mit dem Tutorial fortfahren.

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.

Als Nächstes konfigurieren Sie Ihren lokalen Entwicklungscomputer für die Verwendung dieses Git-Repositorys. Anschließend wird Ihre Site in das Repository verschoben. Zuletzt stellen wir sicher, dass Ihre Website generiert wird und Sie über den Webbrowser darauf zugreifen können.

Schritt 4 - Änderungen in das Repository übertragen

Wir haben jetzt ein Git-Repository auf dem Produktionsserver initialisiert und konfiguriert. Auf dem Entwicklungscomputer müssen wir ein lokales Repository initialisieren, das Daten zum Remote-Repository und Änderungen am lokalen Repository enthält.

Navigieren Sie auf Ihrem Entwicklungscomputer zu dem Verzeichnis, das die Site enthält:

cd ~/www

Wir müssen ein Git-Repository im Stammverzeichnis der Site initialisieren, damit wir Inhalte in das Remote-Repository übertragen können:

git init

Die Ausgabe enthält eine Nachricht über die erfolgreiche Repository-Initialisierung:

OutputInitialized empty Git repository in

Wenn Sie eine solche Ausgabe nicht sehen, befolgen Sie die Anweisungen auf dem Bildschirm, um das Problem zu beheben, bevor Sie fortfahren.

Erstellen Sie nun ein Remote-Objekt, das das Git-Objekt darstellt, das zum Verfolgen von Remote-Repositorys und -Verzweigungen verwendet wird, an denen Sie arbeiten. Normalerweise heißt die Standardfernbedienung * origin *, daher verwenden wir sie für die Zwecke dieses Lernprogramms.

Mit dem folgenden Befehl wird eine * origin * -Remote erstellt, die das * sammy-blog * -Repository auf dem Produktionsserver mithilfe des * git * -Benutzers verfolgt:

git remote add origin git@:.git

Keine Ausgabe zeigt erfolgreiche Operation an. Wenn eine Fehlermeldung angezeigt wird, müssen Sie diese beheben, bevor Sie mit dem nächsten Schritt fortfahren.

Jedes Mal, wenn Sie Änderungen in das Remote-Repository übertragen möchten, müssen Sie sie festschreiben und anschließend die Festschreibung in das Remote-Repository übertragen. Sobald das Remote-Repository das Commit erhalten hat, wird Ihre Site mit den letzten Änderungen neu generiert.

Commits werden verwendet, um Änderungen nachzuverfolgen, die Sie vornehmen. Sie enthalten eine Festschreibungsnachricht, mit der Änderungen beschrieben werden, die in dieser Festschreibung vorgenommen wurden. Es wird empfohlen, die Nachrichten kurz und prägnant zu halten, einschließlich Einzelheiten zu den wichtigsten Änderungen, die am Commit vorgenommen wurden.

Vor dem Festschreiben von Änderungen müssen Sie auswählen, welche Dateien festgeschrieben werden sollen. Der folgende Befehl markiert alle Dateien zum Festschreiben:

git add .

Keine Ausgabe zeigt erfolgreiche Befehlsausführung an. Wenn Sie Fehler sehen, beheben Sie diese, bevor Sie fortfahren.

Bestätigen Sie als nächstes alle Änderungen mit dem Flag "+ -m +", das die Bestätigungsnachricht enthält. Da dies unser erstes Commit ist, nennen wir es * "Erstes Commit" *:

git commit -m "Initial commit."

Die Ausgabe enthält eine Liste der Verzeichnisse und Dateien, die in diesem Commit geändert wurden:

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

Wenn Fehler auftreten, müssen Sie diese beheben, bevor Sie mit dem Lernprogramm fortfahren.

Verwenden Sie abschließend den folgenden Befehl, um festgeschriebene Änderungen in das Remote-Repository zu übertragen:

git push origin master

Die Ausgabe enthält Informationen zum Fortschritt des Pushs. Wenn dies erledigt ist, werden folgende Informationen angezeigt:

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

Wenn dies nicht der Fall ist, befolgen Sie die Bildschirmprotokolle, um das Problem zu beheben, bevor Sie mit dem Lernprogramm fortfahren.

Zu diesem Zeitpunkt wird Ihre Website auf den Server hochgeladen und nach kurzer Zeit erneut erstellt. Navigieren Sie mit Ihrem Webbrowser zu "+ http: // +". Sie sollten sehen, wie Ihre Site funktioniert. Wenn dies nicht der Fall ist, führen Sie die vorherigen Schritte erneut aus, um sicherzustellen, dass Sie alles wie beabsichtigt ausgeführt haben.

Um Ihre Site bei einer Änderung neu zu generieren, müssen Sie dem Commit Dateien hinzufügen, diese festschreiben und die Änderungen dann wie beim ersten Commit übertragen.

Wenn Sie Änderungen an Ihren Dateien vorgenommen haben, verwenden Sie die folgenden Befehle, um alle geänderten Dateien zum Commit hinzuzufügen. Wenn Sie neue Dateien erstellt haben, müssen Sie diese ebenfalls mit + git add + hinzufügen, wie wir es beim ersten Commit getan haben. Wenn Sie bereit sind, Ihre Dateien festzuschreiben, sollten Sie eine weitere Festschreibungsnachricht hinzufügen, die Ihre Änderungen beschreibt. Wir werden unsere Nachricht * "Aktualisierte Dateien" * nennen:

git commit -am "updated files"

Zuletzt übertragen Sie die Änderungen in das Remote-Repository.

git push origin master

Die Ausgabe sieht ähnlich aus wie bei Ihrem ersten Push:

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

Zu diesem Zeitpunkt wird Ihre Site frisch generiert und die neuesten Änderungen werden übernommen.

Fazit

In diesem Tutorial haben Sie gelernt, wie Sie Ihre Website bereitstellen, nachdem Sie Änderungen an Ihrem Git-Repository vorgenommen haben. Wenn Sie mehr über Git erfahren möchten, besuchen Sie unsere Git tutorial series.

Und wenn Sie mehr über andere Git-Hooks erfahren möchten, können Sie unter https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment nachlesen -tasks [Verwendung von Git-Hooks zur Automatisierung von Entwicklungs- und Bereitstellungsaufgaben].