#!/bin/bash -eE exec 100> $HOME/homepage.lock flock 100 log=$(mktemp) catch_err () { ( echo "An error occured during building" echo "" cat "$log" ) >&12 } catch_exit() { rm -f "$log" } trap catch_err ERR trap catch_exit EXIT src=/srv/data/tsc-cloud/homepage/hugo-page dst=/srv/http/tsc/hugo prod=/srv/data/tsc-cloud/homepage/production if [ -n "$SSH_ORIGINAL_COMMAND" ] then cmd="$SSH_ORIGINAL_COMMAND" else cmd="$@" fi # echo "$cmd" publishToStage= publishToProduction=y verboseLogs=n branch=develop parseCMD() { while [ $# -gt 0 ] do part="$1" shift case "$part" in stage) publishToStage=y publishToProduction= ;; --branch) branch="$1" shift ;; --debug) set -x ;; --verbose|-v) verboseLogs=y ;; *) echo "Unknown command $part" exit 1 ;; esac done } parseCMD $cmd if [ "$verboseLogs" = "n" ] then exec 11>&1 12>&2 > "$log" 2>&1 fi doPublishToStage() { rsync -ah --delete --delete-delay public/ "$dst/" } doPublishToProduction() { # This complicated two step publication is required to speed up the transfer. # The sftp-based production server does not allow to use checksums. # Hugo recreates all files with the time stamp at building. # Thus, all files would be transmitted as the time has changed. # To overcome this, the intermediate cache should have the same times as the upstream server. echo "Syncing to intermediate stage" rsync -rlpcv --delete --delete-delay public/ $prod/ echo "Syncing from intermediate stage to production web server" rclone sync --stats 3s $prod/ ionos:/ echo "Cleaning up empty directories" rclone rmdirs ionos:/ } # exit 1 cd "$src" echo "Fetching the latest git commits" git fetch echo "Switching to the latest commit on branch $branch" git reset --hard "origin/$branch" echo "Updating NPM packages" npm ci echo "Dropping old public folder" rm -rf public echo "Building the page" npm run build echo "Synchronizing files to web server" if [ -n "$publishToStage" ] then echo "Pushing to stage" ( time doPublishToStage ) fi if [ -n "$publishToProduction" ] then echo "Publishing to production server" ( time doPublishToProduction ) fi echo "Deployment done"