From da36f1b3d8ae77d4b39c745b069863408c5cdf41 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 8 Sep 2023 10:51:12 -0400 Subject: [PATCH] Update build_release script to update the virtual machine OS. --- ansible/roles/build/templates/src.conf.j2 | 2 +- .../files/build_release.bash | 118 +++++++++++++++++- .../freebsd_update_server/tasks/freebsd.yaml | 2 + 3 files changed, 116 insertions(+), 6 deletions(-) diff --git a/ansible/roles/build/templates/src.conf.j2 b/ansible/roles/build/templates/src.conf.j2 index 1311334..d4d2396 100644 --- a/ansible/roles/build/templates/src.conf.j2 +++ b/ansible/roles/build/templates/src.conf.j2 @@ -5,7 +5,7 @@ KERNCONF=CUSTOM WITH_MALLOC_PRODUCTION=YES WITHOUT_LLVM_ASSERTIONS=YES WITH_REPRODUCIBLE_BUILD=YES -PORTS_MODULES+=graphics/drm-510-kmod +PORTS_MODULES+=graphics/drm-kmod PORTS_MODULES+=graphics/gpu-firmware-intel-kmod PORTS_MODULES+=net/wireguard-kmod diff --git a/ansible/roles/freebsd_update_server/files/build_release.bash b/ansible/roles/freebsd_update_server/files/build_release.bash index 90c53ac..92cc305 100644 --- a/ansible/roles/freebsd_update_server/files/build_release.bash +++ b/ansible/roles/freebsd_update_server/files/build_release.bash @@ -4,19 +4,127 @@ set -euo pipefail IFS=$'\n\t' DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +: ${DATA_DIRECTORY:="/usr/local/share/freebsdupdate"} +: ${STAGE_FILE:="${DATA_DIRECTORY}/stage"} +: ${RELEASE_DIRECTORY:="${DATA_DIRECTORY}/release"} +: ${LOG_DIRECTORY:="${DATA_DIRECTORY}/logs"} +: ${PORTS_TREE:="/usr/ports"} +: ${PORTS_REPO:="https://git.FreeBSD.org/ports.git"} + +############## Setup ######################### + +function die { + local status_code="$1" + shift + (>&2 echo "${@}") + exit "$status_code" +} + +function log { + (>&2 echo "${@}") +} + +############## Program ######################### + function main { - build_release_script + assert_directories + + local stage="" + if [ -e "$STAGE_FILE" ]; then + local stage=$(cat "$STAGE_FILE") + fi + if [ "$stage" = "selfbuild" ]; then + log_cmd stage_selfbuild + elif [ "$stage" = "selfinstallworld" ]; then + log_cmd stage_selfinstallworld + elif [ "$stage" = "selfconflictcheck" ]; then + log_cmd stage_selfconflictcheck + elif [ "$stage" = "releasebuild" ]; then + log_cmd stage_releasebuild + elif [ "$stage" = "done" ]; then + log_cmd stage_done + else + die 1 "Unhandled stage: \"$stage\"." + fi } -function build_release_script { - /usr/src/release/release.sh -c /opt/freebsd_update_server/release.conf +function log_cmd { + "${@}" |& tee "$LOG_DIRECTORY/$(date +%Y%m%d-%s).log" } -function build_release_manually { +function self_conflict_check { + if etcupdate status | grep -qE '^ C '; then + die 1 'Conflicts remain in etcupdate. Run `etcupdate resolve` to fix them first.' + fi +} + +function assert_directories { + for d in "$DATA_DIRECTORY" "$RELEASE_DIRECTORY" "$LOG_DIRECTORY"; do + if [ ! -e "$d" ]; then + mkdir -p "$d" + fi + done +} + +function update_ports_tree { + if [ ! -e "$PORTS_TREE" ]; then + mkdir -p $PORTS_TREE + git -C $PORTS_TREE init --initial-branch=main + git -C $PORTS_TREE remote add origin $PORTS_REPO + fi + git -C $PORTS_TREE fetch origin main # 'refs/heads/main' + git -C $PORTS_TREE checkout FETCH_HEAD +} + +function set_stage { + echo "${@}" > "$STAGE_FILE" +} + +function stage_selfbuild { + self_conflict_check + assert_directories + update_ports_tree + + SRCCONF=/dev/null __MAKE_CONF=/dev/null make -C /usr/src clean + SRCCONF=/dev/null __MAKE_CONF=/dev/null make -C /usr/src buildworld buildkernel + SRCCONF=/dev/null __MAKE_CONF=/dev/null make -C /usr/src installkernel + + set_stage "selfinstallworld" + /sbin/shutdown -r now +} + +function stage_selfinstallworld { + etcupdate -p + SRCCONF=/dev/null __MAKE_CONF=/dev/null make -C /usr/src installworld + etcupdate -B + + set_stage "selfconflictcheck" + stage_selfconflictcheck +} + +function stage_selfconflictcheck { + self_conflict_check + set_stage "releasebuild" + /sbin/shutdown -r now +} + +function stage_releasebuild { + local today=$(date +%Y%m%d) + local target_directory="${RELEASE_DIRECTORY}/${today}" + if [ -e "$target_directory" ]; then + die 1 "The release directory $target_directory already exists. Exiting." + fi + SRCCONF=/dev/null __MAKE_CONF=/dev/null make -C /usr/src clean make -C /usr/src buildworld buildkernel make -C /usr/src/release obj make -C /usr/src/release release - make -C /usr/src/release install DESTDIR=/where/to/put/the/images + mkdir -p "$target_directory" + make -C /usr/src/release install DESTDIR="$target_directory" + set_stage "done" +} + +function stage_done { + log "Everything is done." } main "${@}" diff --git a/ansible/roles/freebsd_update_server/tasks/freebsd.yaml b/ansible/roles/freebsd_update_server/tasks/freebsd.yaml index e5139a0..68ab5d4 100644 --- a/ansible/roles/freebsd_update_server/tasks/freebsd.yaml +++ b/ansible/roles/freebsd_update_server/tasks/freebsd.yaml @@ -3,6 +3,8 @@ name: - git - tmux # For convenience + - htop # For convenience + - bash state: present - name: Create directories