Skip to content
Latchkey

ubuntu-tests workflow (containers/toolbox)

The ubuntu-tests workflow from containers/toolbox, explained and optimized by Latchkey.

C

CI health: C - fair

Point runs-on at Latchkey and get run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: containers/toolbox.github/workflows/ubuntu-tests.yamlLicense Apache-2.0View source

What it does

This is the ubuntu-tests workflow from the containers/toolbox repository, a real project running GitHub Actions. It is shown here with attribution under its Apache-2.0 license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
#
# Copyright © 2023 - 2026 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

name: ubuntu-tests

on:
  pull_request:
    branches:
      - main
  schedule:
    - cron: '0 0 * * *'

jobs:
  ubuntu-jammy-tests:
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          path: containers/toolbox
          submodules: true

      - name: Install deb packages
        run: |
          sudo apt-get update
          sudo apt-get install \
            apache2-utils \
            bash-completion \
            codespell \
            fish \
            flatpak \
            gcc \
            go-md2man \
            golang-1.22 \
            meson \
            ninja-build \
            openssl \
            podman \
            shellcheck \
            skopeo \
            systemd \
            udisks2

      - name: Ensure that 'p11-kit server' is absent
        run: sudo rm /usr/libexec/p11-kit/p11-kit-server

      - name: Set up PATH for Go 1.22
        run: |
          echo "PATH=/usr/lib/go-1.22/bin:$PATH" >> "$GITHUB_ENV"

      - name: Checkout Bats
        uses: actions/checkout@v4
        with:
          path: bats-core/bats-core
          ref: v1.10.0
          repository: bats-core/bats-core.git
          submodules: true

      - name: Install deb packages for Bats
        run: |
          sudo apt-get update
          sudo apt-get install \
            bash \
            parallel

      - name: Install Bats
        run: sudo ./install.sh /usr/local
        working-directory: bats-core/bats-core

      - name: Checkout shadow
        uses: actions/checkout@v4
        with:
          path: shadow-maint/shadow
          ref: 4.13
          repository: shadow-maint/shadow.git
          submodules: true

      - name: Install deb packages for shadow
        run: |
          sudo apt-get update
          sudo apt-get install \
            autoconf \
            autopoint \
            gettext \
            libaudit-dev \
            libcrypt-dev \
            libpam0g-dev \
            libselinux1-dev \
            libsemanage-dev

      - name: Set up build directory for shadow
        run: |
          autoreconf --force --install --verbose
          ./configure \
            --disable-account-tools-setuid \
            --disable-silent-rules \
            --with-audit \
            --with-libpam \
            --with-selinux \
            --with-yescrypt \
            --without-acl \
            --without-attr \
            --without-su \
            --without-tcb \
            SHELL=/bin/sh
        working-directory: shadow-maint/shadow

      - name: Build shadow
        run: make
        working-directory: shadow-maint/shadow

      - name: Install shadow
        run: sudo make install
        working-directory: shadow-maint/shadow

      - name: Download Go modules
        run: go mod download -x
        working-directory: containers/toolbox/src

      - name: Set up build directory
        run: meson setup builddir
        working-directory: containers/toolbox

      - name: Build
        run: meson compile -C builddir --verbose
        working-directory: containers/toolbox

      - name: Install
        run: sudo meson install -C builddir
        working-directory: containers/toolbox

      - name: Unit tests
        run: meson test -C builddir --verbose
        working-directory: containers/toolbox

      - name: System tests
        run: |
          bats --timing \
            test/system/001-version.bats \
            test/system/002-help.bats \
            test/system/101-create.bats \
            test/system/102-list.bats \
            test/system/103-container.bats \
            test/system/105-enter.bats \
            test/system/106-rm.bats \
            test/system/107-rmi.bats \
            test/system/108-completion.bats \
            test/system/201-ipc.bats \
            test/system/203-network.bats \
            test/system/210-ulimit.bats \
            test/system/220-environment-variables.bats \
            test/system/230-cdi.bats \
            test/system/250-kerberos.bats \
            test/system/270-rpm.bats \
            test/system/501-create.bats \
            test/system/505-enter.bats
        env:
          SHELL: /bin/bash
          TMPDIR: /var/tmp
          TOOLBX: /usr/local/bin/toolbox
        working-directory: containers/toolbox

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

#
# Copyright © 2023 - 2026 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
 
name: ubuntu-tests
 
on:
  pull_request:
    branches:
      - main
  schedule:
    - cron: '0 0 * * *'
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  ubuntu-jammy-tests:
    timeout-minutes: 30
    runs-on: latchkey-small
 
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          path: containers/toolbox
          submodules: true
 
      - name: Install deb packages
        run: |
          sudo apt-get update
          sudo apt-get install \
            apache2-utils \
            bash-completion \
            codespell \
            fish \
            flatpak \
            gcc \
            go-md2man \
            golang-1.22 \
            meson \
            ninja-build \
            openssl \
            podman \
            shellcheck \
            skopeo \
            systemd \
            udisks2
 
      - name: Ensure that 'p11-kit server' is absent
        run: sudo rm /usr/libexec/p11-kit/p11-kit-server
 
      - name: Set up PATH for Go 1.22
        run: |
          echo "PATH=/usr/lib/go-1.22/bin:$PATH" >> "$GITHUB_ENV"
 
      - name: Checkout Bats
        uses: actions/checkout@v4
        with:
          path: bats-core/bats-core
          ref: v1.10.0
          repository: bats-core/bats-core.git
          submodules: true
 
      - name: Install deb packages for Bats
        run: |
          sudo apt-get update
          sudo apt-get install \
            bash \
            parallel
 
      - name: Install Bats
        run: sudo ./install.sh /usr/local
        working-directory: bats-core/bats-core
 
      - name: Checkout shadow
        uses: actions/checkout@v4
        with:
          path: shadow-maint/shadow
          ref: 4.13
          repository: shadow-maint/shadow.git
          submodules: true
 
      - name: Install deb packages for shadow
        run: |
          sudo apt-get update
          sudo apt-get install \
            autoconf \
            autopoint \
            gettext \
            libaudit-dev \
            libcrypt-dev \
            libpam0g-dev \
            libselinux1-dev \
            libsemanage-dev
 
      - name: Set up build directory for shadow
        run: |
          autoreconf --force --install --verbose
          ./configure \
            --disable-account-tools-setuid \
            --disable-silent-rules \
            --with-audit \
            --with-libpam \
            --with-selinux \
            --with-yescrypt \
            --without-acl \
            --without-attr \
            --without-su \
            --without-tcb \
            SHELL=/bin/sh
        working-directory: shadow-maint/shadow
 
      - name: Build shadow
        run: make
        working-directory: shadow-maint/shadow
 
      - name: Install shadow
        run: sudo make install
        working-directory: shadow-maint/shadow
 
      - name: Download Go modules
        run: go mod download -x
        working-directory: containers/toolbox/src
 
      - name: Set up build directory
        run: meson setup builddir
        working-directory: containers/toolbox
 
      - name: Build
        run: meson compile -C builddir --verbose
        working-directory: containers/toolbox
 
      - name: Install
        run: sudo meson install -C builddir
        working-directory: containers/toolbox
 
      - name: Unit tests
        run: meson test -C builddir --verbose
        working-directory: containers/toolbox
 
      - name: System tests
        run: |
          bats --timing \
            test/system/001-version.bats \
            test/system/002-help.bats \
            test/system/101-create.bats \
            test/system/102-list.bats \
            test/system/103-container.bats \
            test/system/105-enter.bats \
            test/system/106-rm.bats \
            test/system/107-rmi.bats \
            test/system/108-completion.bats \
            test/system/201-ipc.bats \
            test/system/203-network.bats \
            test/system/210-ulimit.bats \
            test/system/220-environment-variables.bats \
            test/system/230-cdi.bats \
            test/system/250-kerberos.bats \
            test/system/270-rpm.bats \
            test/system/501-create.bats \
            test/system/505-enter.bats
        env:
          SHELL: /bin/bash
          TMPDIR: /var/tmp
          TOOLBX: /usr/local/bin/toolbox
        working-directory: containers/toolbox
 

What changed

What Latchkey heals here

This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:

This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow