https://gitlab.com/fedora/docs/templates/fedora-docs-template Initial Commit switch to Antora Preview of the whole site preview.sh: Allow preview.sh keep running for multiple build.sh calls antora deletes and recreates public/ every time the docs are rebuilt; mounting public/ directly meant that when build.sh, the existing nginx container didn't see the new docs. Instead of mounting public/ directly into the nginx default webroot, mount the parent directory at /antora, and install a tiny nginx configuration file to point the webroot at the right place. fix preview.sh for macOS Issue 3 - Check if sudo is really required to run docker Provide better messages on the command line deduplicate and in build.sh Use podman as an option for local build/preview docs The podman binary is an alternative to docker that might be used by some people in preference. In this use case it's a drop in replacement, we can just check for it, else we just use docker as before. Signed-off-by: Peter Robinson <pbrobinson@gmail.com> using podman on Fedora — root not required anymore Add workaround for --directory flag breaking in preview.sh script Closes #13. authors example Add LICENSE It's oven not owen Replace test == operator with = The == operator of test (invoked as [) is a Bash extension. Use the = operator of [POSIX test] for string equality. [POSIX test]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html Signed-off-by: Kevin Locke <kevin@kevinlocke.name> Quote command substitution which may have spaces If $(pwd) or $(uname -s) contain spaces, their output will undergo word splitting and be passed as multiple arguments, which would cause the programs receiving them to misbehave. Avoid this by quoting. Signed-off-by: Kevin Locke <kevin@kevinlocke.name> Fix misspellings build.sh: fix misspelling and replace tab with spaces Some lines had tabs, others had spaces. Uniformizing for spaces. Add proper partials and examples directories with usage notes Fix typo in README Update build script for Aarch64 and local antora installs Fix if conditions in build.sh Earlier comment removed quotation from around command substitions $(). This is not a good idea, because if the substitution produces whitespace, without the quotes, the result is not interpreted as a single string. Pattern 'if [ $(uname) == "foo" ]' is replaced with 'uname | grep -iwq foo' here. Apart from following good shell scripting practices, this commit fixes the problem where the script failed if the current working directory's patch contained whitespace. Fix the Linux docker branch of build.sh There were multiple problems in the Linux docker branch of build.sh: - Intendation was wrong - There was a reference to undefined variable $runtime, leading to corrupted output. - Output had strange linebreaks. Fix intendation in build.sh error branch Use `version: ~` in antora.yml Antora 3 has deprecated `version: master`. Replacing it with a current alternative. Update configuration for Antora 3.0 Whitespace and formating cleanup build.sh: Properly quote all variables Fix overquoting for ${cmd} Fixes: ``` $ ./build.sh This build script is using Podman to run the build in an isolated environment. antora: option '--html-url-extension-style <choice>' argument 'indexify site.yml' is invalid. Allowed choices are default, drop, indexify. ``` update antora playbook add preview pages remove indexify extension from args build.sh: Fix overquoting again Missed in7d3a02badd content related issue template update antora config & CI workflow Update and correct licensing information site.yaml: Use indexify mode for URLs Official Fedora docs use that extension thus keep using it for local preview. Fixes: https://gitlab.com/fedora/docs/templates/fedora-docs-template/-/issues/4 This reworks commitbca134e1c0. Improve .gitignore The intent of existing .gitignore was to ignore some directories at repository root. Instead, it was ignoring any file or directory by given names, anywhere in the tree. Improve rules to only match the intended cases. feat: add new builder script feat(docsbuilder.sh): add MIT license Fixes https://gitlab.com/fedora/docs/templates/fedora-docs-template/-/issues/5 docsbuilder: chmod a+x Update README.md with docsbuilder command Adding podman to the description. docsbuilder: Use command to find binaries in PATH Do not assume that commands are installed in a specific PATH and use `command` instead to find them. This makes running this inside toolbox works. README: Re-add nginx.conf and update for osbuilder script Use custom Antora image
292 lines
9.5 KiB
Bash
Executable file
292 lines
9.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# script to watch source directory for changes, and re-run build and preview
|
|
#
|
|
# License: MIT
|
|
# https://fedoraproject.org/wiki/Licensing:MIT#Another_Minimal_variant_(found_in_libatomic_ops)
|
|
#
|
|
# Copyright (c) Fedora community contributors.
|
|
#
|
|
# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED OR
|
|
# IMPLIED. ANY USE IS AT YOUR OWN RISK.
|
|
#
|
|
# Permission is hereby granted to use or copy this program for any purpose,
|
|
# provided the above notices are retained on all copies. Permission to modify
|
|
# the code and to distribute modified code is granted, provided the above
|
|
# notices are retained, and a notice that the code was modified is included
|
|
# with the above copyright notice.
|
|
|
|
|
|
script_name="docsbuilder.sh"
|
|
script_source="https://gitlab.com/fedora/docs/templates/fedora-docs-template/-/raw/main/${script_name}"
|
|
version="1.2.0"
|
|
image="registry.gitlab.com/fedora/docs/docs-website/docs-fp-o:latest"
|
|
cmd="--html-url-extension-style=indexify site.yml"
|
|
srcdir="modules"
|
|
buildir="public"
|
|
previewpidfile="preview.pid"
|
|
|
|
# 4913: for vim users, vim creates a temporary file to test it can write to
|
|
# directory
|
|
# https://groups.google.com/g/vim_dev/c/sppdpElxY44
|
|
# .git: so we don't get rebuilds each time git metadata changes
|
|
inotifyignore="\.git.*|4913"
|
|
|
|
watch_and_build () {
|
|
if ! command -v inotifywait > /dev/null
|
|
then
|
|
echo "inotifywait command could not be found. Please install inotify-tools."
|
|
echo "On Fedora, run: sudo dnf install inotify-tools"
|
|
stop_preview_and_exit
|
|
else
|
|
# check for git
|
|
# required to get ignorelist
|
|
if ! command -v git > /dev/null
|
|
then
|
|
echo "git command could not be found. Please install git."
|
|
echo "On Fedora, run: sudo dnf install git-core"
|
|
stop_preview_and_exit
|
|
else
|
|
# Get files not being tracked, we don't watch for changes in these.
|
|
# Could hard code, but people use different editors that may create
|
|
# temporary files that are updated regularly and so on, so better
|
|
# to get the list from git. It'll also look at global gitingore
|
|
# settings and so on.
|
|
inotifyignore="$(git status -s --ignored | grep '^!!' | sed -e 's/^!! //' | tr '\n' '|')${inotifyignore}"
|
|
fi
|
|
|
|
while true
|
|
do
|
|
echo "Watching current directory (excluding: ${inotifyignore}) for changes and re-building as required. Use Ctrl C to stop."
|
|
inotifywait -q --exclude "($inotifyignore)" -e modify,create,delete,move -r . && echo "Change detected, rebuilding.." && build
|
|
done
|
|
fi
|
|
}
|
|
|
|
build () {
|
|
if [ "$(uname)" == "Darwin" ]; then
|
|
# Running on macOS.
|
|
# Let's assume that the user has the Docker CE installed
|
|
# which doesn't require a root password.
|
|
echo ""
|
|
echo "This build script is using Docker container runtime to run the build in an isolated environment."
|
|
echo ""
|
|
docker run --rm -it -v $(pwd):/antora $image $cmd
|
|
|
|
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
|
# Running on Linux.
|
|
# Check whether podman is available, else faill back to docker
|
|
# which requires root.
|
|
|
|
if [ -n "$(command -v podman)" ]; then
|
|
echo ""
|
|
echo "This build script is using Podman to run the build in an isolated environment."
|
|
echo ""
|
|
podman run --rm -it -v $(pwd):/antora:z $image $cmd --stacktrace
|
|
|
|
elif [ -n "$(command -v docker)" ]; then
|
|
echo ""
|
|
echo "This build script is using Docker to run the build in an isolated environment."
|
|
echo ""
|
|
|
|
if groups | grep -wq "docker"; then
|
|
docker run --rm -it -v $(pwd):/antora:z $image $cmd
|
|
else
|
|
echo ""
|
|
echo "This build script is using $runtime to run the build in an isolated environment. You might be asked for your password."
|
|
echo "You can avoid this by adding your user to the 'docker' group, but be aware of the security implications. See https://docs.docker.com/install/linux/linux-postinstall/."
|
|
echo ""
|
|
sudo docker run --rm -it -v $(pwd):/antora:z $image $cmd
|
|
fi
|
|
|
|
else
|
|
echo ""
|
|
echo "Error: Container runtime haven't been found on your system. Fix it by:"
|
|
echo "$ sudo dnf install podman"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
start_preview () {
|
|
|
|
# clean up a preview that may be running
|
|
stop_preview
|
|
|
|
# always run an initial build so preview shows latest version
|
|
build
|
|
|
|
if [ "$(uname)" == "Darwin" ]; then
|
|
# Running on macOS.
|
|
# Let's assume that the user has the Docker CE installed
|
|
# which doesn't require a root password.
|
|
echo "The preview will be available at http://localhost:8080/"
|
|
docker run --rm -v $(pwd):/antora:ro -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro -p 8080:80 nginx
|
|
|
|
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
|
# Running on Linux.
|
|
# Fedora Workstation has python3 installed as a default, so using that
|
|
echo ""
|
|
echo "The preview is available at http://localhost:8080"
|
|
echo ""
|
|
pushd "${buildir}" > /dev/null 2>&1
|
|
python3 -m http.server 8080 &
|
|
echo "$!" > ../"${previewpidfile}"
|
|
popd > /dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
stop_preview () {
|
|
if [ -e "${previewpidfile}" ]
|
|
then
|
|
PID=$(cat "${previewpidfile}")
|
|
kill $PID
|
|
echo "Stopping preview server (running with PID ${PID}).."
|
|
rm -f "${previewpidfile}"
|
|
else
|
|
echo "No running preview server found to stop: no ${previewpidfile} file found."
|
|
fi
|
|
}
|
|
|
|
stop_preview_and_exit ()
|
|
{
|
|
# stop and also exit the script
|
|
|
|
# if stop_preview is trapped, then SIGINT doesn't stop the build loop. So
|
|
# we need to make sure we also exit the script.
|
|
|
|
# stop_preview is called before other functions, so we cannot add exit to
|
|
# it.
|
|
stop_preview
|
|
exit 0
|
|
}
|
|
|
|
|
|
# https://apple.stackexchange.com/questions/83939/compare-multi-digit-version-numbers-in-bash/123408#123408
|
|
version () { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
|
|
|
|
|
|
check_update () {
|
|
if ! command -v curl > /dev/null
|
|
then
|
|
echo "curl command could not be found. Please install curl."
|
|
echo "On Fedora, run: sudo dnf install curl"
|
|
exit 0
|
|
fi
|
|
script_version="$(grep "^version=" ${script_name} | cut -d '=' -f2 | tr --delete '"')"
|
|
tempdir="$(mktemp -d)"
|
|
echo "$tempdir"
|
|
pushd "$tempdir" > /dev/null 2>&1
|
|
curl "$script_source" --silent --output "${script_name}"
|
|
upstream_version="$(grep "^version=" ${script_name} | cut -d '=' -f2 | tr --delete '"')"
|
|
echo "${upstream_version}"
|
|
if [ $(version $upstream_version) -gt $(version $script_version) ]; then
|
|
echo "Update available"
|
|
echo "Script version $upstream_version is available at $script_source"
|
|
echo "This version is $script_version."
|
|
echo "Please use the '-U' option to update."
|
|
echo
|
|
fi
|
|
popd > /dev/null 2&>1
|
|
}
|
|
|
|
install_update () {
|
|
if ! command -v curl > /dev/null
|
|
then
|
|
echo "curl command could not be found. Please install curl."
|
|
echo "On Fedora, run: sudo dnf install curl"
|
|
exit 0
|
|
fi
|
|
curl "$script_source" --silent --output "${script_name}.new"
|
|
mv "${script_name}.new" "${script_name}"
|
|
chmod +x "${script_name}"
|
|
}
|
|
|
|
usage() {
|
|
echo "$0: Build and preview Fedora antora based documentation"
|
|
echo
|
|
echo "Usage: $0 [-awbpkh]"
|
|
echo
|
|
echo "-a: start preview, start watcher and rebuilder"
|
|
echo "-w: start watcher and rebuilder"
|
|
echo "-b: rebuild"
|
|
echo "-p: start_preview"
|
|
echo "-k: stop_preview"
|
|
echo "-h: print this usage text and exit"
|
|
echo "-u: check builder script update"
|
|
echo "-U: install builder script from upstream"
|
|
echo
|
|
echo "Maintained by the Fedora documentation team."
|
|
echo "Please contact on our channels: https://docs.fedoraproject.org/en-US/fedora-docs/#find-docs"
|
|
}
|
|
|
|
# check if the script is being run in a Fedora docs repository
|
|
if [ ! -e "site.yml" ]
|
|
then
|
|
echo "site.yml not be found."
|
|
echo "This does not appear to be a Fedora Antora based documentation repository."
|
|
echo "Exiting."
|
|
echo
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
|
|
if [ $# -lt 1 ]
|
|
then
|
|
echo "No options provided, running preview with watch and build."
|
|
echo "Run script with '-h' to see all available options."
|
|
echo
|
|
echo
|
|
trap stop_preview_and_exit INT
|
|
start_preview
|
|
watch_and_build
|
|
stop_preview
|
|
fi
|
|
|
|
# parse options
|
|
while getopts "awbpkhuU" OPTION
|
|
do
|
|
case $OPTION in
|
|
a)
|
|
# handle sig INT to stop the preview
|
|
trap stop_preview_and_exit INT
|
|
start_preview
|
|
watch_and_build
|
|
stop_preview
|
|
exit 0
|
|
;;
|
|
w)
|
|
watch_and_build
|
|
exit 0
|
|
;;
|
|
b)
|
|
build
|
|
exit 0
|
|
;;
|
|
p)
|
|
start_preview
|
|
echo "Please run ./${script_name} -k to stop the preview server"
|
|
exit 0
|
|
;;
|
|
k)
|
|
stop_preview
|
|
exit 0
|
|
;;
|
|
h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
u)
|
|
check_update
|
|
exit 0
|
|
;;
|
|
U)
|
|
install_update
|
|
exit 0
|
|
;;
|
|
?)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|