Το προφίλ μας στο Google Plus
0

Αυτόματο deployment Hugo site μέσω Git Hooks

Σε προηγούμενο άρθρο γνωρίσαμε το Hugo, έναν δημοφιλή και ταχύτατο static site generator. Το δουλέψαμε και μάθαμε πώς να το χρησιμοποιούμε ώστε, ξεκινώντας από το μηδέν, να δημιουργούμε σύγχρονα blogs ή ελκυστικά project sites. Σ’ αυτό το άρθρο θα δείξουμε, αναλυτικά και βήμα προς βήμα, πώς υποβάλλουμε ένα Hugo site υπό version control με τη βοήθεια του Git, καθώς και πώς αναπτύσσουμε νέο περιεχόμενο με τα λεγόμενα Git Hooks.

Για τη συνέχεια υποθέτουμε ότι έχετε ήδη φτιάξει το πρώτο σας static site. Αυτό με το οποίο εμείς δουλέψαμε για τις ανάγκες του παρόντος, ξεκίνησε την πορεία του από τον τοπικό κατάλογο ~/colder-dot-xyz ενός Mac Book και, παρεμπιπτόντως, είναι δημοσιευμένο στο https://colder.xyz. Περιττό να σημειώσουμε ότι δεν χρειάζεται να δουλέψετε κι εσείς σε περιβάλλον Mac OS.

Πριν υποβάλουμε το site μας υπό version control, φτιάξαμε έναν νέο κατάλογο, τον ~/hugo, μεταφέραμε εκεί τον ~/colder-dot-xyz και τον μετονομάσαμε σε colder.xyz. Βεβαίως, η δημιουργία του ~/hugo δεν έγινε μόνο και μόνο για να μετακινήσουμε (και να μετονομάσουμε) τον ~/colder-dot-xyz. Εντός του ~/hugo φτιάξαμε και τον κατάλογο themes, μεταβήκαμε σ’ αυτόν και κατεβάσαμε την πλέον πρόσφατη έκδοση του theme του site μας. Αμέσως μετά διαγράψαμε τον παλιό κατάλογο ~/hugo/colder.xyz/themes και τον αντικαταστήσαμε με ένα ομώνυμο symbolic link προς τον ~/hugo/themes. Γιατί όλες αυτές οι διευθετήσεις; Κατ’ αρχάς, η παρουσία του Git repository με το theme θα περιέπλεκε το version control του site. Κατά δεύτερον, όταν έχουμε περισσότερα από ένα Hugo sites είναι πολύ πιο βολικό να διατηρούμε τα themes σε έναν ξεχωριστό κατάλογο κι από τους καταλόγους των sites να δημιουργούμε links προς αυτόν.

Διευθέτηση καταλόγων πριν το version control.

Στον κατάλογο ~/hugo μεταφέραμε εκείνον του site μας (1) και φτιάξαμε κι άλλον έναν, για την τήρηση των Hugo themes (2). Από τον ~/hugo/colder.xyz διαγράψαμε τον κατάλογο themes και στην θέση του δημιουργήσαμε ένα symbolic link προς τον ~/hugo/themes (3). Με αυτή την πολύ απλή διευθέτηση διευκολύνεται το version control του colder.xyz. Όταν εξάλλου αναπτύσσουμε/συντηρούμε περισσότερα από ένα Hugo sites αποφεύγουμε και τα περιττά downloads, αφού τα themes παραμένουν εκτός των καταλόγων των sites.

Μετατροπή του site σε Git repository
Πριν πιάσουμε δουλειά, να πούμε ότι αν τώρα αρχίζετε με το Git τότε ίσως είναι καλή ιδέα να διαβάσετε το σχετικό εισαγωγικό άρθρο που έχουμε δημοσιεύσει.

Για τη μετατροπή του site σε Git repository, απλά μεταβαίνουμε στον κατάλογό του (π.χ., cd ~/hugo/colder.xyz) και πληκτρολογούμε:

$ git init

Εξ ορισμού, το Git αφήνει τα κενά directories εκτός των commits. Μερικές φορές όμως το Hugo τα χρειάζεται, οπότε πρέπει τώρα να πείσουμε το Git ν’ αλλάξει συνήθειες. Προς τούτο, αρκεί να τοποθετήσουμε ένα κρυμμένο αρχείο με όνομα .gitkeep στη ρίζα κάθε καταλόγου αμέσως κάτω από εκείνον του site μας — εκτός από τον .git:

$ for each_dir in $(find . -type d -depth 1 -not -name ".*"); \
> do touch "$each_dir"/.gitkeep; done

Επειδή εξάλλου το περιεχόμενο του site πρέπει να παράγεται από την αρχή πριν από κάθε deployment, θα αφήσουμε τον κατάλογο public εκτός version control:

$ echo "public" >> .gitignore

Αν, παρεμπιπτόντως, δουλεύετε κι εσείς σε περιβάλλον Mac OS, στο αρχείο .gitignore προσθέστε και μια γραμμή γι’ αυτά τα ευλογημένα αρχεία .DS_Store:

$ echo ".DS_Store" >> .gitignore

Προσθέτουμε τώρα στο Git όλα τα αρχεία και τους καταλόγους εντός του colder.xyz που είναι untracked:

$ git add .

Επαληθεύουμε ότι όλα είναι όπως πρέπει:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .gitignore
    new file:   archetypes/.gitkeep
    new file:   archetypes/default.md
    new file:   config.toml
    new file:   content/.gitkeep
    new file:   content/about.md
    new file:   content/images/reykjavik_fog.jpg
    new file:   content/post/do-you-speak-icelandic.md
    new file:   content/post/drivels-and-delusions.md
    new file:   content/post/elcap.md
    new file:   content/post/exploding-disks.md
    new file:   content/post/from-ios-to-android.md
    new file:   content/post/heatwave-and-fog.md
    new file:   content/post/ice-drone-homage.md
    new file:   content/post/kjotsupudagurinn.md
    new file:   content/post/no-more-doc.md
    new file:   content/post/old-pcs-selfheal.md
    new file:   content/post/sierraflow.md
    new file:   content/post/static-site-gen-at-random.md
    new file:   content/post/stubborn-weather.md
    new file:   data/.gitkeep
    new file:   layouts/.gitkeep
    new file:   layouts/partials/head/favicon.html
    new file:   static/.gitkeep
    new file:   themes

Ολοκληρώνουμε πραγματοποιώντας το πρώτο commit για το Hugo site μας:

$ git commit -m "Initial commit, some content already exists"
[master (root-commit) 8e27a93] Initial commit, some content already exists
 25 files changed, 460 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 archetypes/.gitkeep
 create mode 100644 archetypes/default.md
 create mode 100644 config.toml
 create mode 100644 content/.gitkeep
 create mode 100644 content/about.md
 create mode 100644 content/images/reykjavik_fog.jpg
 create mode 100644 content/post/do-you-speak-icelandic.md
 create mode 100644 content/post/drivels-and-delusions.md
 create mode 100644 content/post/elcap.md
 create mode 100644 content/post/exploding-disks.md
 create mode 100644 content/post/from-ios-to-android.md
 create mode 100644 content/post/heatwave-and-fog.md
 create mode 100644 content/post/ice-drone-homage.md
 create mode 100644 content/post/kjotsupudagurinn.md
 create mode 100644 content/post/no-more-doc.md
 create mode 100644 content/post/old-pcs-selfheal.md
 create mode 100644 content/post/sierraflow.md
 create mode 100644 content/post/static-site-gen-at-random.md
 create mode 100644 content/post/stubborn-weather.md
 create mode 100644 data/.gitkeep
 create mode 100644 layouts/.gitkeep
 create mode 100644 layouts/partials/head/favicon.html
 create mode 100644 static/.gitkeep
 create mode 120000 themes

Πάρα πολύ ωραία, είμαστε έτοιμοι για τη συνέχεια. Στο εξής, το μηχάνημα από το οποίο εργαζόμαστε θα το ονομάζουμε development workstation ή απλά development. Εκείνο όπου θα καταλήγει το περιεχόμενό μας –μ’ άλλα λόγια εκείνο στο οποίο τρέχει ο web server που σερβίρει το site μας–, θα το ονομάζουμε production server ή απλά production. Από το development οφείλουμε να έχουμε πρόσβαση στο production μέσω SSH και μάλιστα χωρίς την πληκτρολόγηση password. (Αν χρειαστεί, διαβάστε το σχετικό άρθρο περί SSH password-less logins.)

Μεταφορά αρχικού Git repository στο production
Στο development workstation μεταβαίνουμε στον κατάλογο ακριβώς πάνω από τον colder.xyz

$ pwd
/Users/cvar/hugo/colder.xyz
$ cd ..
$ pwd
/Users/cvar/hugo

…κι εντός του προσωπικού καταλόγου του χρήστη μας (cvar) δημιουργούμε ένα bare Git repository πληκτρολογώντας κάτι σαν το ακόλουθο:

$ git clone --bare colder.xyz ~/colder.xyz.git
Cloning into bare repository '/Users/cvar/colder.xyz.git'...
done.

Τι είναι όμως αυτό το bare Git repository; Πολύ απλά, είναι ένας κατάλογος (εν προκειμένω με όνομα colder.xyz.git) που αντί να έχει όλα τα αρχεία διαχείρισης του αρχικού Git repository μέσα στον κρυφό υποκατάλογο .git, τα έχει στη ρίζα του:

$ ls -lh ~/colder.xyz.git/
total 32
-rw-r--r--   1 cvar  staff    23B 14 jan 12:32 HEAD
-rw-r--r--   1 cvar  staff   164B 14 jan 12:32 config
-rw-r--r--   1 cvar  staff    73B 14 jan 12:32 description
drwxr-xr-x  12 cvar  staff   384B 14 jan 12:32 hooks
drwxr-xr-x   3 cvar  staff    96B 14 jan 12:32 info
drwxr-xr-x  38 cvar  staff   1,2K 14 jan 12:32 objects
-rw-r--r--   1 cvar  staff   105B 14 jan 12:32 packed-refs
drwxr-xr-x   4 cvar  staff   128B 14 jan 12:32 refs

Τον κατάλογο αυτόν τον μεταφέρουμε στον production server, ώστε σε λίγο να είμαστε σε θέση να στέλνουμε (push) εύκολα περιεχόμενο εκεί:

$ scp -r ~/colder.xyz.git sub0@box.colder.xyz:~/

Το hostname του δικού μας production είναι box.colder.xyz κι ο απομακρυσμένος μας χρήστης εκεί έχει username το sub0. Προφανώς, για τη δική σας περίπτωση θα κάνετε τις απαραίτητες προσαρμογές.

Το production ως Git remote
Στο development, πάμε ξανά στον κατάλογο του Hugo site (cd ~/hugo/colder.xyz) και γράφουμε:

$ git remote add colder-prod sub0@colder.xyz:colder.xyz.git

Μόλις προσθέσαμε ένα νέο remote για το τοπικό Git repository. Βρίσκεται στο production κι επιλέξαμε να το ονομάσουμε colder-proc:

$ git remote -v
colder-prod sub0@colder.xyz:colder.xyz.git (fetch)
colder-prod sub0@colder.xyz:colder.xyz.git (push)

Πριν κάνουμε οτιδήποτε με το remote, οφείλουμε πρώτα να τακτοποιήσουμε συγκεκριμένα θέματα στο production. Αναλυτικότερα, το απομακρυσμένο μηχάνημα χρειάζεται να έχει εγκατεστημένα τα Git, Hugo, Pygments — και φυσικά έναν web server. Συνδεθείτε εκεί μέσω SSH και, αναλόγως της διανομής Linux, πράξτε τα δέοντα ώστε να εγκαταστήσετε τα αντίστοιχα πακέτα λογισμικού. Πληροφοριακά, το δικό μας production τρέχει Ubuntu 14.04.5 LTS. Ως web server είχε ήδη τον nginx, οπότε δεν χρειάστηκε να στραφούμε σε κάποιον άλλον. Τα Git και Pygments τα εγκαταστήσαμε κατά τα γνωστά, δηλαδή με ένα sudo apt install git python-pygments. Για την πλέον πρόσφατη έκδοση του Hugo, η οποία τη στιγμή που γραφόταν το παρόν ήταν η 0.32.4, κατεβάσαμε το αντίστοιχο 64μπιτο Debian package από το https://github.com/gohugoio/hugo/releases

$ wget https://github.com/gohugoio/hugo/releases/download/v0.32.4/hugo_0.32.4_Linux-64bit.deb

…και το εγκαταστήσαμε ως εξής:

$ sudo dpkg -i hugo_0.32.4_Linux-64bit.deb
Selecting previously unselected package hugo.
(Reading database ... 142359 files and directories currently installed.)
Preparing to unpack hugo_0.32.4_Linux-64bit.deb ...
Unpacking hugo (0.32.4) ...
Setting up hugo (0.32.4) ...

$ hugo version
Hugo Static Site Generator v0.32.4 linux/amd64 BuildDate: 2018-01-11T10:58:37+02:00

Μην ξεχνάτε ότι στο production χρειαζόμαστε και το theme ή τα themes για τα static site μας. Αν δεν έχει γίνει ακόμα προφανές, ας σημειώσουμε ότι από το development θα προωθούμε περιεχόμενο στο production, αυτό θα κτίζεται αυτόματα εκεί κι αμέσως μετά θα διατίθεται δημόσια μέσω του web server. Στον προσωπικό κατάλογο του απομακρυσμένου μας χρήστη, λοιπόν, φτιάχνουμε έναν νέο ονόματι themes. Εκεί μέσα κλωνοποιούμε όποια κι όσα themes θέλουμε. Παράδειγμα:

$ mkdir ~/themes && cd themes

$ git clone https://github.com/comfusion/after-dark.git
Cloning into 'after-dark'...
remote: Counting objects: 2211, done.
remote: Total 2211 (delta 0), reused 0 (delta 0), pack-reused 2211
Receiving objects: 100% (2211/2211), 17.21 MiB | 7.82 MiB/s, done.
Resolving deltas: 100% (1212/1212), done.
Checking connectivity... done.

$ git clone https://github.com/calintat/minimal.git
Cloning into 'minimal'...
remote: Counting objects: 350, done.
remote: Compressing objects: 100% (7/7), done.
Receiving objects: 100% (350/350), 308.68 KiB | 0 bytes/s, done.
remote: Total 350 (delta 4), reused 6 (delta 3), pack-reused 340
Resolving deltas: 100% (176/176), done.
Checking connectivity... done.

Έχουμε αρκετή ακόμη δουλειά στο production. Στο σημείο αυτό όμως αξίζει να κάνουμε ένα σύντομο διάλειμμα κι από το development να τσεκάρουμε αν (και πώς) φαίνεται το remote που προσθέσαμε πριν λίγο. Από το development, λοιπόν, και συγκεκριμένα μέσα από τον κατάλογο του site μας, αρκεί να πληκτρολογήσουμε κάτι τέτοιο:

$ cd ~/hugo/colder.xyz

$ git ls-remote colder-prod
94cd450f0ff7d7c6bdb740d18cb05bf24ad620f7   HEAD
94cd450f0ff7d7c6bdb740d18cb05bf24ad620f7   refs/heads/master

Παρατηρώντας το αποτέλεσμα της δεύτερης εντολής, γίνεται φανερό ότι το Git μπορεί κι εγκαθιδρύει συνδέσεις μεταξύ development και production — κι αυτό είναι πολύ καλό κι ακριβώς ό,τι θέλουμε.

Αυτόματη επεξεργασία στο production
Κάθε φορά που από το development κάνουμε ένα git push περιεχομένου στο production, θέλουμε να υπάρχει εκεί ένα script (το post-receive) που θα εκτελείται αυτόματα και θα αναλαμβάνει το κτίσιμο του site και φυσικά τη δημοσίευση του νέου περιεχομένου. Συνδεόμαστε, λοιπόν, στον production server και μεταβαίνουμε στον κατάλογο ονόματι hooks, εντός του bare Git repository που στείλαμε από το development workstation προηγουμένως:

$ cd colder.xyz.git/hooks/

$ ls -lh
total 44K
-rwxr-xr-x 1 sub0 sub0  478 Jan 14 13:51 applypatch-msg.sample
-rwxr-xr-x 1 sub0 sub0  896 Jan 14 13:51 commit-msg.sample
-rwxr-xr-x 1 sub0 sub0  189 Jan 14 13:51 post-update.sample
-rwxr-xr-x 1 sub0 sub0  424 Jan 14 13:51 pre-applypatch.sample
-rwxr-xr-x 1 sub0 sub0 1.7K Jan 14 13:51 pre-commit.sample
-rwxr-xr-x 1 sub0 sub0 1.5K Jan 14 13:51 prepare-commit-msg.sample
-rwxr-xr-x 1 sub0 sub0 1.4K Jan 14 13:51 pre-push.sample
-rwxr-xr-x 1 sub0 sub0 4.8K Jan 14 13:51 pre-rebase.sample
-rwxr-xr-x 1 sub0 sub0  544 Jan 14 13:51 pre-receive.sample
-rwxr-xr-x 1 sub0 sub0 3.6K Jan 14 13:51 update.sample

Όπως διαπιστώνετε, υπάρχουν αρκετά δείγματα scripts. Ρίξτε, αν θέλετε, μια ματιά σε κάποια εξ αυτών. Ας φτιάξουμε τώρα ένα νέο, με όνομα post-receive και χωρίς κατάληξη:

$ touch post-receive

Το post-receive θα είναι, ουσιαστικά, ένα BASH script, το οποίο θα εκτελείται αυτόματα κάθε φορά που θα στέλνουμε (push) νέο περιεχόμενο στο production. Ανοίγουμε το νέο αρχείο με τον text editor της προτίμησής μας (nano, vim κ.ο.κ.) και φροντίζουμε ώστε να έχει περιεχόμενο σαν το ακόλουθο:

#!/bin/bash

SITE_REPO="$HOME/colder.xyz.git"
WORKING="$HOME/colder.xyz-working"
PUBLIC="/home/user-data/www/default"
BACKUP="$HOME/colder.xyz-backup"
DOMAIN="colder.xyz"
PROTO="https"
HUGO="/usr/local/bin/hugo"

rm -rf "$WORKING"

rsync -aqz "$PUBLIC"/ "$BACKUP"

rsync_ec="$?"

if [ $rsync_ec -ne 0 ]; then
    printf "failed to create a backup of public directory, "
    printf "rsync returned error code %d\n" $rsync_ec
    rm -rf "$BACKUP"
    exit 1
fi

git clone "$SITE_REPO" "$WORKING"

git_ec="$?"

if [ $git_ec -ne 0 ]; then
    printf "failed to git-clone site repository into working "
    printf "directory, git returned error code %d\n" $git_ec
    rm -rf "$WORKING"
    exit 1
fi

rm -rf "$PUBLIC"/*

"$HUGO" --source "$WORKING" --destination "$PUBLIC" \
    --baseURL "$PROTO://$DOMAIN/"

hugo_ec="$?"

if [ $hugo_ec -ne 0 ]; then
    printf "failed to properly deploy site, "
    printf "hugo returned error code %d\n" $hugo_ec
    rm -rf "$PUBLIC"/*
    rsync -aqz "$BACKUP"/ "$PUBLIC"
fi

rm -rf "$WORKING"

Νομίζουμε ότι το script είναι αρκετά human readable και η λειτουργία του είναι μάλλον προφανής. Προσέξτε μόνο ώστε να τροποποιήσετε τις μεταβλητές στην αρχή, ώστε να αντικατοπτρίζουν το δικό σας περιβάλλον. Δώστε λίγη παραπάνω προσοχή στην PUBLIC, η οποία κρατά την πλήρη διαδρομή του καταλόγου από τον οποίο ο web server σερβίρει το site. Στο δικό μας setup ο nginx ήταν ήδη ρυθμισμένος ώστε να χρησιμοποιεί το /home/user-data/www/default — και δεν είχαμε λόγο για κάποια αλλαγή. Στο δικό σας setup είναι πολύ πιθανό να τροποποιήσετε κατάλληλα το configuration του web server ή/και την τιμή της PUBLIC. Από τη στιγμή βέβαια που έχετε ήδη φτιάξει το δικό σας static site, το πιθανότερο είναι ότι θα πειράξετε μόνο τη μεταβλητή. Προσέξτε, παρακαλούμε, και τη μεταβλητή WORKING, η οποία δέχεται το full path ενός καταλόγου ο οποίος αποτελεί κλώνο του bare Git repository. Απ’ αυτόν τον κατάλογο το Hugo θα κτίζει το site μας, οπότε αυτός θα πρέπει να βρίσκεται στο ίδιο επίπεδο με τον κατάλογο themes.

Το αρχείο (script) post-receive οφείλουμε να το κάνουμε εκτελέσιμο:

$ chmod +x post-receive

Ώρα για δοκιμές
Στο development workstation μεταβαίνουμε στον κατάλογο του Hugo site (cd ~/hugo/colder.xyz) και φτιάχνουμε ένα νέο, δοκιμαστικό post:

$ hugo new post/siglufjordur.md
/Users/cvar/hugo/colder.xyz/content/post/siglufjordur.md created

Δεν είναι κακή ιδέα να προσθέσουμε λίγο περιεχόμενο, ίσως να ενθέσουμε και μια φωτογραφία. Δείτε, π.χ., πώς μοιάζει το δικό μας δοκιμαστικό αρχείο:

$ cat content/post/siglufjordur.md
---
title: "Δοκιμαστικό για ανάπτυξη Hugo site μέσω Git Hooks"
date: 2018-01-15T11:47:28+01:00
tags: [ "Hugo", "Git" ]
draft: true
---

Όπως και να το κάνουμε, αλλιώς είναι να δημοσιεύεις περιεχόμενο
μεταφέροντας αρχεία μέσω `rsync` ή `scp`, κι αλλιώς με ένα `git push`
:) Μ' αυτή την προσέγγιση υπάρχουν πολλά καλά. Πας, π.χ., σε ένα
οποιοδήποτε development machine που έχει Git και μπορείς να κλωνοποιήσεις 
το static site σου με ένα `git clone`. Ή αν το έχεις ήδη κλωνοποιήσει,
πληκτρολογείς `git pull` ώστε να είσαι up-to-date. Αργότερα προσθέτεις
νέο περιεχόμενο ή/και τροποποιείς το υπάρχον, ενημερώνεις το production
δίνοντας `git push`, αισθάνεσαι μεγάλη άνεση, χαρά, καθώς κι ότι έχεις
τον έλεγχο.

Δικαίως.

Κι ας κλείσουμε αυτό το δοκιμαστικό post με μια φωτογραφία από ένα
πολύχρωμο (και πρωτότυπο) μουσείο στο Siglufjörður.

![Grána, Siglufjörður
| Πηγή: http://rooksack.de/siglufjoerdur-schoenste-stadt-island]
(/images/siglufjordur.jpg "Grána, Siglufjörður |
Πηγή: http://rooksack.de/siglufjoerdur-schoenste-stadt-island")

_The Grána fish meal and oil factory is a unique exhibition about an
important chapter in the economic and social history of Siglufjörður
and Iceland. (Visit [The Herring Era Museum]
(http://www.sild.is/en/exhibitions/grana/) for more.)_

Έχουμε τοποθετήσει κι ένα αρχείο εικόνας στον κατάλογο content/images, οπότε τώρα η κατάσταση του τοπικού Git repository έχει ως εξής:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    content/images/siglufjordur.jpg
    content/post/siglufjordur.md

nothing added to commit but untracked files present (use "git add" to track)

Ας αρχίσουμε να παρακολουθούμε τα δύο νέα αρχεία, δηλαδή το siglufjordur.md στον κατάλογο content/post, καθώς και το siglufjordur.jpg στον κατάλογο content/images:

$ git add .

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   content/images/siglufjordur.jpg
    new file:   content/post/siglufjordur.md

Προς το παρόν δεν θα κάνουμε κάποια άλλη αλλαγή/προσθήκη στο δοκιμαστικό post, οπότε έχει έλθει η ώρα για commit. Απλά, πριν το κάνουμε φροντίζουμε ώστε στο siglufjordur.md η μεταβλητή draft να είναι false (προς το παρόν είναι true, κι αυτό σημαίνει ότι το Hugo δεν θα δημοσιεύσει το post). Ιδού το commit, λοιπόν:

$ git commit -m "Add new files for testing Git hooks deploy" .
[master 71684f6] Add new files for testing Git hooks deploy
 2 files changed, 16 insertions(+)
 create mode 100644 content/images/siglufjordur.jpg
 create mode 100644 content/post/siglufjordur.md

Στη συνέχεια θα προωθήσουμε (push) το νέο περιεχόμενο στον απομακρυσμένο production server. Γράφουμε:

$ git push colder-prod master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 439 bytes | 439.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0)
remote: Cloning into '/home/sub0/colder.xyz-working'...
remote: done.
remote:
remote:                    | EN   
remote: +------------------+-----+
remote:   Pages            | 104  
remote:   Paginator pages  |   9  
remote:   Non-page files   |   2  
remote:   Static files     |   2  
remote:   Processed images |   0  
remote:   Aliases          |  43  
remote:   Sitemaps         |   1  
remote:   Cleaned          |   0  
remote:
remote: Total in 234 ms
To colder.xyz:colder.xyz.git
   71684f6..61730df  master -> master

Δεν φαίνεται να υπάρχει κάποιο πρόβλημα, μάλλον όλα δούλεψαν κατ’ ευχήν. Φυσικά, προκειμένου να είμαστε 101% σίγουροι, από τον web browser της προτίμησής μας επισκεπτόμαστε το site μας και ψάχνουμε για το νέο post.

Δοκιμαστική ανάπτυξη περιεχομένου μέσω Git Hooks.

Αυτόματο deployment περιεχομένου στο production μέσω Git Hooks — και θα θέλετε να ξεχάσετε οποιονδήποτε άλλη μέθοδο εφαρμόζατε έως σήμερα. Τώρα που το σκεφτόμαστε, το πιθανότερο είναι να θέλετε να ξεχάσετε την παλιά μέθοδο.

Και μια σημείωση: Αν κάθε φορά που κάνετε push δεν θέλετε να πληκτρολογείτε ούτε το όνομα του remote (π.χ., colder-prod) κι ούτε το τρέχον τοπικό branch (master), πληκτρολογήστε:

$ git push --set-upstream colder-prod master
Branch 'master' set up to track remote branch 'master' from 'colder-prod'.

Βεβαίως, στη θέση του colder-prod εσείς θα βάλετε το όνομα του δικού σας remote.

Εργασία από άλλο development workstation
Πάμε τώρα σε κάποιο άλλο μηχάνημα, αυτή τη φορά σε ένα που τρέχει Linux κι έχει εγκατεστημένα τα Git, Hugo και Pygments. Είμαστε συνεπώς σε θέση να αναπτύσσουμε και σ’ αυτό το workstation περιεχόμενο για το static site μας. Προς το παρόν δεν έχουμε κανένα αρχείο του site στο νέο development, αλλά αυτό διορθώνεται εύκολα. Πράγματι, αρκεί να μεταβούμε σε έναν βολικό κατάλογο (π.χ., στον ~/hugo) και να κλωνοποιήσουμε το κατάλληλο repository από τον απομακρυσμένο production server:

> git clone sub0@box.colder.xyz:~/colder.xyz.git
Cloning into 'colder.xyz'...
remote: Counting objects: 87, done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 87 (delta 39), reused 0 (delta 0)
Receiving objects: 100% (87/87), 582.73 KiB | 1.54 MiB/s, done.
Resolving deltas: 100% (39/39), done.

> ls -lh
total 4,0K
drwxr-xr-x 8 userson users 4,0K jan 15 14:12 colder.xyz

> ls -lh colder.xyz/
total 24K
drwxr-xr-x 2 userson users 4,0K jan 15 14:12 archetypes
-rw-r--r-- 1 userson users  924 jan 15 14:12 config.toml
drwxr-xr-x 4 userson users 4,0K jan 15 14:12 content
drwxr-xr-x 2 userson users 4,0K jan 15 14:12 data
drwxr-xr-x 3 userson users 4,0K jan 15 14:12 layouts
drwxr-xr-x 2 userson users 4,0K jan 15 14:12 static
lrwxrwxrwx 1 userson users    9 jan 15 14:12 themes -> ../themes

Αυτό το symbolic link, μέσα στον κατάλογο ~/hugo/colder.xyz, ίσως δείχνει σε κατάλογο που δεν υπάρχει. Σε μια τέτοια περίπτωση, απλά φτιάχνουμε τον κατάλογο themes στο parent directory κι εντός αυτού κατεβάζουμε τα Hugo themes που θέλουμε.

Απ’ αυτή τη στιγμή και στο εξής, για το static site μας μπορούμε να δουλεύουμε και από το development workstation με το Linux. Κάθε φορά που θα έχουμε νέο περιεχόμενο για τον production server, θα το προωθούμε εκεί με ένα απλό git push. Τέλος, από ένα οποιοδήποτε άλλο development θα ενημερώνουμε το τοπικό repository του site με ένα git pull.

Χαρείτε τον νέο, μοντέρνο κι εξαιρετικά διασκεδαστικό τρόπο αυτόματης ανάπτυξης του περιεχομένου σας.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων