From fefa510fa91936a0a097ebac31f6b4f08fa30d5a Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Mon, 10 Feb 2025 10:40:13 -0800 Subject: [PATCH 1/9] scheduled: Support multi-arch --- .github/workflows/build.yaml | 2 +- .github/workflows/scheduled.yaml | 32 ++---------------- .github/workflows/scheduled_job.yaml | 50 ++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/scheduled_job.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fab90cef..22aebd0d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -131,7 +131,7 @@ env: jobs: debs: - runs-on: ${{ inputs.ARCH == 'x64' && 'ubuntu-22.04' || inputs.ARCH }} + runs-on: ${{ (inputs.ARCH == 'x64' && 'ubuntu-22.04') || (inputs.ARCH == 'arm64' && 'ubuntu-22.04-arm') || inputs.ARCH }} timeout-minutes: ${{ inputs.ARCH == 'x64' && 340 || 2880 }} name: build debs outputs: diff --git a/.github/workflows/scheduled.yaml b/.github/workflows/scheduled.yaml index cff64bc9..49093d6b 100644 --- a/.github/workflows/scheduled.yaml +++ b/.github/workflows/scheduled.yaml @@ -13,34 +13,8 @@ jobs: fail-fast: false matrix: DEB_DISTRO: [jammy, noble] - uses: ubi-agni/ros-builder-action/.github/workflows/build.yaml@main + ARCH: [x64, arm64] + uses: ./.github/workflows/scheduled_job.yaml with: DEB_DISTRO: ${{ matrix.DEB_DISTRO }} - ROS_SOURCES: ros-one.repos - INSTALL_GPG_KEYS: | - sudo curl -sSL https://ros.packages.techfak.net/gpg.key -o /etc/apt/keyrings/ros-one-keyring.gpg - sudo mkdir -p /etc/ros/rosdep/sources.list.d - echo "yaml https://ros.packages.techfak.net/ros-one.yaml ${{ matrix.DEB_DISTRO }}" | sudo tee /etc/ros/rosdep/sources.list.d/1-ros-one.list - EXTRA_DEB_SOURCES: "deb [signed-by=/etc/apt/keyrings/ros-one-keyring.gpg] https://ros.packages.techfak.net ${{matrix.DEB_DISTRO}}-testing main" - # proceed from existing debs artifact if run_attempt > 1 - DOWNLOAD_DEBS: ${{ github.run_attempt != '1' }} - DEBS_ARTIFACT_NAME: ${{ matrix.DEB_DISTRO }}-debs - SKIP_EXISTING: true - SKIP_KNOWN_FAILING: true - CONTINUE_ON_ERROR: true - INSTALL_TO_CHROOT: false - - deploy: - needs: build - if: always() && vars.DEPLOY_URL - timeout-minutes: 15 - runs-on: ubuntu-latest - concurrency: - # Ensure exclusive access to deployment target - group: ${{ vars.DEPLOY_URL }} - cancel-in-progress: false - steps: - - name: Import build artifacts to reprepro server - uses: ubi-agni/ros-builder-action/reprepro@main - with: - url: "${{ vars.DEPLOY_URL }}?run_id=${{ github.run_id }}&arch=x64" + ARCH: ${{ matrix.ARCH }} diff --git a/.github/workflows/scheduled_job.yaml b/.github/workflows/scheduled_job.yaml new file mode 100644 index 00000000..c3bbb5c4 --- /dev/null +++ b/.github/workflows/scheduled_job.yaml @@ -0,0 +1,50 @@ +name: scheduled job +run-name: "scheduled: ${{ inputs.DEB_DISTRO }}-${{ inputs.ARCH }}" + +on: + # make this workflow reusable (and only so) + workflow_call: + inputs: + DEB_DISTRO: + type: string + description: The Debian/Ubuntu distribution codename to compile for + required: true + ARCH: + type: string + description: CPU architecture + required: true + +jobs: + build: + uses: ./.github/workflows/build.yaml + with: + DEB_DISTRO: ${{ inputs.DEB_DISTRO }} + ROS_SOURCES: ros-one.repos + ARCH: ${{ inputs.ARCH }} + INSTALL_GPG_KEYS: | + sudo curl -sSL https://ros.packages.techfak.net/gpg.key -o /etc/apt/keyrings/ros-one-keyring.gpg + sudo mkdir -p /etc/ros/rosdep/sources.list.d + echo "yaml https://ros.packages.techfak.net/ros-one.yaml ${{ inputs.DEB_DISTRO }}" | sudo tee /etc/ros/rosdep/sources.list.d/1-ros-one.list + EXTRA_DEB_SOURCES: "deb [signed-by=/etc/apt/keyrings/ros-one-keyring.gpg] https://ros.packages.techfak.net ${{inputs.DEB_DISTRO}}-testing main" + # proceed from existing debs artifact if run_attempt > 1 + DOWNLOAD_DEBS: ${{ github.run_attempt != '1' }} + DEBS_ARTIFACT_NAME: ${{ inputs.DEB_DISTRO }}-debs + SKIP_EXISTING: true + SKIP_KNOWN_FAILING: true + CONTINUE_ON_ERROR: true + INSTALL_TO_CHROOT: false + + deploy: + needs: build + if: always() && vars.DEPLOY_URL + timeout-minutes: 15 + runs-on: ubuntu-latest + concurrency: + # Ensure exclusive access to deployment target + group: ${{ vars.DEPLOY_URL }} + cancel-in-progress: false + steps: + - name: Import build artifacts to reprepro server + uses: ./reprepro@main + with: + url: "${{ vars.DEPLOY_URL }}?distro=${{ inputs.DEB_DISTRO }}&run_id=${{ github.run_id }}&arch=${{ inputs.ARCH }}" From 86a79295f627a517bc016a2e19c036629f0bf923 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Mon, 10 Feb 2025 17:39:55 -0800 Subject: [PATCH 2/9] Use sudo for sbuild on arm64 --- src/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/build.sh b/src/build.sh index 392ffc39..f7b2e776 100644 --- a/src/build.sh +++ b/src/build.sh @@ -227,8 +227,9 @@ function build_pkg { fi if [ -n "$opts" ]; then opts="$EXTRA_SBUILD_OPTS $opts"; fi + # The `sg` command without `sudo` does not work on Ubuntu Arm64 environment in Github Actions. SBUILD_OPTS="--verbose --chroot=sbuild --no-clean-source --no-run-lintian --dist=$DEB_DISTRO $opts" - ici_label "${SBUILD_QUIET[@]}" sg sbuild -c "sbuild $SBUILD_OPTS" || return 4 + ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u $USER sbuild $SBUILD_OPTS || return 4 "${CCACHE_QUIET[@]}" ici_label ccache -sv || return 1 BUILT_PACKAGES+=("$(deb_pkg_name "$pkg_name"): $version_link") From 657dd48c0463df6d6ce1dbd3d939f8ad6fac80a5 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Mon, 10 Feb 2025 20:07:46 -0800 Subject: [PATCH 3/9] linter --- .github/workflows/scheduled_job.yaml | 2 +- src/build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scheduled_job.yaml b/.github/workflows/scheduled_job.yaml index c3bbb5c4..842018c0 100644 --- a/.github/workflows/scheduled_job.yaml +++ b/.github/workflows/scheduled_job.yaml @@ -13,7 +13,7 @@ on: type: string description: CPU architecture required: true - + jobs: build: uses: ./.github/workflows/build.yaml diff --git a/src/build.sh b/src/build.sh index f7b2e776..75b09920 100644 --- a/src/build.sh +++ b/src/build.sh @@ -229,7 +229,7 @@ function build_pkg { # The `sg` command without `sudo` does not work on Ubuntu Arm64 environment in Github Actions. SBUILD_OPTS="--verbose --chroot=sbuild --no-clean-source --no-run-lintian --dist=$DEB_DISTRO $opts" - ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u $USER sbuild $SBUILD_OPTS || return 4 + ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u "$USER" sbuild "$SBUILD_OPTS" || return 4 "${CCACHE_QUIET[@]}" ici_label ccache -sv || return 1 BUILT_PACKAGES+=("$(deb_pkg_name "$pkg_name"): $version_link") From 6f3dde51866ecc0eefa3a5abb9311da94d899fc1 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Mon, 10 Feb 2025 20:33:19 -0800 Subject: [PATCH 4/9] Use bash for entrypoint --- src/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build.sh b/src/build.sh index 75b09920..7184fba5 100644 --- a/src/build.sh +++ b/src/build.sh @@ -229,7 +229,7 @@ function build_pkg { # The `sg` command without `sudo` does not work on Ubuntu Arm64 environment in Github Actions. SBUILD_OPTS="--verbose --chroot=sbuild --no-clean-source --no-run-lintian --dist=$DEB_DISTRO $opts" - ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u "$USER" sbuild "$SBUILD_OPTS" || return 4 + ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u "$USER" bash -lc "sbuild $SBUILD_OPTS" || return 4 "${CCACHE_QUIET[@]}" ici_label ccache -sv || return 1 BUILT_PACKAGES+=("$(deb_pkg_name "$pkg_name"): $version_link") From 3f847bd12430402069f467a93d29387bd6f2aeb3 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Tue, 11 Feb 2025 09:05:09 -0800 Subject: [PATCH 5/9] ci.yaml: Enable arm64 test --- .github/workflows/ci.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2820c408..9f07ce24 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -48,7 +48,7 @@ jobs: build: needs: unittests - name: "${{ matrix.DEB_DISTRO }}, ${{ matrix.ROS_SOURCES }}\ + name: "${{ matrix.DEB_DISTRO }}, ${{ matrix.ARCH }}, ${{ matrix.ROS_SOURCES }}\ ${{ matrix.VERBOSE && format(', verbose={0}', matrix.VERBOSE) || '' }}\ ${{ matrix.BUILD_TIMEOUT && format(', timeout={0}', matrix.BUILD_TIMEOUT) || '' }}\ ${{ matrix.CONTINUE_ON_ERROR && ', cont-on-err' || '' }}" @@ -57,6 +57,7 @@ jobs: fail-fast: false matrix: DEB_DISTRO: [ bookworm, jammy, noble ] + ARCH: [ x64, arm64 ] BUILD_TIMEOUT: [ 0 ] include: # defaults (can be overriden with values from include w/o adding jobs) @@ -72,6 +73,7 @@ jobs: uses: ./.github/workflows/build.yaml with: DEB_DISTRO: ${{ matrix.DEB_DISTRO }} + ARCH: ${{ matrix.ARCH }} ROS_DISTRO: ${{ matrix.ROS_DISTRO }} ROS_SOURCES: .github/workflows/${{ matrix.ROS_SOURCES }}.repos INSTALL_TO_CHROOT: ${{ matrix.BUILD_TIMEOUT > 0 }} # slow down for timeout test From 09a0c24a8f55502be0397334c2c8cb87ebce68b9 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Tue, 11 Feb 2025 09:29:54 -0800 Subject: [PATCH 6/9] Add build-essential to be installed packages --- src/scripts/prepare.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/prepare.sh b/src/scripts/prepare.sh index 7bc18fa5..b08a9128 100755 --- a/src/scripts/prepare.sh +++ b/src/scripts/prepare.sh @@ -32,7 +32,7 @@ echo apt-cacher-ng apt-cacher-ng/tunnelenable boolean true | ici_asroot debconf- DEBIAN_FRONTEND=noninteractive ici_timed "Install build packages" ici_cmd "${APT_QUIET[@]}" ici_apt_install \ mmdebstrap sbuild schroot devscripts ccache apt-cacher-ng python3-pip python3-rosdep libxml2-utils libarchive-tools \ python3-colcon-package-information python3-colcon-package-selection python3-colcon-ros python3-colcon-cmake \ - python3-stdeb python3-all dh-python + python3-stdeb python3-all dh-python build-essential # Install patched bloom to handle ROS "one" distro key when resolving python and ROS version ici_timed "Install bloom" ici_asroot pip install -U git+https://github.com/rhaschke/bloom.git@ros-one From 5df3e31a5435f959f87e79eb4b3bc1212c0597ec Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Tue, 11 Feb 2025 10:20:04 -0800 Subject: [PATCH 7/9] Minor fix on ternary operator --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 22aebd0d..02477738 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -131,7 +131,7 @@ env: jobs: debs: - runs-on: ${{ (inputs.ARCH == 'x64' && 'ubuntu-22.04') || (inputs.ARCH == 'arm64' && 'ubuntu-22.04-arm') || inputs.ARCH }} + runs-on: ${{ inputs.ARCH == 'x64' && 'ubuntu-22.04' || (inputs.ARCH == 'arm64' && 'ubuntu-22.04-arm' || inputs.ARCH) }} timeout-minutes: ${{ inputs.ARCH == 'x64' && 340 || 2880 }} name: build debs outputs: From f6313cd6b2722ee56ab426ecf94769e50407d8c2 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Tue, 11 Feb 2025 10:20:26 -0800 Subject: [PATCH 8/9] Use || true instead of continue-on-error --- .github/workflows/build.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 02477738..f228f9c8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -188,8 +188,7 @@ jobs: - name: Delete old ccache if: always() && steps.restore-ccache.outputs.cache-hit - continue-on-error: true - run: gh cache delete "${{ steps.restore-ccache.outputs.cache-primary-key }}" + run: gh cache delete "${{ steps.restore-ccache.outputs.cache-primary-key }}" || true env: GH_TOKEN: ${{ github.token }} - name: Store ccache From 91f774796c47fda0d32a3e1ef2e97d82722e4d9b Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Feb 2025 09:01:25 +0100 Subject: [PATCH 9/9] Minimize changeset --- .github/workflows/ci.yaml | 13 ++++---- .github/workflows/scheduled.yaml | 30 ++++++++++++++++- .github/workflows/scheduled_job.yaml | 50 ---------------------------- src/build.sh | 3 +- 4 files changed, 36 insertions(+), 60 deletions(-) delete mode 100644 .github/workflows/scheduled_job.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9f07ce24..bfb24a64 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -48,7 +48,7 @@ jobs: build: needs: unittests - name: "${{ matrix.DEB_DISTRO }}, ${{ matrix.ARCH }}, ${{ matrix.ROS_SOURCES }}\ + name: "${{ matrix.DEB_DISTRO }}-${{ matrix.ARCH }}, ${{ matrix.ROS_SOURCES }}\ ${{ matrix.VERBOSE && format(', verbose={0}', matrix.VERBOSE) || '' }}\ ${{ matrix.BUILD_TIMEOUT && format(', timeout={0}', matrix.BUILD_TIMEOUT) || '' }}\ ${{ matrix.CONTINUE_ON_ERROR && ', cont-on-err' || '' }}" @@ -57,24 +57,23 @@ jobs: fail-fast: false matrix: DEB_DISTRO: [ bookworm, jammy, noble ] - ARCH: [ x64, arm64 ] + ARCH: [ x64 ] BUILD_TIMEOUT: [ 0 ] include: # defaults (can be overriden with values from include w/o adding jobs) - - { ROS_SOURCES: 'good', DEBS: false, VERBOSE: false } + - { ROS_SOURCES: good, DEBS: false, VERBOSE: false } # override/add settings for specific distros - { DEB_DISTRO: bookworm, DEBS: true, VERBOSE: bloom } - { DEB_DISTRO: noble, VERBOSE: true } - - { DEB_DISTRO: jammy, BUILD_TIMEOUT: 3, ROS_SOURCES: 'good', DEBS: true, EXPECT_EXIT_CODE: 143 } + - { DEB_DISTRO: jammy, ARCH: arm64, BUILD_TIMEOUT: 3, ROS_SOURCES: good, DEBS: true, EXPECT_EXIT_CODE: 143 } # add failing jobs - - { DEB_DISTRO: focal, ROS_SOURCES: broken, EXPECT_EXIT_CODE: 2, CONTINUE_ON_ERROR: false, DEBS: true } - - { DEB_DISTRO: focal, ROS_SOURCES: broken, EXPECT_EXIT_CODE: 1, CONTINUE_ON_ERROR: true, COLCON_PKG_SELECTION: '--packages-up-to rostime' } + - { DEB_DISTRO: focal, ARCH: x64, ROS_SOURCES: broken, EXPECT_EXIT_CODE: 2, CONTINUE_ON_ERROR: false, DEBS: true } + - { DEB_DISTRO: focal, ARCH: x64, ROS_SOURCES: broken, EXPECT_EXIT_CODE: 1, CONTINUE_ON_ERROR: true, COLCON_PKG_SELECTION: '--packages-up-to rostime' } uses: ./.github/workflows/build.yaml with: DEB_DISTRO: ${{ matrix.DEB_DISTRO }} ARCH: ${{ matrix.ARCH }} - ROS_DISTRO: ${{ matrix.ROS_DISTRO }} ROS_SOURCES: .github/workflows/${{ matrix.ROS_SOURCES }}.repos INSTALL_TO_CHROOT: ${{ matrix.BUILD_TIMEOUT > 0 }} # slow down for timeout test VERBOSE: ${{ matrix.VERBOSE && matrix.VERBOSE || false }} diff --git a/.github/workflows/scheduled.yaml b/.github/workflows/scheduled.yaml index 49093d6b..18c56f4f 100644 --- a/.github/workflows/scheduled.yaml +++ b/.github/workflows/scheduled.yaml @@ -14,7 +14,35 @@ jobs: matrix: DEB_DISTRO: [jammy, noble] ARCH: [x64, arm64] - uses: ./.github/workflows/scheduled_job.yaml + uses: ./.github/workflows/build.yaml with: DEB_DISTRO: ${{ matrix.DEB_DISTRO }} ARCH: ${{ matrix.ARCH }} + ROS_SOURCES: ros-one.repos + INSTALL_GPG_KEYS: | + sudo curl -sSL https://ros.packages.techfak.net/gpg.key -o /etc/apt/keyrings/ros-one-keyring.gpg + sudo mkdir -p /etc/ros/rosdep/sources.list.d + echo "yaml https://ros.packages.techfak.net/ros-one.yaml ${{ matrix.DEB_DISTRO }}" | sudo tee /etc/ros/rosdep/sources.list.d/1-ros-one.list + EXTRA_DEB_SOURCES: "deb [signed-by=/etc/apt/keyrings/ros-one-keyring.gpg] https://ros.packages.techfak.net ${{matrix.DEB_DISTRO}}-testing main" + # proceed from existing debs artifact if run_attempt > 1 + DOWNLOAD_DEBS: ${{ github.run_attempt != '1' }} + DEBS_ARTIFACT_NAME: ${{ matrix.DEB_DISTRO }}-debs + SKIP_EXISTING: true + SKIP_KNOWN_FAILING: true + CONTINUE_ON_ERROR: true + INSTALL_TO_CHROOT: false + + deploy: + needs: build + if: always() && vars.DEPLOY_URL + timeout-minutes: 15 + runs-on: ubuntu-latest + concurrency: + # Ensure exclusive access to deployment target + group: ${{ vars.DEPLOY_URL }} + cancel-in-progress: false + steps: + - name: Import build artifacts to reprepro server + uses: ubi-agni/ros-builder-action/reprepro@main + with: + url: "${{ vars.DEPLOY_URL }}?run_id=${{ github.run_id }}&arch=x64" diff --git a/.github/workflows/scheduled_job.yaml b/.github/workflows/scheduled_job.yaml deleted file mode 100644 index 842018c0..00000000 --- a/.github/workflows/scheduled_job.yaml +++ /dev/null @@ -1,50 +0,0 @@ -name: scheduled job -run-name: "scheduled: ${{ inputs.DEB_DISTRO }}-${{ inputs.ARCH }}" - -on: - # make this workflow reusable (and only so) - workflow_call: - inputs: - DEB_DISTRO: - type: string - description: The Debian/Ubuntu distribution codename to compile for - required: true - ARCH: - type: string - description: CPU architecture - required: true - -jobs: - build: - uses: ./.github/workflows/build.yaml - with: - DEB_DISTRO: ${{ inputs.DEB_DISTRO }} - ROS_SOURCES: ros-one.repos - ARCH: ${{ inputs.ARCH }} - INSTALL_GPG_KEYS: | - sudo curl -sSL https://ros.packages.techfak.net/gpg.key -o /etc/apt/keyrings/ros-one-keyring.gpg - sudo mkdir -p /etc/ros/rosdep/sources.list.d - echo "yaml https://ros.packages.techfak.net/ros-one.yaml ${{ inputs.DEB_DISTRO }}" | sudo tee /etc/ros/rosdep/sources.list.d/1-ros-one.list - EXTRA_DEB_SOURCES: "deb [signed-by=/etc/apt/keyrings/ros-one-keyring.gpg] https://ros.packages.techfak.net ${{inputs.DEB_DISTRO}}-testing main" - # proceed from existing debs artifact if run_attempt > 1 - DOWNLOAD_DEBS: ${{ github.run_attempt != '1' }} - DEBS_ARTIFACT_NAME: ${{ inputs.DEB_DISTRO }}-debs - SKIP_EXISTING: true - SKIP_KNOWN_FAILING: true - CONTINUE_ON_ERROR: true - INSTALL_TO_CHROOT: false - - deploy: - needs: build - if: always() && vars.DEPLOY_URL - timeout-minutes: 15 - runs-on: ubuntu-latest - concurrency: - # Ensure exclusive access to deployment target - group: ${{ vars.DEPLOY_URL }} - cancel-in-progress: false - steps: - - name: Import build artifacts to reprepro server - uses: ./reprepro@main - with: - url: "${{ vars.DEPLOY_URL }}?distro=${{ inputs.DEB_DISTRO }}&run_id=${{ github.run_id }}&arch=${{ inputs.ARCH }}" diff --git a/src/build.sh b/src/build.sh index 7184fba5..f096a1fe 100644 --- a/src/build.sh +++ b/src/build.sh @@ -227,9 +227,8 @@ function build_pkg { fi if [ -n "$opts" ]; then opts="$EXTRA_SBUILD_OPTS $opts"; fi - # The `sg` command without `sudo` does not work on Ubuntu Arm64 environment in Github Actions. SBUILD_OPTS="--verbose --chroot=sbuild --no-clean-source --no-run-lintian --dist=$DEB_DISTRO $opts" - ici_label "${SBUILD_QUIET[@]}" sudo -E -H -u "$USER" bash -lc "sbuild $SBUILD_OPTS" || return 4 + ici_label "${SBUILD_QUIET[@]}" ici_asroot -E -H -u "$USER" bash -lc "sbuild $SBUILD_OPTS" || return 4 "${CCACHE_QUIET[@]}" ici_label ccache -sv || return 1 BUILT_PACKAGES+=("$(deb_pkg_name "$pkg_name"): $version_link")