Tests workflow (datachain-ai/datachain)
The Tests workflow from datachain-ai/datachain, explained and optimized by Latchkey.
CI health: C - fair
Point runs-on at Latchkey and get caching, job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Tests workflow from the datachain-ai/datachain 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
name: Tests
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
env:
FORCE_COLOR: "1"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v7
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.ref }}
- name: Set up Python 3.10
uses: actions/setup-python@v6
with:
python-version: '3.10'
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-suffix: lint
cache-dependency-glob: pyproject.toml
- name: Use CPU-only PyTorch on Linux
run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV"
- name: Install nox
run: uv pip install nox --system
- name: Cache mypy
uses: actions/cache@v6
with:
path: .mypy_cache
key: mypy-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}
- name: Cache pre-commit hooks
uses: actions/cache@v6
with:
path: ~/.cache/pre-commit
key: pre-commit-3|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Lint code
run: nox -s lint
datachain:
timeout-minutes: 40
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest-8-cores]
pyv: ['3.10', '3.11', '3.12', '3.13', '3.14']
include:
- os: macos-latest
pyv: '3.10'
- os: macos-latest
pyv: '3.14'
- os: windows-latest
pyv: '3.10'
- os: windows-latest
pyv: '3.14'
steps:
- name: Check out the repository
uses: actions/checkout@v7
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.ref }}
- name: Setup PostgreSQL
if: runner.os != 'Windows'
uses: ikalnytskyi/action-setup-postgres@c4dda34aae1c821e3a771b68b73b13af3198a7ee # v8
with:
username: test
password: test
database: test_datachain
port: 5432
postgres-version: "17"
id: postgres
- name: Set PostgreSQL URI
if: runner.os != 'Windows'
run: |
FULL_URI="${{ steps.postgres.outputs.connection-uri }}"
echo "TEST_POSTGRES_URI=${FULL_URI%/*}" >> "$GITHUB_ENV"
shell: bash
- name: Set up Python ${{ matrix.pyv }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.pyv }}
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-suffix: tests-${{ matrix.pyv }}
cache-dependency-glob: pyproject.toml
- name: Use CPU-only PyTorch on Linux
if: runner.os == 'Linux'
# torch 2.11+ on PyPI pulls CUDA deps that aren't fully available on
# CPU-only runners (missing libnppicc from nvidia-npp).
run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV"
- name: Install FFmpeg on Windows
if: runner.os == 'Windows'
run: choco install ffmpeg --version 7.0.2
- name: Install FFmpeg on macOS
if: runner.os == 'macOS'
# Using ffmpeg@7 since torchcodec does not support ffmpeg 8 yet
# See: https://github.com/pytorch/torchcodec/issues/839
# On Windows and Linux ffmpeg < 8 is installed by default
run: |
brew install ffmpeg@7
echo 'DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/opt/ffmpeg@7/lib' >> "$GITHUB_ENV"
- name: Install FFmpeg on Ubuntu
if: runner.os == 'Linux'
run: |
sudo apt update
sudo apt install -y ffmpeg
- name: Install nox
run: uv pip install nox --system
- name: Skip flaky azure, gs remotes on macOS
if: runner.os == 'macOS'
run: echo 'DISABLE_REMOTES_ARG=--disable-remotes=azure,gs' >> "$GITHUB_ENV"
- name: Skip all remotes on Windows
if: runner.os == 'Windows'
run: echo 'DISABLE_REMOTES_ARG=--disable-remotes=azure,gs' >> $env:GITHUB_ENV
- name: Run tests
run: nox -s tests-${{ matrix.pyv }} -- -m "not e2e and not examples" $DISABLE_REMOTES_ARG
shell: bash
- name: Run E2E tests
run: nox -s e2e-${{ matrix.pyv }}
shell: bash
- name: Upload coverage report
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage.xml
flags: datachain
- name: Build package
run: nox -s build
- name: Build docs
run: nox -s docs
examples:
runs-on: ${{ matrix.os }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
pyv: ['3.11', '3.14']
group: ['get_started', 'computer_vision', 'multimodal']
exclude:
- {os: ubuntu-latest, pyv: '3.11', group: 'multimodal'}
- {os: ubuntu-latest, pyv: '3.14', group: 'multimodal'}
include:
# HF runs against actual API - thus run it only once
- {os: ubuntu-latest, pyv: "3.14", group: llm_and_nlp}
- {os: ubuntu-latest-4-cores, pyv: "3.11", group: multimodal}
- {os: ubuntu-latest-4-cores, pyv: "3.14", group: multimodal}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.event.pull_request.head.sha || github.ref }}
- name: Set up Python ${{ matrix.pyv }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.pyv }}
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-suffix: examples-${{ matrix.pyv }}
cache-dependency-glob: pyproject.toml
- name: Use CPU-only PyTorch on Linux
if: runner.os == 'Linux'
run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV"
- name: Install nox
run: uv pip install nox --system
- name: Install FFmpeg on Windows
if: runner.os == 'Windows'
run: choco install ffmpeg
- name: Install FFmpeg on macOS
if: runner.os == 'macOS'
run: |
brew install ffmpeg
echo 'DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib' >> "$GITHUB_ENV"
- name: Install FFmpeg on Ubuntu
if: runner.os == 'Linux'
run: |
sudo apt update
sudo apt install -y ffmpeg
- name: Run examples
env:
# Pass HF_TOKEN to all example groups: several groups download public
# models/datasets from the HF Hub anonymously (transformers, open_clip),
# which now hits HTTP 429 rate limits. Authenticating raises the limit.
HF_TOKEN: ${{ secrets.HF_TOKEN }}
ANTHROPIC_API_KEY: ${{ matrix.group == 'llm_and_nlp' && secrets.ANTHROPIC_API_KEY || '' }}
OPENAI_API_KEY: ${{ matrix.group == 'multimodal' && secrets.OPENAI_API_KEY || '' }}
run: nox -s examples -p ${{ matrix.pyv }} -- -m "${{ matrix.group }}"
check:
if: always()
needs: [lint, datachain, examples]
runs-on: ubuntu-latest
steps:
- uses: re-actors/alls-green@release/v1
with:
allowed-failures: examples
jobs: ${{ toJSON(needs) }}
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: branches: [main] pull_request: workflow_dispatch: env: FORCE_COLOR: "1" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: lint: timeout-minutes: 30 runs-on: latchkey-small steps: - name: Check out the repository uses: actions/checkout@v7 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.ref }} - name: Set up Python 3.10 uses: actions/setup-python@v6 with: cache: 'pip' python-version: '3.10' - name: Setup uv uses: astral-sh/setup-uv@v7 with: enable-cache: true cache-suffix: lint cache-dependency-glob: pyproject.toml - name: Use CPU-only PyTorch on Linux run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV" - name: Install nox run: uv pip install nox --system - name: Cache mypy uses: actions/cache@v6 with: path: .mypy_cache key: mypy-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }} - name: Cache pre-commit hooks uses: actions/cache@v6 with: path: ~/.cache/pre-commit key: pre-commit-3|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }} - name: Lint code run: nox -s lint datachain: timeout-minutes: 40 runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest-8-cores] pyv: ['3.10', '3.11', '3.12', '3.13', '3.14'] include: - os: macos-latest pyv: '3.10' - os: macos-latest pyv: '3.14' - os: windows-latest pyv: '3.10' - os: windows-latest pyv: '3.14' steps: - name: Check out the repository uses: actions/checkout@v7 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.ref }} - name: Setup PostgreSQL if: runner.os != 'Windows' uses: ikalnytskyi/action-setup-postgres@c4dda34aae1c821e3a771b68b73b13af3198a7ee # v8 with: username: test password: test database: test_datachain port: 5432 postgres-version: "17" id: postgres - name: Set PostgreSQL URI if: runner.os != 'Windows' run: | FULL_URI="${{ steps.postgres.outputs.connection-uri }}" echo "TEST_POSTGRES_URI=${FULL_URI%/*}" >> "$GITHUB_ENV" shell: bash - name: Set up Python ${{ matrix.pyv }} uses: actions/setup-python@v6 with: cache: 'pip' python-version: ${{ matrix.pyv }} - name: Setup uv uses: astral-sh/setup-uv@v7 with: enable-cache: true cache-suffix: tests-${{ matrix.pyv }} cache-dependency-glob: pyproject.toml - name: Use CPU-only PyTorch on Linux if: runner.os == 'Linux' # torch 2.11+ on PyPI pulls CUDA deps that aren't fully available on # CPU-only runners (missing libnppicc from nvidia-npp). run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV" - name: Install FFmpeg on Windows if: runner.os == 'Windows' run: choco install ffmpeg --version 7.0.2 - name: Install FFmpeg on macOS if: runner.os == 'macOS' # Using ffmpeg@7 since torchcodec does not support ffmpeg 8 yet # See: https://github.com/pytorch/torchcodec/issues/839 # On Windows and Linux ffmpeg < 8 is installed by default run: | brew install ffmpeg@7 echo 'DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/opt/ffmpeg@7/lib' >> "$GITHUB_ENV" - name: Install FFmpeg on Ubuntu if: runner.os == 'Linux' run: | sudo apt update sudo apt install -y ffmpeg - name: Install nox run: uv pip install nox --system - name: Skip flaky azure, gs remotes on macOS if: runner.os == 'macOS' run: echo 'DISABLE_REMOTES_ARG=--disable-remotes=azure,gs' >> "$GITHUB_ENV" - name: Skip all remotes on Windows if: runner.os == 'Windows' run: echo 'DISABLE_REMOTES_ARG=--disable-remotes=azure,gs' >> $env:GITHUB_ENV - name: Run tests run: nox -s tests-${{ matrix.pyv }} -- -m "not e2e and not examples" $DISABLE_REMOTES_ARG shell: bash - name: Run E2E tests run: nox -s e2e-${{ matrix.pyv }} shell: bash - name: Upload coverage report uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} files: coverage.xml flags: datachain - name: Build package run: nox -s build - name: Build docs run: nox -s docs examples: runs-on: ${{ matrix.os }} timeout-minutes: 60 strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] pyv: ['3.11', '3.14'] group: ['get_started', 'computer_vision', 'multimodal'] exclude: - {os: ubuntu-latest, pyv: '3.11', group: 'multimodal'} - {os: ubuntu-latest, pyv: '3.14', group: 'multimodal'} include: # HF runs against actual API - thus run it only once - {os: ubuntu-latest, pyv: "3.14", group: llm_and_nlp} - {os: ubuntu-latest-4-cores, pyv: "3.11", group: multimodal} - {os: ubuntu-latest-4-cores, pyv: "3.14", group: multimodal} steps: - uses: actions/checkout@v7 with: ref: ${{ github.event.pull_request.head.sha || github.ref }} - name: Set up Python ${{ matrix.pyv }} uses: actions/setup-python@v6 with: cache: 'pip' python-version: ${{ matrix.pyv }} - name: Setup uv uses: astral-sh/setup-uv@v7 with: enable-cache: true cache-suffix: examples-${{ matrix.pyv }} cache-dependency-glob: pyproject.toml - name: Use CPU-only PyTorch on Linux if: runner.os == 'Linux' run: echo "UV_TORCH_BACKEND=cpu" >> "$GITHUB_ENV" - name: Install nox run: uv pip install nox --system - name: Install FFmpeg on Windows if: runner.os == 'Windows' run: choco install ffmpeg - name: Install FFmpeg on macOS if: runner.os == 'macOS' run: | brew install ffmpeg echo 'DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib' >> "$GITHUB_ENV" - name: Install FFmpeg on Ubuntu if: runner.os == 'Linux' run: | sudo apt update sudo apt install -y ffmpeg - name: Run examples env: # Pass HF_TOKEN to all example groups: several groups download public # models/datasets from the HF Hub anonymously (transformers, open_clip), # which now hits HTTP 429 rate limits. Authenticating raises the limit. HF_TOKEN: ${{ secrets.HF_TOKEN }} ANTHROPIC_API_KEY: ${{ matrix.group == 'llm_and_nlp' && secrets.ANTHROPIC_API_KEY || '' }} OPENAI_API_KEY: ${{ matrix.group == 'multimodal' && secrets.OPENAI_API_KEY || '' }} run: nox -s examples -p ${{ matrix.pyv }} -- -m "${{ matrix.group }}" check: timeout-minutes: 30 if: always() needs: [lint, datachain, examples] runs-on: latchkey-small steps: - uses: re-actors/alls-green@release/v1 with: allowed-failures: examples jobs: ${{ toJSON(needs) }}
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. - 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.
3 third-party actions are referenced by a movable tag. Pin them to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.
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 4 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.