From f4cf35665f953549e3b636fdbeb03e73e670cbdc Mon Sep 17 00:00:00 2001 From: devpow112 Date: Sat, 21 Mar 2026 22:09:16 -0400 Subject: [PATCH] Restructure how we manage ubuntu releases --- .github/dependabot.yml | 69 +--- .github/labeler.yml | 4 +- .github/scripts/update-packages.sh | 10 +- .github/workflows/backport.yml | 38 --- .github/workflows/pull-request.yml | 318 ++++++++++++------ .github/workflows/release.yml | 51 ++- .github/workflows/update-license.yml | 12 +- .github/workflows/update-packages.yml | 23 +- .github/workflows/update-s6-overlay.yml | 27 +- README.md | 34 +- .dockerignore => releases/focal/.dockerignore | 0 releases/focal/Dockerfile | 104 ++++++ releases/focal/packages/generated/install.txt | 38 +++ .../focal/packages}/required.txt | 0 .../focal/packages}/temporary.txt | 0 releases/focal/platforms.txt | 6 + .../dependencies.d/base-set-up-user | 0 .../s6-rc.d/base-apply-permissions/run | 0 .../s6-rc.d/base-apply-permissions/timeout-up | 0 .../s6-rc.d/base-apply-permissions/type | 0 .../s6-rc.d/base-apply-permissions/up | 0 .../base-set-up-timezone/dependencies.d/base | 0 .../s6-rc.d/base-set-up-timezone/run | 0 .../s6-rc.d/base-set-up-timezone/timeout-up | 0 .../s6-rc.d/base-set-up-timezone/type | 0 .../s6-rc.d/base-set-up-timezone/up | 0 .../base-set-up-user/dependencies.d/base | 0 .../s6-overlay/s6-rc.d/base-set-up-user/run | 0 .../s6-rc.d/base-set-up-user/timeout-up | 0 .../s6-overlay/s6-rc.d/base-set-up-user/type | 0 .../s6-overlay/s6-rc.d/base-set-up-user/up | 0 {test => releases/focal/test}/.dockerignore | 0 {test => releases/focal/test}/Dockerfile | 0 .../dependencies.d/base-apply-permissions | 0 .../test/dependencies.d/base-set-up-timezone | 0 .../test/dependencies.d/base-set-up-user | 0 .../root/etc/s6-overlay/s6-rc.d/test/finish | 0 .../root/etc/s6-overlay/s6-rc.d/test/run | 0 .../root/etc/s6-overlay/s6-rc.d/test/type | 0 .../s6-overlay/s6-rc.d/user/contents.d/test | 0 releases/jammy/.dockerignore | 15 + releases/jammy/Dockerfile | 104 ++++++ releases/jammy/packages/generated/install.txt | 27 ++ releases/jammy/packages/required.txt | 3 + releases/jammy/packages/temporary.txt | 3 + releases/jammy/platforms.txt | 6 + .../dependencies.d/base-set-up-user | 0 .../s6-rc.d/base-apply-permissions/run | 12 + .../s6-rc.d/base-apply-permissions/timeout-up | 1 + .../s6-rc.d/base-apply-permissions/type | 1 + .../s6-rc.d/base-apply-permissions/up | 1 + .../base-set-up-timezone/dependencies.d/base | 0 .../s6-rc.d/base-set-up-timezone/run | 27 ++ .../s6-rc.d/base-set-up-timezone/timeout-up | 1 + .../s6-rc.d/base-set-up-timezone/type | 1 + .../s6-rc.d/base-set-up-timezone/up | 1 + .../base-set-up-user/dependencies.d/base | 0 .../s6-overlay/s6-rc.d/base-set-up-user/run | 55 +++ .../s6-rc.d/base-set-up-user/timeout-up | 1 + .../s6-overlay/s6-rc.d/base-set-up-user/type | 1 + .../s6-overlay/s6-rc.d/base-set-up-user/up | 1 + releases/jammy/test/.dockerignore | 2 + releases/jammy/test/Dockerfile | 4 + .../dependencies.d/base-apply-permissions | 0 .../test/dependencies.d/base-set-up-timezone | 0 .../test/dependencies.d/base-set-up-user | 0 .../root/etc/s6-overlay/s6-rc.d/test/finish | 6 + .../test/root/etc/s6-overlay/s6-rc.d/test/run | 65 ++++ .../root/etc/s6-overlay/s6-rc.d/test/type | 1 + .../s6-overlay/s6-rc.d/user/contents.d/test | 0 releases/noble/.dockerignore | 15 + Dockerfile => releases/noble/Dockerfile | 0 .../noble/packages}/generated/install.txt | 0 releases/noble/packages/required.txt | 3 + releases/noble/packages/temporary.txt | 3 + releases/noble/platforms.txt | 6 + .../dependencies.d/base-set-up-user | 0 .../s6-rc.d/base-apply-permissions/run | 12 + .../s6-rc.d/base-apply-permissions/timeout-up | 1 + .../s6-rc.d/base-apply-permissions/type | 1 + .../s6-rc.d/base-apply-permissions/up | 1 + .../base-set-up-timezone/dependencies.d/base | 0 .../s6-rc.d/base-set-up-timezone/run | 27 ++ .../s6-rc.d/base-set-up-timezone/timeout-up | 1 + .../s6-rc.d/base-set-up-timezone/type | 1 + .../s6-rc.d/base-set-up-timezone/up | 1 + .../base-set-up-user/dependencies.d/base | 0 .../s6-overlay/s6-rc.d/base-set-up-user/run | 55 +++ .../s6-rc.d/base-set-up-user/timeout-up | 1 + .../s6-overlay/s6-rc.d/base-set-up-user/type | 1 + .../s6-overlay/s6-rc.d/base-set-up-user/up | 1 + releases/noble/test/.dockerignore | 2 + releases/noble/test/Dockerfile | 4 + .../dependencies.d/base-apply-permissions | 0 .../test/dependencies.d/base-set-up-timezone | 0 .../test/dependencies.d/base-set-up-user | 0 .../root/etc/s6-overlay/s6-rc.d/test/finish | 6 + .../test/root/etc/s6-overlay/s6-rc.d/test/run | 65 ++++ .../root/etc/s6-overlay/s6-rc.d/test/type | 1 + .../s6-overlay/s6-rc.d/user/contents.d/test | 0 100 files changed, 1010 insertions(+), 271 deletions(-) delete mode 100644 .github/workflows/backport.yml rename .dockerignore => releases/focal/.dockerignore (100%) create mode 100644 releases/focal/Dockerfile create mode 100644 releases/focal/packages/generated/install.txt rename {packages => releases/focal/packages}/required.txt (100%) rename {packages => releases/focal/packages}/temporary.txt (100%) create mode 100644 releases/focal/platforms.txt rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-apply-permissions/run (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-apply-permissions/type (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-apply-permissions/up (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-user/run (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-user/type (100%) rename {root => releases/focal/root}/etc/s6-overlay/s6-rc.d/base-set-up-user/up (100%) rename {test => releases/focal/test}/.dockerignore (100%) rename {test => releases/focal/test}/Dockerfile (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/finish (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/run (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/test/type (100%) rename {test => releases/focal/test}/root/etc/s6-overlay/s6-rc.d/user/contents.d/test (100%) create mode 100644 releases/jammy/.dockerignore create mode 100644 releases/jammy/Dockerfile create mode 100644 releases/jammy/packages/generated/install.txt create mode 100644 releases/jammy/packages/required.txt create mode 100644 releases/jammy/packages/temporary.txt create mode 100644 releases/jammy/platforms.txt create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user create mode 100755 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base create mode 100755 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base create mode 100755 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type create mode 100644 releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up create mode 100644 releases/jammy/test/.dockerignore create mode 100644 releases/jammy/test/Dockerfile create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/finish create mode 100755 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/run create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/type create mode 100644 releases/jammy/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test create mode 100644 releases/noble/.dockerignore rename Dockerfile => releases/noble/Dockerfile (100%) rename {packages => releases/noble/packages}/generated/install.txt (100%) create mode 100644 releases/noble/packages/required.txt create mode 100644 releases/noble/packages/temporary.txt create mode 100644 releases/noble/platforms.txt create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user create mode 100755 releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base create mode 100755 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base create mode 100755 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type create mode 100644 releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up create mode 100644 releases/noble/test/.dockerignore create mode 100644 releases/noble/test/Dockerfile create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/finish create mode 100755 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/run create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/type create mode 100644 releases/noble/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ec00abb5..a4edfb76 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,72 +15,11 @@ updates: docker-actions: patterns: - docker/* - - package-ecosystem: github-actions - directory: / - target-branch: release/jammy - schedule: - interval: daily - time: '04:00' - timezone: America/Toronto - rebase-strategy: auto - labels: - - auto - - dependencies - - github-actions - groups: - docker-actions: - patterns: - - docker/* - - package-ecosystem: github-actions - directory: / - target-branch: release/focal - schedule: - interval: daily - time: '04:00' - timezone: America/Toronto - rebase-strategy: auto - labels: - - auto - - dependencies - - github-actions - groups: - docker-actions: - patterns: - - docker/* - package-ecosystem: docker - directory: / - schedule: - interval: daily - time: '04:00' - timezone: America/Toronto - cooldown: - default-days: 7 - include: - - ubuntu:* - rebase-strategy: auto - labels: - - auto - - dependencies - - docker - - package-ecosystem: docker - directory: / - target-branch: release/jammy - schedule: - interval: daily - time: '04:00' - timezone: America/Toronto - cooldown: - default-days: 7 - include: - - ubuntu:* - rebase-strategy: auto - labels: - - auto - - dependencies - - docker - - package-ecosystem: docker - directory: / - target-branch: release/focal + directories: + - /releases/noble + - /releases/jammy + - /releases/focal schedule: interval: daily time: '04:00' diff --git a/.github/labeler.yml b/.github/labeler.yml index cd1d79be..060ff928 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,8 +1,8 @@ bash: - changed-files: - any-glob-to-any-file: - - root/etc/s6-overlay/s6-rc.d/*/run - - test/etc/s6-overlay/s6-rc.d/*/run + - 'releases/*/root/etc/s6-overlay/s6-rc.d/*/run' + - 'releases/*/test/root/etc/s6-overlay/s6-rc.d/*/run' docker: - changed-files: - any-glob-to-any-file: diff --git a/.github/scripts/update-packages.sh b/.github/scripts/update-packages.sh index 1f4e0729..52fedd9f 100755 --- a/.github/scripts/update-packages.sh +++ b/.github/scripts/update-packages.sh @@ -2,12 +2,14 @@ set -euo pipefail -INSTALL_FILE="packages/generated/install.txt" +RELEASE="${1:?Usage: $0 }" + +INSTALL_FILE="${RELEASE}/packages/generated/install.txt" DPKG_QUERY="dpkg-query -W -f '\${Package}=\${Version}\n'" -BASE_IMAGE=$(sed -n 's/^FROM \(ubuntu:[a-z]*-[0-9]*\)$/\1/p' Dockerfile) -REQUIRED=$(sed '/^$/d' packages/required.txt | tr '\n' ' ') -TEMPORARY=$(sed '/^$/d' packages/temporary.txt | tr '\n' ' ') +BASE_IMAGE=$(sed -n 's/^FROM \(ubuntu:[a-z]*-[0-9]*\)$/\1/p' "${RELEASE}/Dockerfile") +REQUIRED=$(sed '/^$/d' "${RELEASE}/packages/required.txt" | tr '\n' ' ') +TEMPORARY=$(sed '/^$/d' "${RELEASE}/packages/temporary.txt" | tr '\n' ' ') # get base image package list BASE_LIST=$( diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml deleted file mode 100644 index 798b7ab3..00000000 --- a/.github/workflows/backport.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Backport -on: - pull_request_target: - branches: - - main - - release/* - types: - - closed - - labeled -permissions: - contents: write - pull-requests: write -jobs: - backport: - name: Backport - runs-on: ubuntu-latest - timeout-minutes: 5 - if: > - github.event.pull_request.merged && ( - github.event.action == 'closed' || ( - github.event.action == 'labeled' && - contains(github.event.label.name, 'backport') - ) - ) - steps: - - name: Generate app token - id: app-token - uses: actions/create-github-app-token@v3.0.0 - with: - app-id: ${{secrets.GH_APP_ID}} - private-key: ${{secrets.GH_APP_PRIVATE_KEY}} - - name: Backport - uses: tibdex/backport@v2.0.4 - with: - github_token: ${{steps.app-token.outputs.token}} - head_template: 'auto/backport-<%= number %>-to-<%= base %>' - label_pattern: '^backport: (?([^ ]+))$' - title_template: '[Backport] <%= title %>' diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index fad8ce3d..7c4ddceb 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,18 +1,30 @@ name: Pull Request -on: - pull_request: - branches: - - main - - release/* +on: pull_request permissions: contents: read defaults: run: shell: bash concurrency: - group: ${{github.event.pull_request.number}} + group: ${{github.workflow_ref}} cancel-in-progress: true jobs: + determine-releases: + name: Determine Releases + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + releases: ${{steps.releases.outputs.releases}} + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Determine releases + id: releases + run: | + RELEASES=$(ls -d releases/*/ | xargs -n1 basename) + echo "Releases: ${RELEASES//$'\n'/, }" + RELEASES=$(echo "$RELEASES" | jq -Rnc '[inputs]') + echo "releases=${RELEASES}" >> "${GITHUB_OUTPUT}" check-packages: name: Check Packages runs-on: ubuntu-latest @@ -20,14 +32,23 @@ jobs: permissions: contents: write pull-requests: write + needs: + - determine-releases + - check-base-images steps: - name: Checkout uses: actions/checkout@v6.0.2 with: ref: ${{github.head_ref}} - name: Update packages - id: updates - run: bash .github/scripts/update-packages.sh + run: | + for RELEASE in $(echo "${RELEASES}" | jq -r '.[]'); do + echo "::group::${RELEASE}" + bash .github/scripts/update-packages.sh "releases/${RELEASE}" + echo '::endgroup::' + done + env: + RELEASES: ${{needs.determine-releases.outputs.releases}} - name: Gather info id: info run: | @@ -46,16 +67,41 @@ jobs: commit-message: ${{steps.info.outputs.title}} author: ${{steps.info.outputs.commit-author}} committer: ${{steps.info.outputs.commit-author}} - add-paths: packages/generated/install.txt + add-paths: releases/*/packages/generated/install.txt base: ${{github.event.pull_request.head.ref}} branch: auto/update-packages/pr-${{github.event.pull_request.number}} delete-branch: true draft: true title: ${{steps.info.outputs.title}} - body: ${{steps.updates.outputs.update-body}} + body: Automated package updates. labels: | dependencies auto + check-base-images: + name: Check Base Images + runs-on: ubuntu-latest + timeout-minutes: 5 + needs: determine-releases + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Verify base images match releases + run: | + for RELEASE in $(echo "${RELEASES}" | jq -r '.[]'); do + echo "::group::${RELEASE}" + FROM_LINE=$(grep -E '^FROM ubuntu:' "releases/${RELEASE}/Dockerfile") + IMAGE_TAG=${FROM_LINE#FROM ubuntu:} + IMAGE_STREAM=${IMAGE_TAG%%-*} + if [[ "${IMAGE_STREAM}" != "${RELEASE}" ]]; then + echo "::error::Base image '${FROM_LINE}' does not match" \ + "release '${RELEASE}' (expected 'FROM ubuntu:${RELEASE}-...')" + exit 1 + fi + echo "Base image '${FROM_LINE}' matches release '${RELEASE}'" + echo '::endgroup::' + done + env: + RELEASES: ${{needs.determine-releases.outputs.releases}} check-formatting-all: name: Check Formatting (All) runs-on: ubuntu-latest @@ -76,6 +122,8 @@ jobs: uses: actions/checkout@v6.0.2 - name: Check formatting uses: hadolint/hadolint-action@v3.3.0 + with: + recursive: true check-formatting-markdown: name: Check Formatting (Markdown) runs-on: ubuntu-latest @@ -91,33 +139,29 @@ jobs: name: Build & Test runs-on: ubuntu-latest timeout-minutes: 30 - permissions: - contents: read - pull-requests: write needs: + - determine-releases + - check-base-images - check-packages + strategy: + fail-fast: false + matrix: + release: ${{fromJson(needs.determine-releases.outputs.releases)}} steps: - name: Checkout uses: actions/checkout@v6.0.2 - name: Determine info id: info run: | - PLATFORMS=( - linux/amd64 - linux/arm/v7 - linux/arm64 - linux/ppc64le - linux/riscv64 - linux/s390x - ) - SAVE_IFS="$IFS" - IFS="," - PLATFORMS="${PLATFORMS[*]}" - IFS="$SAVE_IFS" + RELEASE_DIR="releases/${RELEASE}" + PLATFORMS=$(paste -sd, "${RELEASE_DIR}/platforms.txt") TEMP_IMAGE='ci' echo "platforms=$PLATFORMS" >> $GITHUB_OUTPUT - echo "ci-image-tag=$TEMP_IMAGE:image" >> $GITHUB_OUTPUT - echo "ci-test-image-tag=$TEMP_IMAGE:test-image" >> $GITHUB_OUTPUT + echo "ci-image-tag=$TEMP_IMAGE:${RELEASE}" >> $GITHUB_OUTPUT + echo "ci-test-image-tag=$TEMP_IMAGE:${RELEASE}-test" >> $GITHUB_OUTPUT + echo "release-dir=${RELEASE_DIR}" >> $GITHUB_OUTPUT + env: + RELEASE: ${{matrix.release}} - name: Set up Docker uses: docker/setup-docker-action@v5.0.0 with: @@ -130,22 +174,22 @@ jobs: - name: Build image uses: docker/build-push-action@v7.0.0 with: - context: . + context: ./${{steps.info.outputs.release-dir}} platforms: ${{steps.info.outputs.platforms}} tags: ${{steps.info.outputs.ci-image-tag}} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=${{matrix.release}} + cache-to: type=gha,scope=${{matrix.release}},mode=max load: true - name: Build test image uses: docker/build-push-action@v7.0.0 with: - context: ./test + context: ./${{steps.info.outputs.release-dir}}/test build-contexts: | ci:image=docker-image://${{steps.info.outputs.ci-image-tag}} platforms: ${{steps.info.outputs.platforms}} tags: ${{steps.info.outputs.ci-test-image-tag}} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=${{matrix.release}}-test + cache-to: type=gha,scope=${{matrix.release}}-test,mode=max load: true - name: Run tests run: > @@ -161,16 +205,11 @@ jobs: env: TEST_IMAGE_TAG: ${{steps.info.outputs.ci-test-image-tag}} PLATFORMS: ${{steps.info.outputs.platforms}} - - name: Hide outdated build details comments - uses: int128/hide-comment-action@v1.53.0 - with: - starts-with: - - name: Create build details comment - id: image-details + - name: Collect build details run: | # Determine the remote image tag to compare against echo "::group::Determine remote image tag" - VERSION=$(grep -E '^FROM ubuntu:[a-z]+-[0-9]+$' Dockerfile) + VERSION=$(grep -E '^FROM ubuntu:[a-z]+-[0-9]+$' releases/${RELEASE}/Dockerfile) VERSION=${VERSION##*:} STREAM=${VERSION%-*} REMOTE_IMAGE_TAG=$REMOTE_IMAGE:$STREAM @@ -184,13 +223,15 @@ jobs: echo "Remote image: $REMOTE_IMAGE_TAG" fi echo "::endgroup::" - # Build the comment body per platform - BODY=$'\n\n' - HAVE_REMOTE=true - FAILED_PLATFORMS=() - TOTAL_SIZE_NEW=0 - TOTAL_SIZE_OLD=0 - PLATFORM_BODIES="" + # Collect build data as JSON + JSON=$(jq -n --arg release "$RELEASE" '{ + release: $release, + have_remote: true, + failed_platforms: [], + total_size_new: 0, + total_size_old: 0, + platforms: [] + }') FMT='--to=iec --suffix=B --format=%.2f' for PLATFORM in ${PLATFORMS//,/ }; do echo "::group::$PLATFORM" @@ -200,13 +241,13 @@ jobs: -f '{{.Size}}' $LOCAL_IMAGE_TAG) echo "Local size: $SIZE_NEW ($(echo $SIZE_NEW | numfmt $FMT))" # Layer breakdown - DETAILS=$( + LAYERS=$( docker image history --platform=$PLATFORM \ --format 'table | {{.Size}} | {{.CreatedBy}} |' $LOCAL_IMAGE_TAG ) - DETAILS=${DETAILS#*$'\n'} + LAYERS=${LAYERS#*$'\n'} echo "Layer breakdown:" - echo "$DETAILS" + echo "$LAYERS" # Remote image size if docker pull --platform=$PLATFORM $REMOTE_IMAGE_TAG; then SIZE_OLD=$( @@ -215,81 +256,136 @@ jobs: ) echo "Remote size: $SIZE_OLD ($(echo $SIZE_OLD | numfmt $FMT))" else - HAVE_REMOTE=false - FAILED_PLATFORMS+=("$PLATFORM") PULL_FAILED=true SIZE_OLD=$SIZE_NEW echo "::warning::Failed to pull remote image for $PLATFORM," \ "using local as baseline" fi - # Format size with difference - SIZE=$(echo $SIZE_NEW | numfmt $FMT) - DIFF=$(( SIZE_NEW - SIZE_OLD )) - echo "Difference: $DIFF bytes" - if (( DIFF > 0 )); then - SIZE+=" \`+$(echo $DIFF | numfmt $FMT)\`" - elif (( DIFF < 0 )); then - SIZE+=" \`$(echo $DIFF | numfmt $FMT)\`" - fi - echo "Formatted size: $SIZE" - # Accumulate totals - TOTAL_SIZE_NEW=$((TOTAL_SIZE_NEW + SIZE_NEW)) - TOTAL_SIZE_OLD=$((TOTAL_SIZE_OLD + SIZE_OLD)) - # Determine status indicator - if (( DIFF > 0 )); then - STATUS=":red_square:" - elif (( DIFF < 0 )); then - STATUS=":yellow_square:" - else - STATUS=":green_square:" - fi - # Append to platform bodies - PLATFORM_BODIES+=$'
\n' - PLATFORM_BODIES+="$PLATFORM" - PLATFORM_BODIES+=" $STATUS
"$'\n\n' - if [[ "$PULL_FAILED" == "true" ]]; then - PLATFORM_BODIES+=$'> [!NOTE]\n' - PLATFORM_BODIES+=$'> Remote image unavailable.' - PLATFORM_BODIES+=$' Size comparison skipped' - PLATFORM_BODIES+=$' for this platform.\n\n' - fi - PLATFORM_BODIES+="**Size:** $SIZE"$'\n' - PLATFORM_BODIES+=$'\n#### Layers\n\n' - PLATFORM_BODIES+=$'| Size | Created By |\n' - PLATFORM_BODIES+=$'| ---- | ---------- |\n' - PLATFORM_BODIES+="$DETAILS" - PLATFORM_BODIES+=$'\n\n
\n\n' + # Add platform data to JSON + JSON=$(echo "$JSON" | jq \ + --arg platform "$PLATFORM" \ + --argjson size_new "$SIZE_NEW" \ + --argjson size_old "$SIZE_OLD" \ + --argjson pull_failed "$PULL_FAILED" \ + --arg layers "$LAYERS" \ + '.platforms += [{ + name: $platform, + size_new: $size_new, + size_old: $size_old, + pull_failed: $pull_failed, + layers: $layers + }] + | .total_size_new += $size_new + | .total_size_old += $size_old + | if $pull_failed then + .have_remote = false + | .failed_platforms += [$platform] + else . end') echo "::endgroup::" done - # Overall size summary - OVERALL_SIZE=$(echo $TOTAL_SIZE_NEW | numfmt $FMT) - OVERALL_DIFF=$((TOTAL_SIZE_NEW - TOTAL_SIZE_OLD)) - if (( OVERALL_DIFF > 0 )); then - OVERALL_SIZE+=" \`+$(echo $OVERALL_DIFF | numfmt $FMT)\`" - elif (( OVERALL_DIFF < 0 )); then - OVERALL_SIZE+=" \`$(echo $OVERALL_DIFF | numfmt $FMT)\`" - fi - BODY+=$'## Build Details\n\n' - if [[ "$HAVE_REMOTE" != "true" ]]; then - BODY+=$'> [!WARNING]\n' - BODY+=$'> Size comparison may be inaccurate.' - BODY+=$' Failed to pull remote image for the following platforms:\n' - for FP in "${FAILED_PLATFORMS[@]}"; do - BODY+="> * \`$FP\`"$'\n' - done - BODY+=$'\n' - fi - BODY+="**Size:** $OVERALL_SIZE"$'\n' - BODY+=$'\n### Platforms\n\n' - BODY+="$PLATFORM_BODIES" echo "::group::Report final image details" docker image ls --tree 2>/dev/null echo "::endgroup::" - gh pr comment "$PULL_REQUEST_NUMBER" --body "$BODY" + echo "$JSON" > "build-details-${RELEASE}.json" env: + RELEASE: ${{matrix.release}} REMOTE_IMAGE: ghcr.io/${{github.repository_owner}}/base-ubuntu LOCAL_IMAGE_TAG: ${{steps.info.outputs.ci-image-tag}} PLATFORMS: ${{steps.info.outputs.platforms}} + - name: Upload build details + uses: actions/upload-artifact@v4 + with: + name: build-details-${{matrix.release}} + path: build-details-${{matrix.release}}.json + build-details: + name: Build Details + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + contents: read + pull-requests: write + needs: build-and-test + steps: + - name: Download build details + uses: actions/download-artifact@v4 + with: + pattern: build-details-* + merge-multiple: true + - name: Hide outdated build details comment + uses: int128/hide-comment-action@v1.53.0 + with: + starts-with: + - name: Post build details comment + run: | + BODY="" + FMT='--to=iec --suffix=B --format=%.2f' + for FILE in $(ls build-details-*.json | sort); do + RELEASE=$(jq -r '.release' "$FILE") + HAVE_REMOTE=$(jq -r '.have_remote' "$FILE") + TOTAL_SIZE_NEW=$(jq -r '.total_size_new' "$FILE") + TOTAL_SIZE_OLD=$(jq -r '.total_size_old' "$FILE") + # Overall size + OVERALL_SIZE=$(echo "$TOTAL_SIZE_NEW" | numfmt $FMT) + OVERALL_DIFF=$((TOTAL_SIZE_NEW - TOTAL_SIZE_OLD)) + if (( OVERALL_DIFF > 0 )); then + OVERALL_SIZE+=" \`+$(echo $OVERALL_DIFF | numfmt $FMT)\`" + elif (( OVERALL_DIFF < 0 )); then + OVERALL_SIZE+=" \`$(echo $OVERALL_DIFF | numfmt $FMT)\`" + fi + BODY+=$'\n\n'"## Build Details (${RELEASE})"$'\n\n' + if [[ "$HAVE_REMOTE" != "true" ]]; then + BODY+=$'> [!WARNING]\n' + BODY+=$'> Size comparison may be inaccurate.' + BODY+=$' Failed to pull remote image for the following' + BODY+=$' platforms:\n' + while read -r FP; do + BODY+="> * \`$FP\`"$'\n' + done < <(jq -r '.failed_platforms[]' "$FILE") + BODY+=$'\n' + fi + BODY+="**Size:** $OVERALL_SIZE"$'\n' + BODY+=$'\n### Platforms\n\n' + PLATFORM_COUNT=$(jq '.platforms | length' "$FILE") + for ((i=0; i 0 )); then + SIZE+=" \`+$(echo $DIFF | numfmt $FMT)\`" + elif (( DIFF < 0 )); then + SIZE+=" \`$(echo $DIFF | numfmt $FMT)\`" + fi + if (( DIFF > 0 )); then + STATUS=":red_square:" + elif (( DIFF < 0 )); then + STATUS=":yellow_square:" + else + STATUS=":green_square:" + fi + BODY+=$'
\n' + BODY+="$PLATFORM" + BODY+=" $STATUS
"$'\n\n' + if [[ "$PULL_FAILED" == "true" ]]; then + BODY+=$'> [!NOTE]\n' + BODY+=$'> Remote image unavailable.' + BODY+=$' Size comparison skipped' + BODY+=$' for this platform.\n\n' + fi + BODY+="**Size:** $SIZE"$'\n' + BODY+=$'\n#### Layers\n\n' + BODY+=$'| Size | Created By |\n' + BODY+=$'| ---- | ---------- |\n' + BODY+="$LAYERS" + BODY+=$'\n\n
\n\n' + done + done + gh pr comment "$PULL_REQUEST_NUMBER" \ + --repo "$GITHUB_REPOSITORY" --body "$BODY" + env: PULL_REQUEST_NUMBER: ${{github.event.pull_request.number}} GITHUB_TOKEN: ${{github.token}} label: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 09e7831b..84aa3292 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,32 +3,48 @@ on: push: branches: - main - - release/* paths: - .github/workflows/release.yml - - packages/** - - root/** - - .dockerignore - - Dockerfile + - releases/** permissions: contents: write packages: write -concurrency: release-${{github.ref}} jobs: cd: name: CD runs-on: ubuntu-latest timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + release: + - noble + - jammy + - focal + include: + - release: noble + is-latest: true + - release: jammy + is-latest: false + - release: focal + is-latest: false + concurrency: release-${{matrix.release}} env: - PLATFORMS: linux/amd64,linux/arm/v7,linux/arm64,linux/s390x,linux/riscv64,linux/ppc64le PACKAGE: ghcr.io/${{github.repository_owner}}/base-ubuntu steps: - name: Checkout uses: actions/checkout@v6.0.2 + - name: Determine platforms + id: platforms + run: | + PLATFORMS=$(paste -sd, "releases/${RELEASE}/platforms.txt") + echo "platforms=$PLATFORMS" >> $GITHUB_OUTPUT + env: + RELEASE: ${{matrix.release}} - name: Set up QEMU uses: docker/setup-qemu-action@v4.0.0 with: - platforms: ${{env.PLATFORMS}} + platforms: ${{steps.platforms.outputs.platforms}} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4.0.0 id: buildx @@ -36,13 +52,13 @@ jobs: id: info shell: bash run: | - VERSION=$(grep -E '^FROM ubuntu:[a-z]+-[0-9]+$' Dockerfile) + VERSION=$(grep -E '^FROM ubuntu:[a-z]+-[0-9]+$' releases/${RELEASE}/Dockerfile) VERSION=${VERSION##*:} STREAM=${VERSION%-*} if [[ -z "$STREAM" ]]; then STREAM=$VERSION fi - URL=https://api.github.com/repos/${{github.repository}} + URL=https://api.github.com/repos/${GITHUB_REPOSITORY} AUTHORIZATION_HEADER="Authorization: token $GITHUB_TOKEN" FILTER=".[].tag_name|select(startswith(\"$VERSION\"))" FILTER="$FILTER|sub(\"^$VERSION$DELIMITER\";\"\")|tonumber" @@ -70,10 +86,11 @@ jobs: RELEASE_BRANCH=${GITHUB_REF#refs/heads/} DOCKER_TAGS="$PACKAGE:$RELEASE_VERSION" DOCKER_TAGS="$DOCKER_TAGS,$PACKAGE:$STREAM" - RELEASE_LATEST='false' - if [[ "$RELEASE_BRANCH" == 'main' ]]; then + if [[ "$IS_LATEST" == 'true' ]]; then DOCKER_TAGS="$DOCKER_TAGS,$PACKAGE:latest" RELEASE_LATEST='true' + else + RELEASE_LATEST='false' fi RELEASE_COMMIT="$GITHUB_SHA" DATETIME=$(date --utc +%FT%T.%3NZ) @@ -92,8 +109,10 @@ jobs: echo "docker-tags=$DOCKER_TAGS" >> $GITHUB_OUTPUT echo "release-latest=$RELEASE_LATEST" >> $GITHUB_OUTPUT env: + RELEASE: ${{matrix.release}} GITHUB_TOKEN: ${{github.token}} DELIMITER: '.' + IS_LATEST: ${{matrix.is-latest}} - name: Login to registry if: steps.info.outputs.create-release uses: docker/login-action@v4.0.0 @@ -105,17 +124,17 @@ jobs: if: steps.info.outputs.create-release uses: docker/build-push-action@v7.0.0 with: - context: . + context: ./releases/${{matrix.release}} builder: ${{steps.buildx.outputs.name}} - platforms: ${{env.PLATFORMS}} + platforms: ${{steps.platforms.outputs.platforms}} build-args: | BUILD_CREATED=${{steps.info.outputs.datetime}} BUILD_VERSION=${{steps.info.outputs.release-version}} BUILD_REF_NAME=${{steps.info.outputs.release-branch}} BUILD_REVISION=${{steps.info.outputs.release-commit}} tags: ${{steps.info.outputs.docker-tags}} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=${{matrix.release}} + cache-to: type=gha,scope=${{matrix.release}},mode=max push: true - name: Create release if: steps.info.outputs.create-release diff --git a/.github/workflows/update-license.yml b/.github/workflows/update-license.yml index 722eea99..ac4b93e1 100644 --- a/.github/workflows/update-license.yml +++ b/.github/workflows/update-license.yml @@ -11,17 +11,9 @@ jobs: name: Update License runs-on: ubuntu-latest timeout-minutes: 5 - strategy: - matrix: - branch: - - main - - release/jammy - - release/focal steps: - name: Checkout uses: actions/checkout@v6.0.2 - with: - ref: ${{matrix.branch}} - name: Generate app token id: app-token uses: actions/create-github-app-token@v3.0.0 @@ -63,8 +55,8 @@ jobs: author: ${{steps.info.outputs.commit-author}} committer: ${{steps.info.outputs.commit-author}} add-paths: LICENSE - base: ${{matrix.branch}} - branch: auto/update-license/${{matrix.branch}} + base: main + branch: auto/update-license delete-branch: true title: ${{steps.info.outputs.update-title}} body: ${{steps.info.outputs.update-body}} diff --git a/.github/workflows/update-packages.yml b/.github/workflows/update-packages.yml index fe1f5135..0df80415 100644 --- a/.github/workflows/update-packages.yml +++ b/.github/workflows/update-packages.yml @@ -12,14 +12,15 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 strategy: + fail-fast: false matrix: - branch: - - main + release: + - noble + - jammy + - focal steps: - name: Checkout uses: actions/checkout@v6.0.2 - with: - ref: ${{matrix.branch}} - name: Generate app token id: app-token uses: actions/create-github-app-token@v3.0.0 @@ -28,7 +29,9 @@ jobs: private-key: ${{secrets.GH_APP_PRIVATE_KEY}} - name: Update packages id: updates - run: bash .github/scripts/update-packages.sh + run: bash .github/scripts/update-packages.sh releases/${RELEASE} + env: + RELEASE: ${{matrix.release}} - name: Gather info id: info run: | @@ -36,11 +39,11 @@ jobs: USER_ID=$(gh api "/users/${USER_NAME}" --jq '.id') USER_EMAIL="${USER_ID}+${USER_NAME}@users.noreply.github.com" echo "commit-author=${USER_NAME} <${USER_EMAIL}>" >> "${GITHUB_OUTPUT}" - echo "title=Update packages for \`${BRANCH}\`" >> "${GITHUB_OUTPUT}" + echo "title=Update packages for \`${RELEASE}\`" >> "${GITHUB_OUTPUT}" env: + RELEASE: ${{matrix.release}} GITHUB_TOKEN: ${{steps.app-token.outputs.token}} GITHUB_APP_SLUG: ${{steps.app-token.outputs.app-slug}} - BRANCH: ${{matrix.branch}} - name: Create pull request uses: peter-evans/create-pull-request@v8.1.0 id: changes @@ -49,9 +52,9 @@ jobs: commit-message: ${{steps.info.outputs.title}} author: ${{steps.info.outputs.commit-author}} committer: ${{steps.info.outputs.commit-author}} - add-paths: packages/generated/install.txt - base: ${{matrix.branch}} - branch: auto/update-packages/${{matrix.branch}} + add-paths: releases/${{matrix.release}}/packages/generated/install.txt + base: main + branch: auto/update-packages/${{matrix.release}} delete-branch: true title: ${{steps.info.outputs.title}} body: ${{steps.updates.outputs.update-body}} diff --git a/.github/workflows/update-s6-overlay.yml b/.github/workflows/update-s6-overlay.yml index 105d1427..8da808b1 100644 --- a/.github/workflows/update-s6-overlay.yml +++ b/.github/workflows/update-s6-overlay.yml @@ -12,16 +12,15 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 strategy: + fail-fast: false matrix: - branch: - - main - - release/jammy - - release/focal + release: + - noble + - jammy + - focal steps: - name: Checkout uses: actions/checkout@v6.0.2 - with: - ref: ${{matrix.branch}} - name: Generate app token id: app-token uses: actions/create-github-app-token@v3.0.0 @@ -35,7 +34,7 @@ jobs: VERSION_REGEX='([0-9]+\.){3}[0-9]+(\-[0-9]+)?' REGEX="^((ARG | {4})?S6_OVERLAY_VERSION=)${VERSION_REGEX}$" OLD_VERSION=$( - grep -oEi "${REGEX}" Dockerfile | + grep -oEi "${REGEX}" releases/${RELEASE}/Dockerfile | grep -oEi "${VERSION_REGEX}" ) NEW_VERSION=$( @@ -47,6 +46,7 @@ jobs: NEW_VERSION=${NEW_VERSION#'v'} RELEASES='https://github.com/just-containers/s6-overlay/releases' UPDATE_TITLE="Bump s6 overlay from ${OLD_VERSION} to ${NEW_VERSION}" + UPDATE_TITLE+=" (${RELEASE})" UPDATE_BODY='Bump s6 overlay from' UPDATE_BODY+="[${OLD_VERSION}](${RELEASES}/v${OLD_VERSION}) " UPDATE_BODY+="to [${NEW_VERSION}](${RELEASES}/v${NEW_VERSION})." @@ -60,11 +60,16 @@ jobs: echo "update-body=${UPDATE_BODY}" >> "${GITHUB_OUTPUT}" echo "commit-author=${COMMIT_AUTHOR}" >> "${GITHUB_OUTPUT}" env: + RELEASE: ${{matrix.release}} GITHUB_TOKEN: ${{steps.app-token.outputs.token}} GITHUB_APP_SLUG: ${{steps.app-token.outputs.app-slug}} - name: Update Dockerfile - run: sed -i -E "s/${REPLACE_REGEX}/\1${S6_OVERLAY_VERSION}/" Dockerfile + run: > + sed -i -E + "s/${REPLACE_REGEX}/\1${S6_OVERLAY_VERSION}/" + releases/${RELEASE}/Dockerfile env: + RELEASE: ${{matrix.release}} S6_OVERLAY_VERSION: ${{steps.info.outputs.s6-overlay-version}} REPLACE_REGEX: ${{steps.info.outputs.replace-regex}} - name: Handle changes @@ -75,9 +80,9 @@ jobs: commit-message: ${{steps.info.outputs.update-title}} author: ${{steps.info.outputs.commit-author}} committer: ${{steps.info.outputs.commit-author}} - add-paths: Dockerfile - base: ${{matrix.branch}} - branch: auto/update-s6-overlay/${{matrix.branch}} + add-paths: releases/${{matrix.release}}/Dockerfile + base: main + branch: auto/update-s6-overlay/${{matrix.release}} delete-branch: true title: ${{steps.info.outputs.update-title}} body: ${{steps.info.outputs.update-body}} diff --git a/README.md b/README.md index f1195df1..0c592b04 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,28 @@ [![License][License]](LICENSE) [![Release][Release Badge]][Release Workflow] -[Ubuntu] container for use as base for other containers. +[Ubuntu] container for use as base for other containers. Supports multiple +Ubuntu releases (`noble`, `jammy`, `focal`) from a single repository. + +## Structure + +Each Ubuntu release has its own directory with a self-contained Docker build +context: + +```text +releases/ + noble/ # Ubuntu 24.04 LTS (Noble Numbat) + jammy/ # Ubuntu 22.04 LTS (Jammy Jellyfish) + focal/ # Ubuntu 20.04 LTS (Focal Fossa) +``` + +Each release directory contains: + +- `Dockerfile` - Release-specific Docker build file +- `packages/` - Package lists (`required.txt`, `temporary.txt`, + `generated/install.txt`) +- `root/` - [s6 overlay] service definitions +- `test/` - Test Dockerfile and service ## Building @@ -13,9 +34,12 @@ docker build \ --build-arg "LANGUAGE=..." \ --build-arg "ENCODING=..." \ --build-arg "S6_OVERLAY_VERSION=..." \ - -t base-ubuntu . + -t base-ubuntu releases/noble/ ``` +Replace `releases/noble/` with `releases/jammy/` or `releases/focal/` to build a +different release. + ### Arguments - `TARGETPLATFORM` - Set by [Docker Buildx] automatically. Currently supported @@ -42,11 +66,13 @@ standard [Ubuntu][Ubuntu Container] container. This is the intended usage. ```dockerfile -FROM ghcr.io/devpow112/base-ubuntu:latest +FROM ghcr.io/devpow112/base-ubuntu:noble ... ``` +Available tags: `noble`, `jammy`, `focal`, `latest` (points to `noble`). + ### Interactive Not recommended but will work if you need a quick Ubuntu environment to do @@ -55,7 +81,7 @@ testing with. ```console docker run --it --rm \ --entrypoint /bin/bash \ - ghcr.io/devpow112/base-ubuntu:latest + ghcr.io/devpow112/base-ubuntu:noble ``` diff --git a/.dockerignore b/releases/focal/.dockerignore similarity index 100% rename from .dockerignore rename to releases/focal/.dockerignore diff --git a/releases/focal/Dockerfile b/releases/focal/Dockerfile new file mode 100644 index 00000000..743cfa9d --- /dev/null +++ b/releases/focal/Dockerfile @@ -0,0 +1,104 @@ +FROM ubuntu:focal-20250404 + +# set default input arguments +ARG TARGETPLATFORM \ + LANGUAGE=en_US \ + ENCODING=UTF-8 \ + S6_OVERLAY_VERSION=3.2.2.0 + +# set default shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# set environment variables +ENV HOME=/root \ + TERM=xterm \ + LANG="${LANGUAGE}.${ENCODING}" \ + S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_BEHAVIOUR_IF_STAGE2_FAILS=2 + +# add package lists +COPY packages/ /tmp/packages/ + +# set up packages, locale and non-root user +RUN export DEBIAN_FRONTEND=noninteractive && \ + echo '###### Set up packages' && \ + apt-get update && \ + xargs -a /tmp/packages/generated/install.txt \ + apt-get install --no-install-recommends --no-install-suggests -y && \ + echo '###### Set up locale' && \ + echo "###### Language: ${LANGUAGE}" && \ + echo "###### Encoding: ${ENCODING}" && \ + localedef \ + -i "${LANGUAGE}" -c -f "${ENCODING}" \ + -A /usr/share/locale/locale.alias \ + "${LANG}" && \ + echo '###### Set up user' && \ + mkdir /config && \ + useradd -U -d /config -s /bin/false primary-user && \ + usermod -a -G users primary-user && \ + echo '###### Set up s6 overlay' && \ + PLATFORM_TRANSFORM='s/^linux\///' && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^amd64/x86_64/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^arm64/aarch64/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^arm\/v7/armhf/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^ppc64le/powerpc64le/" && \ + ARCH=$(echo "${TARGETPLATFORM}" | sed "${PLATFORM_TRANSFORM}") && \ + echo "###### Platform mapping s6 overlay: ${TARGETPLATFORM} => ${ARCH}" && \ + URL='https://github.com/just-containers/s6-overlay/releases/download' && \ + URL="${URL}/v${S6_OVERLAY_VERSION}" && \ + curl -sSfo /tmp/s6-overlay-noarch.tar.xz \ + -L "${URL}/s6-overlay-noarch.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-arch.tar.xz \ + -L "${URL}/s6-overlay-${ARCH}.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-symlinks-noarch.tar.xz \ + -L "${URL}/s6-overlay-symlinks-noarch.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-symlinks-arch.tar.xz \ + -L "${URL}/s6-overlay-symlinks-arch.tar.xz" && \ + curl -sSfo /tmp/syslogd-overlay-noarch.tar.xz \ + -L "${URL}/syslogd-overlay-noarch.tar.xz" && \ + tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-arch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz && \ + tar -C / -Jxpf /tmp/syslogd-overlay-noarch.tar.xz && \ + echo '###### Clean up' && \ + xargs -a /tmp/packages/temporary.txt apt-get autoremove --purge -y && \ + apt-get autoremove --purge -y && \ + apt-get autoclean && \ + apt-get clean && \ + rm -rf \ + /var/lib/apt/lists/* \ + /var/tmp/* \ + /var/log/* \ + /tmp/* + +# add local files +COPY root/ / + +# entry (s6 overlays) +ENTRYPOINT ["/init"] + +# set up config volume +VOLUME /config + +# buildtime related arguments +ARG BUILD_CREATED \ + BUILD_VERSION \ + BUILD_REF_NAME \ + BUILD_REVISION + +# labels +LABEL maintainer=devpow112 \ + org.opencontainers.image.authors=devpow112 \ + org.opencontainers.image.title='Docker Ubuntu (Base)' \ + org.opencontainers.image.description='Ubuntu docker container for use as base for other containers.' \ + org.opencontainers.image.documentation=https://github.com/devpow112/docker-base-ubuntu#readme \ + org.opencontainers.image.licenses=MIT \ + org.opencontainers.image.source=https://github.com/devpow112/docker-base-ubuntu \ + org.opencontainers.image.url=https://github.com/devpow112/docker-base-ubuntu \ + org.opencontainers.image.vendor=devpow112 \ + org.opencontainers.image.created=${BUILD_CREATED} \ + org.opencontainers.image.version=${BUILD_VERSION} \ + org.opencontainers.image.ref.name=${BUILD_REF_NAME} \ + org.opencontainers.image.revision=${BUILD_REVISION} diff --git a/releases/focal/packages/generated/install.txt b/releases/focal/packages/generated/install.txt new file mode 100644 index 00000000..4cdea3b4 --- /dev/null +++ b/releases/focal/packages/generated/install.txt @@ -0,0 +1,38 @@ +apt-utils=2.0.11 +apt=2.0.11 +ca-certificates=20240203~20.04.1 +curl=7.68.0-1ubuntu2.25 +gpgv=2.2.19-3ubuntu2.5 +libapt-pkg6.0=2.0.11 +libasn1-8-heimdal=7.7.0+dfsg-1ubuntu1.4 +libbrotli1=1.0.7-6ubuntu0.1 +libc-bin=2.31-0ubuntu9.18 +libc6=2.31-0ubuntu9.18 +libcurl4=7.68.0-1ubuntu2.25 +libgssapi-krb5-2=1.17-6ubuntu4.11 +libgssapi3-heimdal=7.7.0+dfsg-1ubuntu1.4 +libhcrypto4-heimdal=7.7.0+dfsg-1ubuntu1.4 +libheimbase1-heimdal=7.7.0+dfsg-1ubuntu1.4 +libheimntlm0-heimdal=7.7.0+dfsg-1ubuntu1.4 +libhx509-5-heimdal=7.7.0+dfsg-1ubuntu1.4 +libk5crypto3=1.17-6ubuntu4.11 +libkeyutils1=1.6-6ubuntu1.1 +libkrb5-26-heimdal=7.7.0+dfsg-1ubuntu1.4 +libkrb5-3=1.17-6ubuntu4.11 +libkrb5support0=1.17-6ubuntu4.11 +libldap-2.4-2=2.4.49+dfsg-2ubuntu1.10 +libldap-common=2.4.49+dfsg-2ubuntu1.10 +libnghttp2-14=1.40.0-1ubuntu0.3 +libpsl5=0.21.0-1ubuntu1 +libroken18-heimdal=7.7.0+dfsg-1ubuntu1.4 +librtmp1=2.4+20151223.gitfa8646d.1-2build1 +libsasl2-2=2.1.27+dfsg-2ubuntu0.1 +libsasl2-modules-db=2.1.27+dfsg-2ubuntu0.1 +libsqlite3-0=3.31.1-4ubuntu0.7 +libssh-4=0.9.3-2ubuntu2.5 +libssl1.1=1.1.1f-1ubuntu2.24 +libwind0-heimdal=7.7.0+dfsg-1ubuntu1.4 +locales=2.31-0ubuntu9.18 +openssl=1.1.1f-1ubuntu2.24 +tzdata=2025b-0ubuntu0.20.04.1 +xz-utils=5.2.4-1ubuntu1.1 diff --git a/packages/required.txt b/releases/focal/packages/required.txt similarity index 100% rename from packages/required.txt rename to releases/focal/packages/required.txt diff --git a/packages/temporary.txt b/releases/focal/packages/temporary.txt similarity index 100% rename from packages/temporary.txt rename to releases/focal/packages/temporary.txt diff --git a/releases/focal/platforms.txt b/releases/focal/platforms.txt new file mode 100644 index 00000000..746ac13c --- /dev/null +++ b/releases/focal/platforms.txt @@ -0,0 +1,6 @@ +linux/amd64 +linux/arm/v7 +linux/arm64 +linux/ppc64le +linux/riscv64 +linux/s390x diff --git a/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user diff --git a/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run diff --git a/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up diff --git a/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type diff --git a/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-user/run rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-user/type rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type diff --git a/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up b/releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/base-set-up-user/up rename to releases/focal/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up diff --git a/test/.dockerignore b/releases/focal/test/.dockerignore similarity index 100% rename from test/.dockerignore rename to releases/focal/test/.dockerignore diff --git a/test/Dockerfile b/releases/focal/test/Dockerfile similarity index 100% rename from test/Dockerfile rename to releases/focal/test/Dockerfile diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/finish b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/finish similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/finish rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/finish diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/run b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/run similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/run rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/run diff --git a/test/root/etc/s6-overlay/s6-rc.d/test/type b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/type similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/test/type rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/test/type diff --git a/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test b/releases/focal/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test similarity index 100% rename from test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test rename to releases/focal/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test diff --git a/releases/jammy/.dockerignore b/releases/jammy/.dockerignore new file mode 100644 index 00000000..6a8a4335 --- /dev/null +++ b/releases/jammy/.dockerignore @@ -0,0 +1,15 @@ +.git/ +.github/ +.vscode/ +test/ +packages/required.txt +.dockerignore +.editorconfig +.gitattributes +.gitignore +.hadolint.yml +.markdownlint.yml +.markdownlintignore +Dockerfile +LICENSE +README.md diff --git a/releases/jammy/Dockerfile b/releases/jammy/Dockerfile new file mode 100644 index 00000000..015bce1b --- /dev/null +++ b/releases/jammy/Dockerfile @@ -0,0 +1,104 @@ +FROM ubuntu:jammy-20260217 + +# set default input arguments +ARG TARGETPLATFORM \ + LANGUAGE=en_US \ + ENCODING=UTF-8 \ + S6_OVERLAY_VERSION=3.2.2.0 + +# set default shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# set environment variables +ENV HOME=/root \ + TERM=xterm \ + LANG="${LANGUAGE}.${ENCODING}" \ + S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_BEHAVIOUR_IF_STAGE2_FAILS=2 + +# add package lists +COPY packages/ /tmp/packages/ + +# set up packages, locale and non-root user +RUN export DEBIAN_FRONTEND=noninteractive && \ + echo '###### Set up packages' && \ + apt-get update && \ + xargs -a /tmp/packages/generated/install.txt \ + apt-get install --no-install-recommends --no-install-suggests -y && \ + echo '###### Set up locale' && \ + echo "###### Language: ${LANGUAGE}" && \ + echo "###### Encoding: ${ENCODING}" && \ + localedef \ + -i "${LANGUAGE}" -c -f "${ENCODING}" \ + -A /usr/share/locale/locale.alias \ + "${LANG}" && \ + echo '###### Set up user' && \ + mkdir /config && \ + useradd -U -d /config -s /bin/false primary-user && \ + usermod -a -G users primary-user && \ + echo '###### Set up s6 overlay' && \ + PLATFORM_TRANSFORM='s/^linux\///' && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^amd64/x86_64/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^arm64/aarch64/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^arm\/v7/armhf/" && \ + PLATFORM_TRANSFORM="${PLATFORM_TRANSFORM};s/^ppc64le/powerpc64le/" && \ + ARCH=$(echo "${TARGETPLATFORM}" | sed "${PLATFORM_TRANSFORM}") && \ + echo "###### Platform mapping s6 overlay: ${TARGETPLATFORM} => ${ARCH}" && \ + URL='https://github.com/just-containers/s6-overlay/releases/download' && \ + URL="${URL}/v${S6_OVERLAY_VERSION}" && \ + curl -sSfo /tmp/s6-overlay-noarch.tar.xz \ + -L "${URL}/s6-overlay-noarch.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-arch.tar.xz \ + -L "${URL}/s6-overlay-${ARCH}.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-symlinks-noarch.tar.xz \ + -L "${URL}/s6-overlay-symlinks-noarch.tar.xz" && \ + curl -sSfo /tmp/s6-overlay-symlinks-arch.tar.xz \ + -L "${URL}/s6-overlay-symlinks-arch.tar.xz" && \ + curl -sSfo /tmp/syslogd-overlay-noarch.tar.xz \ + -L "${URL}/syslogd-overlay-noarch.tar.xz" && \ + tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-arch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz && \ + tar -C / -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz && \ + tar -C / -Jxpf /tmp/syslogd-overlay-noarch.tar.xz && \ + echo '###### Clean up' && \ + xargs -a /tmp/packages/temporary.txt apt-get autoremove --purge -y && \ + apt-get autoremove --purge -y && \ + apt-get autoclean && \ + apt-get clean && \ + rm -rf \ + /var/lib/apt/lists/* \ + /var/tmp/* \ + /var/log/* \ + /tmp/* + +# add local files +COPY root/ / + +# entry (s6 overlays) +ENTRYPOINT ["/init"] + +# set up config volume +VOLUME /config + +# buildtime related arguments +ARG BUILD_CREATED \ + BUILD_VERSION \ + BUILD_REF_NAME \ + BUILD_REVISION + +# labels +LABEL maintainer=devpow112 \ + org.opencontainers.image.authors=devpow112 \ + org.opencontainers.image.title='Docker Ubuntu (Base)' \ + org.opencontainers.image.description='Ubuntu docker container for use as base for other containers.' \ + org.opencontainers.image.documentation=https://github.com/devpow112/docker-base-ubuntu#readme \ + org.opencontainers.image.licenses=MIT \ + org.opencontainers.image.source=https://github.com/devpow112/docker-base-ubuntu \ + org.opencontainers.image.url=https://github.com/devpow112/docker-base-ubuntu \ + org.opencontainers.image.vendor=devpow112 \ + org.opencontainers.image.created=${BUILD_CREATED} \ + org.opencontainers.image.version=${BUILD_VERSION} \ + org.opencontainers.image.ref.name=${BUILD_REF_NAME} \ + org.opencontainers.image.revision=${BUILD_REVISION} diff --git a/releases/jammy/packages/generated/install.txt b/releases/jammy/packages/generated/install.txt new file mode 100644 index 00000000..5b1538b9 --- /dev/null +++ b/releases/jammy/packages/generated/install.txt @@ -0,0 +1,27 @@ +apt-utils=2.4.14 +bsdutils=1:2.37.2-4ubuntu3.5 +ca-certificates=20240203~22.04.1 +coreutils=8.32-4.1ubuntu1.3 +curl=7.81.0-1ubuntu1.23 +gcc-12-base=12.3.0-1ubuntu1~22.04.3 +libblkid1=2.37.2-4ubuntu3.5 +libbrotli1=1.0.9-2build6 +libcurl4=7.81.0-1ubuntu1.23 +libgcc-s1=12.3.0-1ubuntu1~22.04.3 +libldap-2.5-0=2.5.20+dfsg-0ubuntu0.22.04.1 +libmount1=2.37.2-4ubuntu3.5 +libnghttp2-14=1.43.0-1ubuntu0.2 +libpsl5=0.21.0-1.2build2 +librtmp1=2.4+20151223.gitfa8646d.1-2build4 +libsasl2-2=2.1.27+dfsg2-3ubuntu1.2 +libsasl2-modules-db=2.1.27+dfsg2-3ubuntu1.2 +libsmartcols1=2.37.2-4ubuntu3.5 +libssh-4=0.9.6-2ubuntu0.22.04.7 +libstdc++6=12.3.0-1ubuntu1~22.04.3 +libuuid1=2.37.2-4ubuntu3.5 +locales=2.35-0ubuntu3.13 +mount=2.37.2-4ubuntu3.5 +openssl=3.0.2-0ubuntu1.21 +tzdata=2025b-0ubuntu0.22.04.1 +util-linux=2.37.2-4ubuntu3.5 +xz-utils=5.2.5-2ubuntu1 diff --git a/releases/jammy/packages/required.txt b/releases/jammy/packages/required.txt new file mode 100644 index 00000000..5962e25f --- /dev/null +++ b/releases/jammy/packages/required.txt @@ -0,0 +1,3 @@ +apt-utils +locales +tzdata diff --git a/releases/jammy/packages/temporary.txt b/releases/jammy/packages/temporary.txt new file mode 100644 index 00000000..3db27726 --- /dev/null +++ b/releases/jammy/packages/temporary.txt @@ -0,0 +1,3 @@ +ca-certificates +curl +xz-utils diff --git a/releases/jammy/platforms.txt b/releases/jammy/platforms.txt new file mode 100644 index 00000000..746ac13c --- /dev/null +++ b/releases/jammy/platforms.txt @@ -0,0 +1,6 @@ +linux/amd64 +linux/arm/v7 +linux/arm64 +linux/ppc64le +linux/riscv64 +linux/s390x diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run new file mode 100755 index 00000000..21165c1b --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +if [ -e /.base-apply-permissions-complete ]; then + exit 0 +fi + +echo 'Applying permissions for /config folder ...' +chown -R primary-user:primary-user /config +echo 'Applying permissions for /config folder ... Done' +touch /.base-apply-permissions-complete diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up new file mode 100644 index 00000000..7aed94a8 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up @@ -0,0 +1 @@ +45000 diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up new file mode 100644 index 00000000..f2d2a51a --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-apply-permissions/run diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run new file mode 100755 index 00000000..ae9c2a8f --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run @@ -0,0 +1,27 @@ +#!/command/with-contenv bash + +set -e + +if [ -e /.base-set-up-timezone-complete ]; then + exit 0 +fi + +if [[ $TZ ]]; then + find_result=$(find /usr/share/zoneinfo/ -path /usr/share/zoneinfo/$TZ) + + if [[ $find_result == "/usr/share/zoneinfo/$TZ" ]]; then + compare_result=$(cmp -s /etc/localtime /usr/share/zoneinfo/$TZ; echo $?) + + if (( $compare_result != 0 )); then + echo "Modifying timezone ($TZ) ..." + ln -fs /usr/share/zoneinfo/$TZ /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata 2> /dev/null + echo "Modifying timezone ($TZ) ... Done" + fi + else + echo "Invalid time zone given: $TZ" + exit 1 + fi +fi + +touch /.base-set-up-timezone-complete diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up new file mode 100644 index 00000000..5caff40c --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up @@ -0,0 +1 @@ +10000 diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up new file mode 100644 index 00000000..78cfca7d --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run new file mode 100755 index 00000000..98f0173e --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run @@ -0,0 +1,55 @@ +#!/command/with-contenv bash + +set -e + +if [ -e /.base-set-up-user-complete ]; then + exit 0 +fi + +current_puid=$(id -u primary-user) +current_pgid=$(id -g primary-user) + +if [[ $PUID && $PUID != $current_puid ]]; then + echo "Modifying UID for primary-user ($PUID) ..." + usermod -o -u $PUID primary-user + echo "Modifying UID for primary-user ($PUID) ... Done" +fi + +if [[ $PGID && $PGID != $current_pgid ]]; then + echo "Modifying GID for primary-user ($PGID) ..." + groupmod -o -g $PGID primary-user + echo "Modifying GID for primary-user ($PGID) ... Done" +fi + +if [[ $SGID ]]; then + group_prefix='secondary-group' + incoming_sgids=(${SGID//,/ }) + new_group_count=0 + new_group_names=() + + for current_incoming_sgid in "${incoming_sgids[@]}"; do + if (( $new_group_count == 0 )); then + new_group_name=$group_prefix + else + group_number="0${new_group_count}" + new_group_name="$group_prefix-${group_number: -2}" + fi + + echo "Adding group $new_group_name ($current_incoming_sgid) ..." + groupadd -g $current_incoming_sgid $new_group_name + echo "Adding group $new_group_name ($current_incoming_sgid) ... Done" + + new_group_count=$((new_group_count + 1)) + new_group_names+=($new_group_name) + done + + if (( $new_group_count > 0 )); then + for new_group_name in "${new_group_names[@]}"; do + echo "Adding primary-user to new group ($new_group_name) ..." + usermod -a -G $new_group_name primary-user + echo "Adding primary-user to new group ($new_group_name) ... Done" + done + fi +fi + +touch /.base-set-up-user-complete diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up new file mode 100644 index 00000000..3a05c8b3 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up @@ -0,0 +1 @@ +30000 diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up new file mode 100644 index 00000000..e8a9d0e8 --- /dev/null +++ b/releases/jammy/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-set-up-user/run diff --git a/releases/jammy/test/.dockerignore b/releases/jammy/test/.dockerignore new file mode 100644 index 00000000..6e19512a --- /dev/null +++ b/releases/jammy/test/.dockerignore @@ -0,0 +1,2 @@ +.dockerignore +Dockerfile diff --git a/releases/jammy/test/Dockerfile b/releases/jammy/test/Dockerfile new file mode 100644 index 00000000..3a577da6 --- /dev/null +++ b/releases/jammy/test/Dockerfile @@ -0,0 +1,4 @@ +FROM ci:image + +# add local files +COPY root/ / diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user new file mode 100644 index 00000000..e69de29b diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/finish b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/finish new file mode 100644 index 00000000..5e06fa5b --- /dev/null +++ b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/finish @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e +echo "$1" > /run/s6-linux-init-container-results/exitcode + +/run/s6/basedir/bin/halt diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/run b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/run new file mode 100755 index 00000000..8296bd7d --- /dev/null +++ b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/run @@ -0,0 +1,65 @@ +#!/command/with-contenv bash + +set -e + +echo "Platform: $(uname -m)" + +result=0 + +echo "=> Check '/.base-apply-permissions-complete' exists" + +if [ -e /.base-apply-permissions-complete ]; then + echo "=> Success! File '/.base-apply-permissions-complete' exists" +else + echo "=> Failed! File '/.base-apply-permissions-complete' missing" + + result=1 +fi + +echo "=> Check '/.base-set-up-timezone-complete' exists" + +if [ -e /.base-set-up-timezone-complete ]; then + echo "=> Success! File '/.base-set-up-timezone-complete' exists" +else + echo "=> Failed! File '/.base-set-up-timezone-complete' missing" + + result=1 +fi + +echo "=> Check '/.base-set-up-user-complete' exists" + +if [ -e /.base-set-up-user-complete ]; then + echo "=> Success! File '/.base-set-up-user-complete' exists" +else + echo "=> Failed! File '/.base-set-up-user-complete' missing" + + result=1 +fi + +echo "=> Check '/etc/timezone' is correct" + +timezone=$(cat /etc/timezone) + +if [[ "$timezone" == "$TZ" ]]; then + echo "=> Success! File '/etc/timezone' correct" +else + echo "=> Failed! File '/etc/timezone' incorrect ($timezone => $TZ)" + + result=1 +fi + +echo "=> Check '/etc/localtime' is correct" + +localtime=$(readlink /etc/localtime) +expected="/usr/share/zoneinfo/$TZ" + +if [[ "$localtime" == "$expected" ]]; then + echo "=> Success! File '/etc/localtime' correct" +else + echo "=> Failed! File '/etc/localtime' incorrect ($localtime => $expected)" + + result=1 +fi + +exit $result + diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/type b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/type new file mode 100644 index 00000000..5883cff0 --- /dev/null +++ b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/test/type @@ -0,0 +1 @@ +longrun diff --git a/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test b/releases/jammy/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/.dockerignore b/releases/noble/.dockerignore new file mode 100644 index 00000000..6a8a4335 --- /dev/null +++ b/releases/noble/.dockerignore @@ -0,0 +1,15 @@ +.git/ +.github/ +.vscode/ +test/ +packages/required.txt +.dockerignore +.editorconfig +.gitattributes +.gitignore +.hadolint.yml +.markdownlint.yml +.markdownlintignore +Dockerfile +LICENSE +README.md diff --git a/Dockerfile b/releases/noble/Dockerfile similarity index 100% rename from Dockerfile rename to releases/noble/Dockerfile diff --git a/packages/generated/install.txt b/releases/noble/packages/generated/install.txt similarity index 100% rename from packages/generated/install.txt rename to releases/noble/packages/generated/install.txt diff --git a/releases/noble/packages/required.txt b/releases/noble/packages/required.txt new file mode 100644 index 00000000..5962e25f --- /dev/null +++ b/releases/noble/packages/required.txt @@ -0,0 +1,3 @@ +apt-utils +locales +tzdata diff --git a/releases/noble/packages/temporary.txt b/releases/noble/packages/temporary.txt new file mode 100644 index 00000000..3db27726 --- /dev/null +++ b/releases/noble/packages/temporary.txt @@ -0,0 +1,3 @@ +ca-certificates +curl +xz-utils diff --git a/releases/noble/platforms.txt b/releases/noble/platforms.txt new file mode 100644 index 00000000..746ac13c --- /dev/null +++ b/releases/noble/platforms.txt @@ -0,0 +1,6 @@ +linux/amd64 +linux/arm/v7 +linux/arm64 +linux/ppc64le +linux/riscv64 +linux/s390x diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/dependencies.d/base-set-up-user new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run new file mode 100755 index 00000000..21165c1b --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/run @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +if [ -e /.base-apply-permissions-complete ]; then + exit 0 +fi + +echo 'Applying permissions for /config folder ...' +chown -R primary-user:primary-user /config +echo 'Applying permissions for /config folder ... Done' +touch /.base-apply-permissions-complete diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up new file mode 100644 index 00000000..7aed94a8 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/timeout-up @@ -0,0 +1 @@ +45000 diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up new file mode 100644 index 00000000..f2d2a51a --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-apply-permissions/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-apply-permissions/run diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/dependencies.d/base new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run new file mode 100755 index 00000000..ae9c2a8f --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run @@ -0,0 +1,27 @@ +#!/command/with-contenv bash + +set -e + +if [ -e /.base-set-up-timezone-complete ]; then + exit 0 +fi + +if [[ $TZ ]]; then + find_result=$(find /usr/share/zoneinfo/ -path /usr/share/zoneinfo/$TZ) + + if [[ $find_result == "/usr/share/zoneinfo/$TZ" ]]; then + compare_result=$(cmp -s /etc/localtime /usr/share/zoneinfo/$TZ; echo $?) + + if (( $compare_result != 0 )); then + echo "Modifying timezone ($TZ) ..." + ln -fs /usr/share/zoneinfo/$TZ /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata 2> /dev/null + echo "Modifying timezone ($TZ) ... Done" + fi + else + echo "Invalid time zone given: $TZ" + exit 1 + fi +fi + +touch /.base-set-up-timezone-complete diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up new file mode 100644 index 00000000..5caff40c --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/timeout-up @@ -0,0 +1 @@ +10000 diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up new file mode 100644 index 00000000..78cfca7d --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-timezone/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-set-up-timezone/run diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/dependencies.d/base new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run new file mode 100755 index 00000000..98f0173e --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/run @@ -0,0 +1,55 @@ +#!/command/with-contenv bash + +set -e + +if [ -e /.base-set-up-user-complete ]; then + exit 0 +fi + +current_puid=$(id -u primary-user) +current_pgid=$(id -g primary-user) + +if [[ $PUID && $PUID != $current_puid ]]; then + echo "Modifying UID for primary-user ($PUID) ..." + usermod -o -u $PUID primary-user + echo "Modifying UID for primary-user ($PUID) ... Done" +fi + +if [[ $PGID && $PGID != $current_pgid ]]; then + echo "Modifying GID for primary-user ($PGID) ..." + groupmod -o -g $PGID primary-user + echo "Modifying GID for primary-user ($PGID) ... Done" +fi + +if [[ $SGID ]]; then + group_prefix='secondary-group' + incoming_sgids=(${SGID//,/ }) + new_group_count=0 + new_group_names=() + + for current_incoming_sgid in "${incoming_sgids[@]}"; do + if (( $new_group_count == 0 )); then + new_group_name=$group_prefix + else + group_number="0${new_group_count}" + new_group_name="$group_prefix-${group_number: -2}" + fi + + echo "Adding group $new_group_name ($current_incoming_sgid) ..." + groupadd -g $current_incoming_sgid $new_group_name + echo "Adding group $new_group_name ($current_incoming_sgid) ... Done" + + new_group_count=$((new_group_count + 1)) + new_group_names+=($new_group_name) + done + + if (( $new_group_count > 0 )); then + for new_group_name in "${new_group_names[@]}"; do + echo "Adding primary-user to new group ($new_group_name) ..." + usermod -a -G $new_group_name primary-user + echo "Adding primary-user to new group ($new_group_name) ... Done" + done + fi +fi + +touch /.base-set-up-user-complete diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up new file mode 100644 index 00000000..3a05c8b3 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/timeout-up @@ -0,0 +1 @@ +30000 diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type new file mode 100644 index 00000000..bdd22a18 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/type @@ -0,0 +1 @@ +oneshot diff --git a/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up new file mode 100644 index 00000000..e8a9d0e8 --- /dev/null +++ b/releases/noble/root/etc/s6-overlay/s6-rc.d/base-set-up-user/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/base-set-up-user/run diff --git a/releases/noble/test/.dockerignore b/releases/noble/test/.dockerignore new file mode 100644 index 00000000..6e19512a --- /dev/null +++ b/releases/noble/test/.dockerignore @@ -0,0 +1,2 @@ +.dockerignore +Dockerfile diff --git a/releases/noble/test/Dockerfile b/releases/noble/test/Dockerfile new file mode 100644 index 00000000..3a577da6 --- /dev/null +++ b/releases/noble/test/Dockerfile @@ -0,0 +1,4 @@ +FROM ci:image + +# add local files +COPY root/ / diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-apply-permissions new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-timezone new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/dependencies.d/base-set-up-user new file mode 100644 index 00000000..e69de29b diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/finish b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/finish new file mode 100644 index 00000000..5e06fa5b --- /dev/null +++ b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/finish @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e +echo "$1" > /run/s6-linux-init-container-results/exitcode + +/run/s6/basedir/bin/halt diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/run b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/run new file mode 100755 index 00000000..8296bd7d --- /dev/null +++ b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/run @@ -0,0 +1,65 @@ +#!/command/with-contenv bash + +set -e + +echo "Platform: $(uname -m)" + +result=0 + +echo "=> Check '/.base-apply-permissions-complete' exists" + +if [ -e /.base-apply-permissions-complete ]; then + echo "=> Success! File '/.base-apply-permissions-complete' exists" +else + echo "=> Failed! File '/.base-apply-permissions-complete' missing" + + result=1 +fi + +echo "=> Check '/.base-set-up-timezone-complete' exists" + +if [ -e /.base-set-up-timezone-complete ]; then + echo "=> Success! File '/.base-set-up-timezone-complete' exists" +else + echo "=> Failed! File '/.base-set-up-timezone-complete' missing" + + result=1 +fi + +echo "=> Check '/.base-set-up-user-complete' exists" + +if [ -e /.base-set-up-user-complete ]; then + echo "=> Success! File '/.base-set-up-user-complete' exists" +else + echo "=> Failed! File '/.base-set-up-user-complete' missing" + + result=1 +fi + +echo "=> Check '/etc/timezone' is correct" + +timezone=$(cat /etc/timezone) + +if [[ "$timezone" == "$TZ" ]]; then + echo "=> Success! File '/etc/timezone' correct" +else + echo "=> Failed! File '/etc/timezone' incorrect ($timezone => $TZ)" + + result=1 +fi + +echo "=> Check '/etc/localtime' is correct" + +localtime=$(readlink /etc/localtime) +expected="/usr/share/zoneinfo/$TZ" + +if [[ "$localtime" == "$expected" ]]; then + echo "=> Success! File '/etc/localtime' correct" +else + echo "=> Failed! File '/etc/localtime' incorrect ($localtime => $expected)" + + result=1 +fi + +exit $result + diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/type b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/type new file mode 100644 index 00000000..5883cff0 --- /dev/null +++ b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/test/type @@ -0,0 +1 @@ +longrun diff --git a/releases/noble/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test b/releases/noble/test/root/etc/s6-overlay/s6-rc.d/user/contents.d/test new file mode 100644 index 00000000..e69de29b