Skip to content
Latchkey

Test and Build workflow (rsagroup/rsatoolbox)

The Test and Build workflow from rsagroup/rsatoolbox, explained and optimized by Latchkey.

D

CI health: D - needs work

Point runs-on at Latchkey and get caching, 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: rsagroup/rsatoolbox.github/workflows/testbuild.ymlLicense MITView source

What it does

This is the Test and Build workflow from the rsagroup/rsatoolbox repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.

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

The workflow

workflow (.yml)
name: Test and Build

on:
  pull_request:
    types: [opened, synchronize, reopened]
  workflow_call:

permissions:
  contents: read

jobs:

  tests:
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install dependencies
      run: pip install -r requirements.txt
    - name: Install rsatoolbox
      run: pip install .
    - name: Install test dependencies
      run: pip install -r tests/requirements.txt
    - name: Skeleton tests
      run: python -m unittest -v rsatoolbox.test
    - name: Unit tests
      run: pytest

  source:
    needs: tests
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install Build
      run: pip install build setuptools
    - name: Build package
      run: python -m build --sdist
    - name: Test package for corruption
      run: gzip -t dist/*
    - name: Install rsatoolbox (Linux, Mac)
      run: pip install dist/*
      if: matrix.os != 'windows-latest'
    - name: Install rsatoolbox (Windows)
      run: |
        $sdistfname = Get-ChildItem dist -Name
        pip install dist/$sdistfname
      if: matrix.os == 'windows-latest'
    - name: Install test dependencies
      run: pip install -r tests/requirements.txt
    - name: Skeleton tests
      run: python -m unittest -v rsatoolbox.test
    - name: Unit tests
      run: pytest
    - name: Check package compliance
      run: |
        pip install -q twine
        twine check dist/*
    - name: Store artifact
      uses: actions/upload-artifact@v6
      with:
        name: source-${{ matrix.os }}-${{ matrix.python-version }}
        path: dist/*
        if-no-files-found: error
        retention-days: 1

  binaries:
    needs: tests
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        python-version: '3.12'
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install cibuildwheel
      run: python -m pip install cibuildwheel~=3.3.1
    - name: Build wheels
      run: python -m cibuildwheel --output-dir dist
    - name: Check package compliance
      run: |
        pip install -q twine
        twine check dist/*
    - name: Store artifact
      uses: actions/upload-artifact@v6
      with:
        name: wheels-${{ matrix.os }}
        path: dist/*.whl
        if-no-files-found: error
        retention-days: 1

The same workflow, on Latchkey

Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.

name: Test and Build
 
on:
  pull_request:
    types: [opened, synchronize, reopened]
  workflow_call:
 
permissions:
  contents: read
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
 
  tests:
    timeout-minutes: 30
    runs-on: latchkey-small
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        cache: 'pip'
        python-version: '3.11'
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install dependencies
      run: pip install -r requirements.txt
    - name: Install rsatoolbox
      run: pip install .
    - name: Install test dependencies
      run: pip install -r tests/requirements.txt
    - name: Skeleton tests
      run: python -m unittest -v rsatoolbox.test
    - name: Unit tests
      run: pytest
 
  source:
    timeout-minutes: 30
    needs: tests
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        cache: 'pip'
        python-version: ${{ matrix.python-version }}
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install Build
      run: pip install build setuptools
    - name: Build package
      run: python -m build --sdist
    - name: Test package for corruption
      run: gzip -t dist/*
    - name: Install rsatoolbox (Linux, Mac)
      run: pip install dist/*
      if: matrix.os != 'windows-latest'
    - name: Install rsatoolbox (Windows)
      run: |
        $sdistfname = Get-ChildItem dist -Name
        pip install dist/$sdistfname
      if: matrix.os == 'windows-latest'
    - name: Install test dependencies
      run: pip install -r tests/requirements.txt
    - name: Skeleton tests
      run: python -m unittest -v rsatoolbox.test
    - name: Unit tests
      run: pytest
    - name: Check package compliance
      run: |
        pip install -q twine
        twine check dist/*
    - name: Store artifact
      uses: actions/upload-artifact@v6
      with:
        name: source-${{ matrix.os }}-${{ matrix.python-version }}
        path: dist/*
        if-no-files-found: error
        retention-days: 1
 
  binaries:
    timeout-minutes: 30
    needs: tests
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-python@v5
      with:
        cache: 'pip'
        python-version: '3.12'
    - name: Python Version
      run: python --version
    - name: Update Pip
      run: python -m pip install --upgrade pip
    - name: Install cibuildwheel
      run: python -m pip install cibuildwheel~=3.3.1
    - name: Build wheels
      run: python -m cibuildwheel --output-dir dist
    - name: Check package compliance
      run: |
        pip install -q twine
        twine check dist/*
    - name: Store artifact
      uses: actions/upload-artifact@v6
      with:
        name: wheels-${{ matrix.os }}
        path: dist/*.whl
        if-no-files-found: error
        retention-days: 1
 

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 3 jobs (19 with the matrix expanded) per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow