Deployment via Git-Hook

Diese Seite hier wird mittels mdBook gepflegt, und liegt in einem (bare) Git-Repository (auf dem selben Server).

Da Mensch faul ist, will man nicht immer die Doku per Hand bauen, und dann manuell hochladen.

Mittels post-receive Git-Hook kann man den Webserver dazu veranlassen dies nach jedem Push automatisch zu tun.

#!/bin/bash

# repository location
HOOK_DIR="$(cd "$(dirname "$0")" && pwd || exit 2)"
REPO_DIR="$(realpath "$HOOK_DIR")"

# public target folder
OUTDIR="/webserver/pfad/zur/doku"
# path to the cargo binaries
CARGO="$HOME/.cargo/bin"

# create temporary directories
BUILDDIR=$(mktemp -d -t wissen_build.XXXXX)
CLONEDIR=$(mktemp -d -t wissen_clone.XXXXX)

# clone the bare repository
if ! (
    mkdir -p "$OUTDIR" &&
    git clone "$REPO_DIR" "$CLONEDIR"
); then
    echo "clone failed"
    exit 3
fi

# build the documentation
if ! (
    PATH="$CARGO:$PATH" mdbook build --dest-dir "$BUILDDIR" "$CLONEDIR"
); then
    echo "build failed"
    exit 2
fi

# move the files around and clean up
if ! (
    rm -rf "$OUTDIR" &&
    cp -a "$BUILDDIR/html" "$OUTDIR" &&
    chmod -v 755 "$OUTDIR" &&
    rm -rf "$BUILDDIR" "$CLONEDIR"
); then
    echo "file handling failed"
    exit 1
fi

echo "deployment successful"
exit 0

Zugegeben - das Script ist sehr schlicht, funktioniert jedoch recht zuverlässig. Die einfachsten Lösungen sind doch immernoch die besten :)