Skip to content
Latchkey

Tests workflow (datachain-ai/datachain)

The Tests workflow from datachain-ai/datachain, explained and optimized by Latchkey.

C

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.

Grade your own workflow free or run it on Latchkey →
Source: datachain-ai/datachain.github/workflows/tests.ymlLicense Apache-2.0View source

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

workflow (.yml)
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

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:

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.

Actions used in this workflow