keyboard_arrow_up

Build Script for Cloudflare and Hugo

expand_circle_right

In Cloudflare Pages → Project Settings → Build Configuration, I can set the Framework preset to Hugo, the Build command to hugo, and the Build output directory to public. That’s the default when selecting Hugo.

However, when using Pagefind, even though I can set the Build command to hugo && npx pagefind --site "public", it’s not quite satisfying. This is because, on every build, Cloudflare runs hugo, installs Pagefind, and then runs npx pagefind --site "public" again — which takes a long time.

Since I can already do this locally, I’m wondering why it should be so difficult. So instead, I select None for the Framework preset and leave both the Build command and the Build output directory blank. Then I run:

hugo --destination="/path/to/site-folder"
npx pagefind --site "site-folder"

After that, I push it to the GitHub repo. It’s a bit more cumbersome, but if I write a script, it’s manageable. The script is:

#!/bin/dash

# check if root and exit
if [ $(($(id -u))) -eq 0 ]; then
    exit 0
fi
# check if running in terminal or exit
case "$(ps -o stat= -p $$)" in
    *+*) echo "continue..." ;;
    *) notify-send -t 2700 "clean exit" "please run it in terminal"; exit 0 ;;
esac
# check already running or exit
SCRIPTNAME="$(basename -- "$0")"
if pidof -x "$SCRIPTNAME" -o $$ >/dev/null 2>&1; then
    echo "the script is already running. clean exit."
    exit 0
fi

# check input
if echo "$1" | grep "/$" >/dev/null 2>&1; then
    echo "Oops! your input is not clean. Please remove / ending."
    exit 0
fi
if echo "$1" | grep "/\*$" >/dev/null 2>&1; then
    echo "Oops! your input is not clean. Please remove /* ending."
    exit 0
fi
if echo "$1" | grep "/\*\s" >/dev/null 2>&1; then
    echo "Oops! your input is not clean. Please remove /*  ending."
    exit 0
fi
if echo "$1" | grep "/\s" >/dev/null 2>&1; then
    echo "Oops! your input is not clean. Please remove /  ending."
    exit 0
fi

# START
FULLLINK="$(readlink -f "$1")"

if [ ! -d "$FULLLINK" ]; then
    echo "::: Oops! "$FULLLINK" is not directory or does not exist."; exit 0
fi

SITE="$(basename -- "$FULLLINK")"
PARENTDIR="$(dirname -- "$FULLLINK")"

echo "
"$SITE"
"$PARENTDIR"
"$FULLLINK"
"

read -p "Continue? [Y/n]: " CYN
case $CYN in
    n|no|N|No) echo "::: exit..."; exit 0 ;;
    *) echo "::: continue..." ;;
esac

rm -rf "$FULLLINK"/*
hugo --destination="$FULLLINK" build
cd "$PARENTDIR"
npx pagefind --site "$SITE"

read -p "Continue to git push? [Y/n]: " CGPYN
case $CGPYN in
    n|no|N|No) echo "::: exit..."; exit 0 ;;
    *) echo "::: continue..." ;;
esac

cd "$SITE"

# continue to git push
git add .
git commit -m "updated"
git push
Categories   •  Tech  •  Script
Tags   •  Cloudflare  •  Hugo  •  Build  •  Pagefind