From b68a5abf6528c2b69b7196bd7c5ae9f766fad97b Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Mon, 2 Sep 2019 10:41:21 +0100 Subject: [PATCH] snap seeding: Defer validation for regular image builds When getting the list of snaps to include on an image via germinate, we process the snaps in alphabetical order. Currently we seed several packages `gnome-foo` and also `gtk-common-themes`, the default provider of `gtk-3-themes`. Since `gtk-common-themes` is alphabetically after `gnome-foo`, the `seed.yaml` we generate is invalid when we are part way through generating. What we really care about, though, is not that the `seed.yaml` is always valid at every step, but it is that it is valid at the *end* of seeding. So for the germinate case, let's defer validation to happen once at the end. Other callsites of `snap_preseed`, where callers are careful to seed snaps in the right order, are unaffected by this. --- live-build/auto/build | 5 +++-- live-build/functions | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/live-build/auto/build b/live-build/auto/build index 17c5e228..a625c336 100755 --- a/live-build/auto/build +++ b/live-build/auto/build @@ -83,10 +83,11 @@ Setup_cleanup preinstall_snaps() { lb chroot_resolv install snap_prepare chroot - + for snap in "$@"; do - snap_preseed chroot "${snap}" + SNAP_NO_VALIDATE_SEED=1 snap_preseed chroot "${snap}" done + snap_validate_seed chroot lb chroot_resolv remove } diff --git a/live-build/functions b/live-build/functions index ee2bc2f8..9bbab33a 100644 --- a/live-build/functions +++ b/live-build/functions @@ -650,13 +650,22 @@ snap_preseed() { ;; esac - # Do basic validation of generated snapd seed.yaml, doing it here # means we catch all the places(tm) that snaps are added but the # downside is that each time a snap is added the seed must be valid, - # i.e. snaps with bases need to add bases first etc. - if [ -e chroot/var/lib/snapd/seed/seed.yaml ]; then - snap debug validate-seed "$CHROOT_ROOT/var/lib/snapd/seed/seed.yaml" + # i.e. snaps with bases need to add bases first etc + # + # Skip validation by setting SNAP_NO_VALIDATE_SEED=1. + if [ -z "${SNAP_NO_VALIDATE_SEED}" ]; then + snap_validate_seed "${CHROOT_ROOT}" + fi +} + +snap_validate_seed() { + local CHROOT_ROOT=$1 + + if [ -e "${CHROOT_ROOT}/var/lib/snapd/seed/seed.yaml" ]; then + snap debug validate-seed "${CHROOT_ROOT}/var/lib/snapd/seed/seed.yaml" fi }