fsfe-website/build/buildrun.sh
delliott bb45fc85ba
All checks were successful
continuous-integration/drone/push Build is passing
feat/build-improvements-2 (#4553)
Another attempt at #4516

Adds a small fix for tag map generation

#4516 introduces build failures, but testing indicates that those failures would have been resolved by a full rebuild.

Hence this pr.

Co-authored-by: Darragh Elliott <me@delliott.xyz>
Reviewed-on: #4553
Co-authored-by: delliott <delliott@fsfe.org>
Co-committed-by: delliott <delliott@fsfe.org>
2024-10-29 14:56:41 +00:00

141 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
inc_buildrun=true
[ -z "$inc_makerules" ] && . "$basedir/build/makerules.sh"
[ -z "$inc_logging" ] && . "$basedir/build/logging.sh"
[ -z "$inc_misc" ] && . "$basedir/build/misc.sh"
match() {
printf %s "$1" | egrep -q "$2"
}
dir_maker() {
# set up directory tree for output
# optimise by only issuing mkdir commands
# for leaf directories
input="${1%/}"
output="${2%/}"
curpath="$output"
find "$input" -depth -type d \
-regex "$input/[a-z\.]+\.[a-z]+\(/.*\)?" \
-printf '%P\n' |
while read -r filepath; do
oldpath="$curpath"
curpath="$output/$filepath/"
match "$oldpath" "^$curpath" || mkdir -p "$curpath"
done
}
# The actual build
buildrun() {
set -o pipefail
printf %s "$start_time" >"$(logname start_time)"
ncpu="$(grep -c ^processor /proc/cpuinfo)"
[ -f "$(logname lasterror)" ] && rm "$(logname lasterror)"
[ -f "$(logname debug)" ] && rm "$(logname debug)"
{
echo "Starting phase 1" &&
make --silent --directory="$basedir" build_env="${build_env}" languages="$languages" 2>&1 &&
echo "Finishing phase 1" ||
die "Error during phase 1"
} | t_logstatus phase_1 || exit 1
dir_maker "$basedir" "$stagedir" || exit 1
forcelog Makefile
{
tree_maker "$basedir" "$stagedir" 2>&1 ||
die "Error during phase 2 Makefile generation"
} >"$(logname Makefile)" || exit 1
{
echo "Starting phase 2" &&
make --silent --jobs=$ncpu --file="$(logname Makefile)" 2>&1 &&
echo "Finishing phase 2" ||
die "Error during phase 2"
} | t_logstatus phase_2 || exit 1
if [ "$stagedir" != "$target" ]; then
# rsync issues a "copying unsafe symlink" message for each of the "unsafe"
# symlinks which we copy while rsyncing. These messages are issued even if
# the files have not changed and clutter up the output, so we filter them
# out.
{
for destination in ${target//,/ }; do
echo "Syncing files to $(echo "$destination" | grep -Po "(?<=@)[^:]+")"
rsync -av --copy-unsafe-links --del --exclude "status.fsfe.org/*fsfe.org/data" "$stagedir/" "$destination/" | grep -v "copying unsafe symlink"
done
} | t_logstatus stagesync
fi
date +%s >"$(logname end_time)"
if [ -n "$statusdir" ]; then
(
cd "$statusdir"/..
./index.cgi | tail -n+3 >"$statusdir"/status_$(date +%s).html
)
fi
}
# Update git (try 3x) and then do an actual build
git_build_into() {
forcelog GITchanges
GITchanges="$(logname GITchanges)"
forcelog GITerrors
GITerrors="$(logname GITerrors)"
gitterm=1
i=0
while [[ ($gitterm -ne 0) && ($i -lt 3) ]]; do
((i++))
git -C "$basedir" pull >"$GITchanges" 2>"$GITerrors"
gitterm="$?"
if [ $gitterm -ne 0 ]; then
debug "Git pull unsuccessful. Trying again in a few seconds."
sleep $(shuf -i 10-30 -n1)
fi
done
if [ "$gitterm" -ne 0 ]; then
debug "Three git pulls failed, hard resetting and repulling"
git -C "$basedir" reset --hard HEAD~50 >"$GITchanges" 2>"$GITerrors"
git -C "$basedir" pull >>"$GITchanges" 2>>"$GITerrors"
gitterm="$?"
fi
if [ "$gitterm" -ne 0 ]; then
die "GIT reported the following problem:\n$(cat "$GITerrors")"
fi
if egrep '^Already up[ -]to[ -]date' "$GITchanges"; then
debug "No changes to GIT:\n$(cat "$GITchanges")"
# Exit status should only be 0 if there was a successful build.
# So set it to 1 here.
exit 1
fi
logstatus GITlatest <"$GITchanges"
buildrun
}
# Clean up everything and then do an actual (full) build
build_into() {
# Clean up source directory.
git -C "${basedir}" clean -dxf --exclude=status.fsfe.org/translations/data
# Remove old stage directory.
rm -rf "${stagedir}"
buildrun
}