Tests workflow (otto-torino/django-baton)
The Tests workflow from otto-torino/django-baton, explained and optimized by Latchkey.
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.
What it does
This is the Tests workflow from the otto-torino/django-baton 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
name: Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Each Python version resolves the newest compatible Django, so this
# also spans Django 5.x (3.10/3.11) and 6.x (3.12) for free.
python-version: ['3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v5
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .
pip install Django
pip install -r testapp/test-requirements.txt
# Fast feedback across Python/Django versions. The heavier Playwright e2e
# suite runs in the separate `e2e` job below.
- name: Run tests (non-e2e)
working-directory: testapp/app
run: python manage.py test app.tests.test_config app.tests.test_views app.tests.test_urls
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .
pip install Django
pip install -r testapp/test-requirements.txt -r testapp/requirements-e2e.txt
- name: Install Playwright browser
run: python -m playwright install --with-deps chromium
- name: Run e2e tests (Playwright)
working-directory: testapp/app
run: >-
python manage.py test
app.tests.test_e2e_login
app.tests.test_e2e_index
app.tests.test_e2e_index_mobile
app.tests.test_e2e_theme
app.tests.test_e2e_menu
app.tests.test_e2e_menu_mobile
app.tests.test_e2e_tabs
app.tests.test_e2e_input_filter
app.tests.test_e2e_cl_includes
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: Tests on: push: pull_request: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: test: timeout-minutes: 30 runs-on: latchkey-small strategy: fail-fast: false matrix: # Each Python version resolves the newest compatible Django, so this # also spans Django 5.x (3.10/3.11) and 6.x (3.12) for free. python-version: ['3.10', '3.11', '3.12'] steps: - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6 with: cache: 'pip' python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e . pip install Django pip install -r testapp/test-requirements.txt # Fast feedback across Python/Django versions. The heavier Playwright e2e # suite runs in the separate `e2e` job below. - name: Run tests (non-e2e) working-directory: testapp/app run: python manage.py test app.tests.test_config app.tests.test_views app.tests.test_urls e2e: timeout-minutes: 30 runs-on: latchkey-small steps: - uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v6 with: cache: 'pip' python-version: '3.12' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e . pip install Django pip install -r testapp/test-requirements.txt -r testapp/requirements-e2e.txt - name: Install Playwright browser run: python -m playwright install --with-deps chromium - name: Run e2e tests (Playwright) working-directory: testapp/app run: >- python manage.py test app.tests.test_e2e_login app.tests.test_e2e_index app.tests.test_e2e_index_mobile app.tests.test_e2e_theme app.tests.test_e2e_menu app.tests.test_e2e_menu_mobile app.tests.test_e2e_tabs app.tests.test_e2e_input_filter app.tests.test_e2e_cl_includes
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
- Cache dependency installs on the setup step so they are served from cache.
- Add a job timeout so a hung step cannot burn hours of runner time.
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:
- Dependency installs
- End-to-end and browser tests
This workflow runs 2 jobs (4 with the matrix expanded) per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.