Skip to content
Latchkey

Test workflow (simonw/shot-scraper)

The Test workflow from simonw/shot-scraper, 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: simonw/shot-scraper.github/workflows/test.ymlLicense Apache-2.0View source

What it does

This is the Test workflow from the simonw/shot-scraper 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)
name: Test

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
    steps:
    - uses: actions/checkout@v6
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'
        cache-dependency-path: pyproject.toml
    - name: Cache Playwright browsers
      uses: actions/cache@v5
      with:
        path: ~/.cache/ms-playwright/
        key: ${{ runner.os }}-browsers
    - name: Install dependencies
      run: |
        pip install -e . --group dev
    - name: Install Playwright dependencies
      run: |
        python -m playwright install-deps
        shot-scraper install
        shot-scraper install -b firefox
        shot-scraper install -b webkit
    - name: Test Playwright startup time
      run: |
        time python -c "from playwright.sync_api import sync_playwright; p = sync_playwright().start(); b = p.chromium.launch(); b.close(); p.stop(); print('OK')"
    - name: Run tests
      run: |
        pytest -vv
    - name: Check if cog needs to be run
      run: |
        cog --check docs/*.md
    - name: Run test examples
      run: |
        tests/run_examples.sh
    - name: Archive examples
      uses: actions/upload-artifact@v6
      with:
        name: examples-${{ matrix.python-version }}
        path: examples/*

The same workflow, on Latchkey

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

name: Test
 
on: [push, pull_request]
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  test:
    timeout-minutes: 30
    runs-on: latchkey-small
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
    steps:
    - uses: actions/checkout@v6
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'
        cache-dependency-path: pyproject.toml
    - name: Cache Playwright browsers
      uses: actions/cache@v5
      with:
        path: ~/.cache/ms-playwright/
        key: ${{ runner.os }}-browsers
    - name: Install dependencies
      run: |
        pip install -e . --group dev
    - name: Install Playwright dependencies
      run: |
        python -m playwright install-deps
        shot-scraper install
        shot-scraper install -b firefox
        shot-scraper install -b webkit
    - name: Test Playwright startup time
      run: |
        time python -c "from playwright.sync_api import sync_playwright; p = sync_playwright().start(); b = p.chromium.launch(); b.close(); p.stop(); print('OK')"
    - name: Run tests
      run: |
        pytest -vv
    - name: Check if cog needs to be run
      run: |
        cog --check docs/*.md
    - name: Run test examples
      run: |
        tests/run_examples.sh
    - name: Archive examples
      uses: actions/upload-artifact@v6
      with:
        name: examples-${{ matrix.python-version }}
        path: examples/*
 

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 (5 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