deployment/update-cron.sh
TSC competition notification bot 47b7da3003 Use production stage to avoid undetected changes in the files
When a generated file does alter but keep the file size the same, the previous script was not able
to catch the situation as only the file size was compared. The checksumming was not allowed by the
provider and the time-based approach was also not possible due to the recreation of all files by
Hugo.
The solution is to use a local copy of the upstream files with the same times as the upstream ones.
By using rsync's more advanced features, only the changed files are going to be rewritten therein.
As a result, the time-based approach now works again.
2024-02-20 08:59:42 +01:00

101 lines
1.8 KiB
Bash
Executable File

#!/bin/bash -e
exec 100> $HOME/homepage.lock
flock 100
src=/srv/data/tsc-cloud/homepage/hugo-page
dst=/srv/http/tsc/hugo
prod=/srv/data/tsc-cloud/homepage/production
cmd="$SSH_ORIGINAL_COMMAND"
# echo "$cmd"
publishToStage=
publishToProduction=y
branch=develop
parseCMD() {
while [ $# -gt 0 ]
do
part="$1"
shift
case "$part" in
stage)
publishToStage=y
publishToProduction=
;;
--branch)
branch="$1"
shift
;;
--debug)
set -x
;;
*)
echo "Unknown command $part"
exit 1
;;
esac
done
}
parseCMD $cmd
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"