web/tools/deploy.sh

160 lines
2.9 KiB
Bash
Raw Normal View History

2021-01-25 01:20:51 +03:00
#!/usr/bin/env bash
2020-07-28 21:27:40 +03:00
#
# Build, test and then deploy the site content to 'origin/<pages_branch>'
#
# Requirement: html-proofer, jekyll
#
# Usage: See help information
2020-07-28 21:27:40 +03:00
set -eu
PAGES_BRANCH="gh-pages"
SITE_DIR="_site"
_opt_dry_run=false
_config="_config.yml"
_no_pages_branch=false
2020-09-01 06:53:14 +03:00
_backup_dir="$(mktemp -d)"
2020-07-28 21:27:40 +03:00
_baseurl=""
help() {
echo "Build, test and then deploy the site content to 'origin/<pages_branch>'"
echo
echo "Usage:"
echo
echo " bash ./tools/deploy.sh [options]"
echo
echo "Options:"
echo ' -c, --config "<config_a[,config_b[...]]>" Specify config file(s)'
echo " --dry-run Build site and test, but not deploy"
echo " -h, --help Print this information."
}
2020-09-01 06:53:14 +03:00
init() {
if [[ -z ${GITHUB_ACTION+x} && $_opt_dry_run == 'false' ]]; then
echo "ERROR: It is not allowed to deploy outside of the GitHub Action envrionment."
echo "Type option '-h' to see the help information."
exit -1
fi
_baseurl="$(grep '^baseurl:' _config.yml | sed "s/.*: *//;s/['\"]//g;s/#.*//")"
}
build() {
# clean up
if [[ -d $SITE_DIR ]]; then
rm -rf "$SITE_DIR"
fi
# build
JEKYLL_ENV=production bundle exec jekyll b -d "$SITE_DIR$_baseurl" --config "$_config"
}
test() {
bundle exec htmlproofer \
--disable-external \
--check-html \
--allow_hash_href \
"$SITE_DIR"
}
resume_site_dir() {
if [[ -n $_baseurl ]]; then
# Move the site file to the regular directory '_site'
mv "$SITE_DIR$_baseurl" "${SITE_DIR}-rename"
rm -rf "$SITE_DIR"
mv "${SITE_DIR}-rename" "$SITE_DIR"
fi
}
setup_gh() {
2020-09-01 06:53:14 +03:00
if [[ -z $(git branch -av | grep "$PAGES_BRANCH") ]]; then
_no_pages_branch=true
2020-09-01 06:53:14 +03:00
git checkout -b "$PAGES_BRANCH"
else
git checkout "$PAGES_BRANCH"
fi
}
2020-07-28 21:27:40 +03:00
2020-09-01 06:53:14 +03:00
backup() {
mv "$SITE_DIR"/* "$_backup_dir"
2020-09-01 06:53:14 +03:00
mv .git "$_backup_dir"
2020-07-28 21:27:40 +03:00
2020-09-01 09:54:29 +03:00
# When adding custom domain from Github website,
2020-09-01 06:53:14 +03:00
# the CANME only exist on `gh-pages` branch
2020-09-01 09:54:29 +03:00
if [[ -f CNAME ]]; then
2020-09-01 06:53:14 +03:00
mv CNAME "$_backup_dir"
2020-09-01 09:54:29 +03:00
fi
2020-09-01 06:53:14 +03:00
}
2020-07-28 21:27:40 +03:00
2020-09-01 06:53:14 +03:00
flush() {
rm -rf ./*
rm -rf .[^.] .??*
2020-07-28 21:27:40 +03:00
2020-09-01 06:53:14 +03:00
shopt -s dotglob nullglob
mv "$_backup_dir"/* .
}
2020-07-28 21:27:40 +03:00
deploy() {
2020-09-01 06:53:14 +03:00
git config --global user.name "GitHub Actions"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
2020-07-28 21:27:40 +03:00
2020-09-01 06:53:14 +03:00
git update-ref -d HEAD
git add -A
git commit -m "[Automation] Site update No.${GITHUB_RUN_NUMBER}"
if $_no_pages_branch; then
2020-09-01 06:53:14 +03:00
git push -u origin "$PAGES_BRANCH"
else
git push -f
fi
}
main() {
init
build
test
resume_site_dir
if $_opt_dry_run; then
exit 0
fi
setup_gh
2020-09-01 06:53:14 +03:00
backup
flush
deploy
2020-09-01 06:53:14 +03:00
}
while (($#)); do
opt="$1"
case $opt in
-c | --config)
_config="$2"
shift
shift
;;
--dry-run)
# build & test, but not deploy
_opt_dry_run=true
shift
;;
-h | --help)
help
exit 0
;;
*)
# unknown option
help
exit 1
;;
esac
done
2020-09-01 06:53:14 +03:00
main