diff --git a/cmd/build.go b/cmd/build.go index 6271a15..fa28446 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -141,7 +141,7 @@ func build(cmd *cobra.Command, _ []string) error { log.Info("installing package", "name", name, "version", p.Version) // download the package - pkgPath, err := dl.Download(cmd.Context(), p.Resolved) + pkgPath, err := dl.Download(cmd.Context(), airutil.ExpandEnv(p.Resolved)) if err != nil { return err } diff --git a/cmd/lock.go b/cmd/lock.go index d5761c6..16c7104 100644 --- a/cmd/lock.go +++ b/cmd/lock.go @@ -82,6 +82,21 @@ func lock(cmd *cobra.Command, _ []string) error { } } + type expandedRepo struct { + URL string + Original string + } + + var repoList []expandedRepo + for _, v := range cfg.Spec.Repositories { + for _, vv := range v { + repoList = append(repoList, expandedRepo{ + URL: airutil.ExpandEnv(vv.URL), + Original: vv.URL, + }) + } + } + alpineKeeper, err := alpine.NewPackageKeeper(cmd.Context(), repoURLs(cfg.Spec.Repositories[strings.ToLower(string(aybv1.PackageAlpine))])) if err != nil { return err @@ -106,6 +121,14 @@ func lock(cmd *cobra.Command, _ []string) error { for _, p := range packageList { log.Info("downloading package", "name", p.Name) + packageUrl := p.Resolved + for _, r := range repoList { + if strings.HasPrefix(p.Resolved, r.URL) { + packageUrl = strings.ReplaceAll(p.Resolved, r.URL, r.Original) + } + } + + p.Resolved = packageUrl lockFile.Packages[p.Name] = p } } diff --git a/tests/fixtures/scratch_airgap_test-lock.json b/tests/fixtures/scratch_airgap_test-lock.json index 0b2decf..0122795 100644 --- a/tests/fixtures/scratch_airgap_test-lock.json +++ b/tests/fixtures/scratch_airgap_test-lock.json @@ -11,295 +11,295 @@ "alpine-base": { "type": "Alpine", "version": "3.18.3-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-base-3.18.3-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-base-3.18.3-r0.apk", "integrity": "Q10cGs1h9J5440p6BRXhZC8FO7pVg=" }, "alpine-baselayout": { "type": "Alpine", "version": "3.4.3-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-baselayout-3.4.3-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-baselayout-3.4.3-r1.apk", "integrity": "Q1zwvKMnYs1b6ZdPTBJ0Z7D5P3jyA=" }, "alpine-baselayout-data": { "type": "Alpine", "version": "3.4.3-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-baselayout-data-3.4.3-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-baselayout-data-3.4.3-r1.apk", "integrity": "Q1YCAH7jdO2W816b85sUh9Z8av4Cc=" }, "alpine-conf": { "type": "Alpine", "version": "3.16.2-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-conf-3.16.2-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-conf-3.16.2-r0.apk", "integrity": "Q16hoL3MjP2iziMtJfgrGrGkhY1Zw=" }, "alpine-keys": { "type": "Alpine", "version": "2.4-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-keys-2.4-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-keys-2.4-r1.apk", "integrity": "Q17Do9XvTHoWjQlRYJe7MhnKd8FTQ=" }, "alpine-release": { "type": "Alpine", "version": "3.18.3-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/alpine-release-3.18.3-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/alpine-release-3.18.3-r0.apk", "integrity": "Q1u774lD/SabOBKjrk6dKblNnKVdU=" }, "apk-tools": { "type": "Alpine", "version": "2.14.0-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/apk-tools-2.14.0-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/apk-tools-2.14.0-r2.apk", "integrity": "Q1jN4l8jnr9pHNE1o5VOUZPBrCrhM=" }, "binutils": { "type": "Alpine", "version": "2.40-r7", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/binutils-2.40-r7.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/binutils-2.40-r7.apk", "integrity": "Q1YayAMxFpsnglKTXz5kUMuFx5ZlE=" }, "busybox": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-1.36.1-r2.apk", "integrity": "Q1gQ/L3UBnSjgkFWEHQaUkUDubqdI=" }, "busybox-binsh": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-binsh-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-binsh-1.36.1-r2.apk", "integrity": "Q1ng9K4zeuARW5It8leWhwxor0cRQ=" }, "busybox-ifupdown": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-ifupdown-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-ifupdown-1.36.1-r2.apk", "integrity": "Q1SdTAlDCzpbTM7tyi+yDD5Y5bM1I=" }, "busybox-mdev-openrc": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-mdev-openrc-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-mdev-openrc-1.36.1-r2.apk", "integrity": "Q1l1zKfiXCTrXV0ByR4WSgpyYDRGQ=" }, "busybox-openrc": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-openrc-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-openrc-1.36.1-r2.apk", "integrity": "Q1g4rNpK1QgIFeVljCoUfYX3ANMH4=" }, "busybox-suid": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/busybox-suid-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/busybox-suid-1.36.1-r2.apk", "integrity": "Q1RuyvI6dpYDjM9vDCDLJH+U5FXLs=" }, "ca-certificates-bundle": { "type": "Alpine", "version": "20230506-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/ca-certificates-bundle-20230506-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/ca-certificates-bundle-20230506-r0.apk", "integrity": "Q1R/SF0IZwqesh6/EOcK5l3EOrbD0=" }, "coreutils": { "type": "Alpine", "version": "9.3-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/coreutils-9.3-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/coreutils-9.3-r1.apk", "integrity": "Q1f60fZgsiTgS1arM7yXQeyqHk5y0=" }, "findutils": { "type": "Alpine", "version": "4.9.0-r5", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/findutils-4.9.0-r5.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/findutils-4.9.0-r5.apk", "integrity": "Q11xYFzlmryexiQp9QXhrLQ6C3Gxo=" }, "grep": { "type": "Alpine", "version": "3.10-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/grep-3.10-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/grep-3.10-r1.apk", "integrity": "Q1Fv02dFAdFUjKrD015RkP2D/Cd+E=" }, "iproute2": { "type": "Alpine", "version": "6.3.0-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/iproute2-6.3.0-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/iproute2-6.3.0-r0.apk", "integrity": "Q1is5t9X9/zihKAT385sfAdcnc1KY=" }, "iproute2-minimal": { "type": "Alpine", "version": "6.3.0-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/iproute2-minimal-6.3.0-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/iproute2-minimal-6.3.0-r0.apk", "integrity": "Q1LnifnASXBpuDEnYsXk40KpHsL4g=" }, "iproute2-ss": { "type": "Alpine", "version": "6.3.0-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/iproute2-ss-6.3.0-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/iproute2-ss-6.3.0-r0.apk", "integrity": "Q1+etLo1zZk4DDWIE4jo1X7sn7ob0=" }, "iproute2-tc": { "type": "Alpine", "version": "6.3.0-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/iproute2-tc-6.3.0-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/iproute2-tc-6.3.0-r0.apk", "integrity": "Q11WtAYqfKXpLC80WdgEMOvJOJRq4=" }, "iptables": { "type": "Alpine", "version": "1.8.9-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/iptables-1.8.9-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/iptables-1.8.9-r2.apk", "integrity": "Q1FWqmPPDxQJS3fhQlLfXgzRlC6Fg=" }, "libacl": { "type": "Alpine", "version": "2.3.1-r3", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libacl-2.3.1-r3.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libacl-2.3.1-r3.apk", "integrity": "Q1dT3NgXwAGQkUX/tOwTpxQMOyEGk=" }, "libattr": { "type": "Alpine", "version": "2.5.1-r4", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libattr-2.5.1-r4.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libattr-2.5.1-r4.apk", "integrity": "Q1pBCBHCW9JyLiQrMUlyp7tWVJiwk=" }, "libbz2": { "type": "Alpine", "version": "1.0.8-r5", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libbz2-1.0.8-r5.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libbz2-1.0.8-r5.apk", "integrity": "Q1v13gWmLEhB4wJ6i0S77ZTIkSSDU=" }, "libc-utils": { "type": "Alpine", "version": "0.7.2-r5", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libc-utils-0.7.2-r5.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libc-utils-0.7.2-r5.apk", "integrity": "Q1Llna/ri8oHhlQIRsaG8SGug0ikI=" }, "libcap2": { "type": "Alpine", "version": "2.69-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libcap2-2.69-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libcap2-2.69-r0.apk", "integrity": "Q1x2rIM8+ePWI5y9o1VKMEaJR0M7E=" }, "libcrypto3": { "type": "Alpine", "version": "3.1.3-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libcrypto3-3.1.3-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libcrypto3-3.1.3-r0.apk", "integrity": "Q1+hLHhXUQEYytDHHiaVNhV0493Ts=" }, "libelf": { "type": "Alpine", "version": "0.189-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libelf-0.189-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libelf-0.189-r2.apk", "integrity": "Q1fSyWjVNDJiJLJjHqgfNRi77A/bA=" }, "libgcc": { "type": "Alpine", "version": "12.2.1_git20220924-r10", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libgcc-12.2.1_git20220924-r10.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libgcc-12.2.1_git20220924-r10.apk", "integrity": "Q1vaf5owBu4zZv4k9JHE5inhNZaGQ=" }, "libmnl": { "type": "Alpine", "version": "1.0.5-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libmnl-1.0.5-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libmnl-1.0.5-r1.apk", "integrity": "Q1i06QucxuCP7iMSS2xUWUg5pl380=" }, "libnftnl": { "type": "Alpine", "version": "1.2.5-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libnftnl-1.2.5-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libnftnl-1.2.5-r1.apk", "integrity": "Q1uqInEpSBm/yAWppw/n0gcYQZVMA=" }, "libssl3": { "type": "Alpine", "version": "3.1.3-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libssl3-3.1.3-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libssl3-3.1.3-r0.apk", "integrity": "Q1zrNyIdDwInJ5HULlg7lSAxvLeVc=" }, "libstdc++": { "type": "Alpine", "version": "12.2.1_git20220924-r10", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/libstdc++-12.2.1_git20220924-r10.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/libstdc++-12.2.1_git20220924-r10.apk", "integrity": "Q1R8OXClfEGAan000NGiz07ag9AIU=" }, "mdev-conf": { "type": "Alpine", "version": "4.5-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/mdev-conf-4.5-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/mdev-conf-4.5-r0.apk", "integrity": "Q1KvlFL2qWRoICq2oCHqEWqHEhjDk=" }, "musl": { "type": "Alpine", "version": "1.2.4-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/musl-1.2.4-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/musl-1.2.4-r1.apk", "integrity": "Q12qHLEadu7QpBuz8kHB5EDF3mKB4=" }, "musl-fts": { "type": "Alpine", "version": "1.2.7-r5", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/musl-fts-1.2.7-r5.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/musl-fts-1.2.7-r5.apk", "integrity": "Q1sFhXJJRMV+7nuvoZciXfW6JJEhQ=" }, "musl-utils": { "type": "Alpine", "version": "1.2.4-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/musl-utils-1.2.4-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/musl-utils-1.2.4-r1.apk", "integrity": "Q1x4sUHXjWjUzYP5FPvJL1HWBjL1M=" }, "openrc": { "type": "Alpine", "version": "0.48-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/openrc-0.48-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/openrc-0.48-r0.apk", "integrity": "Q1PZgyHSNtQRx3Zi9Azv7WWcCVWUA=" }, "pcre2": { "type": "Alpine", "version": "10.42-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/pcre2-10.42-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/pcre2-10.42-r1.apk", "integrity": "Q1GVvOXp8moLoU9GDN9SGWx+OH8oI=" }, "scanelf": { "type": "Alpine", "version": "1.3.7-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/scanelf-1.3.7-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/scanelf-1.3.7-r1.apk", "integrity": "Q14nq9o4+uo2NaLbTVDQB3UeooC0M=" }, "skalibs": { "type": "Alpine", "version": "2.13.1.1-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/skalibs-2.13.1.1-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/skalibs-2.13.1.1-r1.apk", "integrity": "Q1glnmuqMZfoGd5sOZKfEJnYV7vfQ=" }, "ssl_client": { "type": "Alpine", "version": "1.36.1-r2", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/ssl_client-1.36.1-r2.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/ssl_client-1.36.1-r2.apk", "integrity": "Q1j6LHWpavmnFtpYjzQkH7apSIVOc=" }, "util-linux": { "type": "Alpine", "version": "2.38.1-r8", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/util-linux-2.38.1-r8.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/util-linux-2.38.1-r8.apk", "integrity": "Q1SlxAHbTBQX92L3f0Rtf061q4jeE=" }, "utmps-libs": { "type": "Alpine", "version": "0.1.2.1-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/utmps-libs-0.1.2.1-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/utmps-libs-0.1.2.1-r1.apk", "integrity": "Q1bA7o9NfM0+FHYiB1/oK72Bl1b7k=" }, "xz-libs": { "type": "Alpine", "version": "5.4.3-r0", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/xz-libs-5.4.3-r0.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/xz-libs-5.4.3-r0.apk", "integrity": "Q1mtV1/ZRayPbsAAEYrhTsWQTMuho=" }, "zlib": { "type": "Alpine", "version": "1.2.13-r1", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/zlib-1.2.13-r1.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/zlib-1.2.13-r1.apk", "integrity": "Q1JlboSJkrN4qkDcokr4zenpcWEXQ=" }, "zstd-libs": { "type": "Alpine", "version": "1.5.5-r4", - "resolved": "https://mirror.aarnet.edu.au/pub/alpine/v3.18/main/x86_64/zstd-libs-1.5.5-r4.apk", + "resolved": "${ALPINE_MIRROR:-https://mirror.aarnet.edu.au/pub/alpine}/v3.18/main/x86_64/zstd-libs-1.5.5-r4.apk", "integrity": "Q1g9irJ/T9RyWhRyRfidB2qpa1ImI=" } }