From 0e9f41a4c32002237d95de9d00ad0810bb2ed023 Mon Sep 17 00:00:00 2001 From: PasteurBot Date: Thu, 5 Jun 2025 05:34:28 +0000 Subject: [PATCH 01/11] chore: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fb291a8..6c87e607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. -## [0.9.1] - 2025-06-04 +## [0.9.1] - 2025-06-05 ### Features From d5f275fa133bc714b22c622300abb7a0e9520136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:05:58 +0200 Subject: [PATCH 02/11] wip --- .github/workflows/release.yml | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5689fb1b..15cacafe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,8 +18,8 @@ on: # Case 3: release PR is merged -> create a new release pull_request: - types: - - closed + # types: + # - closed branches: - main @@ -126,7 +126,7 @@ jobs: release: runs-on: ubuntu-latest - if: github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'bot/release/') + # if: github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'bot/release/') steps: - name: Checkout code @@ -146,23 +146,23 @@ jobs: run: | pip install git-cliff - - name: Get new version + - name: Get version numbers id: get_version run: | + current_version=$(gh release view --json tagName --jq '.tagName' || echo "v0.0.0") + echo "current_version=$current_version" >> $GITHUB_OUTPUT new_version=$(git-cliff --bumped-version) echo "new_version=$new_version" >> $GITHUB_OUTPUT - name: Assemble release notes id: release_notes - env: - PR_BODY: ${{ github.event.pull_request.body }} run: | changelog=$(git cliff --unreleased --bump --latest --strip all) # strip off first line (which is the version number) changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body - custom_notes="$PR_BODY" + custom_notes="${{ github.event.pull_request.body }}" # Fix line endings custom_notes=$(printf "%s" "$custom_notes" | tr -d '\r') # Keep only the part after the first '---' line @@ -176,14 +176,18 @@ jobs: if [[ -n "$custom_notes" ]]; then printf "%s\n\n" "$custom_notes" >> /tmp/notes.md fi - printf "## Changes\n%s\n" "$changelog" >> /tmp/notes.md + printf "## What's Changed\n%s\n" "$changelog" >> /tmp/notes.md + # Append link to full diff + echo "**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md + + cat /tmp/notes.md echo "release_note_file=/tmp/notes.md" >> $GITHUB_OUTPUT - - name: Create new release - run: | - gh release create "${{ steps.get_version.outputs.new_version }}" \ - --title "${{ steps.get_version.outputs.new_version }}" \ - --notes-file "${{ steps.release_notes.outputs.release_note_file }}" \ - --target ${{ github.event.pull_request.merge_commit_sha }} \ - --latest + # - name: Create new release + # run: | + # gh release create "${{ steps.get_version.outputs.new_version }}" \ + # --title "${{ steps.get_version.outputs.new_version }}" \ + # --notes-file "${{ steps.release_notes.outputs.release_note_file }}" \ + # --target ${{ github.event.pull_request.merge_commit_sha }} \ + # --latest From 37f99adc748486a61d95dfa60e5795d85783b878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:41:43 +0200 Subject: [PATCH 03/11] empty commit to trigger ci From 9a399be1b4d112651c66b27c56560fb01f72cd2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:41:53 +0200 Subject: [PATCH 04/11] formatting --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 15cacafe..0141c5e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -179,7 +179,7 @@ jobs: printf "## What's Changed\n%s\n" "$changelog" >> /tmp/notes.md # Append link to full diff - echo "**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md + echo "\n**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md cat /tmp/notes.md echo "release_note_file=/tmp/notes.md" >> $GITHUB_OUTPUT From feaf8d78da990f733d8d119eb1fb732cb8c0c972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:45:06 +0200 Subject: [PATCH 05/11] try with envvar --- .github/workflows/release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0141c5e2..703596fa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -156,13 +156,15 @@ jobs: - name: Assemble release notes id: release_notes + env: + PR_BODY: ${{ github.event.pull_request.body }} run: | changelog=$(git cliff --unreleased --bump --latest --strip all) # strip off first line (which is the version number) changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body - custom_notes="${{ github.event.pull_request.body }}" + custom_notes="${{ env.PR_BODY }}" # Fix line endings custom_notes=$(printf "%s" "$custom_notes" | tr -d '\r') # Keep only the part after the first '---' line From a10f559738d1f952cc1d12e86e98c2da2afb21c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:47:44 +0200 Subject: [PATCH 06/11] wip --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 703596fa..21b5fccf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -164,9 +164,10 @@ jobs: changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body - custom_notes="${{ env.PR_BODY }}" + # custom_notes="${{ env.PR_BODY }}" # Fix line endings - custom_notes=$(printf "%s" "$custom_notes" | tr -d '\r') + custom_notes=$(printf "%s" "$PR_BODY" | tr -d '\r') + printf "%s" "$custom_notes" # Keep only the part after the first '---' line custom_notes=$(echo "$custom_notes" | sed -n '/^---$/,$p' | sed '1d') # Strip leading / trailing whitespace From f34ddfab13ab9430eecf4caa5cf00c0dbeaeeb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:48:45 +0200 Subject: [PATCH 07/11] wip --- .github/workflows/release.yml | 1 - .github/workflows/run_tests.yml | 584 ++++++++++++++++---------------- 2 files changed, 292 insertions(+), 293 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21b5fccf..d2c05aa6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -164,7 +164,6 @@ jobs: changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body - # custom_notes="${{ env.PR_BODY }}" # Fix line endings custom_notes=$(printf "%s" "$PR_BODY" | tr -d '\r') printf "%s" "$custom_notes" diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 3e3a7419..fd3f32de 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -1,292 +1,292 @@ -name: Run test suite - -on: - pull_request: - - push: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - tests-base: - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - - # test with oldest and latest supported Python versions - # NOTE: If bumping the minimum Python version here, also do it in - # ruff.toml, setup.py and other CI files as well. - python-version: ["3.10", "3.12"] - runtime-deps: ["latest"] - - include: - - os: ubuntu-latest - python-version: "3.12" - runtime-deps: "oldest" - - fail-fast: false - - runs-on: ${{ matrix.os }} - - steps: - - name: Set up Git repository - uses: actions/checkout@v4 - - - name: Set up WSL (Windows) - uses: Vampire/setup-wsl@v5 - if: runner.os == 'Windows' - with: - distribution: Ubuntu-24.04 - - - name: Set up Python - if: runner.os != 'Windows' - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Python (Windows) - if: runner.os == 'Windows' - shell: wsl-bash {0} - run: | - python_version=${{ matrix.python-version }} - if [ $python_version == "3.12" ]; then - # Python 3.12 is the default `python3` in Ubuntu 24.04 - python_version="3" - fi - - export DEBIAN_FRONTEND=noninteractive - sudo apt-get update - sudo apt-get install -y software-properties-common gnupg2 - sudo add-apt-repository ppa:deadsnakes/ppa - sudo apt-get install -y python3-pip python${python_version} python${python_version}-venv - - python${python_version} -m venv ~/venv - - export PATH="$HOME/venv/bin:$PATH" - python -m pip install --upgrade pip - - - name: Set up uv - uses: astral-sh/setup-uv@v6 - with: - enable-cache: true - - - name: Restore UV environment - run: cp production.uv.lock uv.lock - - - name: Install package - if: runner.os != 'Windows' - run: | - uv sync --extra dev --frozen - - if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then - # replace >= with == in pyproject.toml to install oldest runtime deps - sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml - # roll back changes to requires-python - sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml - uv pip install .[runtime] - fi - - - name: Install package (Windows) - if: runner.os == 'Windows' - shell: wsl-bash {0} - run: | - export PATH="$HOME/venv/bin:$PATH" - - pip install uv - uv sync --extra dev --frozen - - if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then - # replace >= with == in pyproject.toml to install oldest runtime deps - sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml - # roll back changes to requires-python - sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml - uv pip install .[runtime] - fi - - - name: Run test suite - if: runner.os != 'Windows' - run: | - uv run --no-sync pytest \ - --skip-endtoend \ - --cov-report=term-missing:skip-covered \ - --cov-report=xml:coverage.xml \ - --cov=tesseract_core - - - name: Run test suite (Windows) - if: runner.os == 'Windows' - shell: wsl-bash {0} - run: | - export PATH="$HOME/venv/bin:$PATH" - uv run --no-sync pytest \ - --skip-endtoend \ - --cov-report=term-missing:skip-covered \ - --cov-report=xml:coverage.xml \ - --cov=tesseract_core - - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5.4.3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: pasteurlabs/tesseract-core - files: coverage*.xml - fail_ci_if_error: true - - get-e2e-matrix: - runs-on: ubuntu-latest - - outputs: - matrix: ${{ steps.get-matrix.outputs.matrix }} - - steps: - - name: Set up Git repository - uses: actions/checkout@v4 - - - name: Get available unit Tesseracts - id: get-matrix - env: - E2E_TEST_DIR: examples - run: | - # get JSON array of directories in E2E_TEST_DIR - subjobs=$( - find "${{ env.E2E_TEST_DIR }}" -type d -maxdepth 1 -mindepth 1 -exec basename {} \; \ - | jq -R -s -c 'split("\n")[:-1]' - ) - # add "base" to subjobs - subjobs=$(echo "$subjobs" | jq -c -r '. + ["base"]') - printf 'matrix=%s' "$subjobs" >> $GITHUB_OUTPUT - - tests-e2e: - needs: get-e2e-matrix - - strategy: - matrix: - os: [ubuntu-24.04] - python-version: ["3.12"] - - arch: ["x64"] - docker-engine: ["docker"] - - unit-tesseract: ${{ fromJson(needs.get-e2e-matrix.outputs.matrix) }} - - exclude: - - arch: x64 - unit-tesseract: "pyvista-arm64" - - include: - # Test on arm to ensure compatibility with Apple M1 chips - # (OSX runners don't have access to Docker so we use Linux ARM runners instead) - - os: "ubuntu-24.04" - python-version: "3.12" - arch: "arm" - docker-engine: "docker" - unit-tesseract: "base" - # Run tests using Podman - - os: "ubuntu-24.04" - python-version: "3.12" - arch: "x64" - docker-engine: "podman" - unit-tesseract: "base" - - os: "ubuntu-24.04" - python-version: "3.12" - arch: "arm" - docker-engine: "docker" - unit-tesseract: "pyvista-arm64" - - fail-fast: false - - runs-on: ${{ matrix.arch == 'x64' && matrix.os == 'ubuntu-24.04' && 'ubuntu-24.04' || matrix.arch == 'arm' && matrix.os == 'ubuntu-24.04' && 'linux-arm64-ubuntu2404'}} - - env: - TESSERACT_DOCKER_BUILD_ARGS: "--cache-from type=gha --cache-to type=gha,mode=max" - - defaults: - run: - shell: bash -el {0} - - steps: - - name: Set up Git repository - uses: actions/checkout@v4 - - # Use Conda to install Python (setup-python action doesn't support ARM) - - uses: conda-incubator/setup-miniconda@v3 - with: - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - - name: Set up uv - uses: astral-sh/setup-uv@v6 - with: - enable-cache: true - - - name: Restore UV environment - run: cp production.uv.lock uv.lock - - - name: Install package - run: | - uv sync --extra dev --frozen - - - name: Set up Podman - if: matrix.docker-engine == 'podman' - run: | - systemctl start --user podman.socket - systemctl status --user podman.socket - - podman --version - - export DOCKER_HOST=unix:///run/user/1001/podman/podman.sock - echo "DOCKER_HOST=${DOCKER_HOST}" >> $GITHUB_ENV - echo "TESSERACT_DOCKER_EXECUTABLE=podman" >> $GITHUB_ENV - # Podman doesn't support --cache-from - echo "TESSERACT_DOCKER_BUILD_ARGS=" >> $GITHUB_ENV - - - name: Run test suite - run: | - if [ "${{ matrix.unit-tesseract }}" == "base" ]; then - uv run --no-sync pytest \ - --always-run-endtoend \ - --cov-report=term-missing:skip-covered \ - --cov-report=xml:coverage.xml \ - --cov=tesseract_core \ - tests/endtoend_tests \ - -k "not test_examples" - else - uv run --no-sync pytest \ - --always-run-endtoend \ - --cov-report=term-missing:skip-covered \ - --cov-report=xml:coverage.xml \ - --cov=tesseract_core \ - tests/endtoend_tests/test_examples.py \ - -k "[${{ matrix.unit-tesseract }}]" - fi - - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5.4.3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: pasteurlabs/tesseract-core - files: coverage*.xml - fail_ci_if_error: true - - all-ok: - needs: [tests-base, tests-e2e] - - runs-on: ubuntu-latest - - steps: - - name: Check for errors - run: | - if [ "${{ needs.tests-base.result }}" != "success" ]; then - echo "Base tests failed" - exit 1 - fi - - if [ "${{ needs.tests-e2e.result }}" != "success" ]; then - echo "E2E tests failed" - exit 1 - fi - - echo "All tests passed!" +# name: Run test suite + +# on: +# pull_request: + +# push: +# branches: +# - main + +# concurrency: +# group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} +# cancel-in-progress: true + +# jobs: +# tests-base: +# strategy: +# matrix: +# os: [ubuntu-latest, windows-latest, macos-latest] + +# # test with oldest and latest supported Python versions +# # NOTE: If bumping the minimum Python version here, also do it in +# # ruff.toml, setup.py and other CI files as well. +# python-version: ["3.10", "3.12"] +# runtime-deps: ["latest"] + +# include: +# - os: ubuntu-latest +# python-version: "3.12" +# runtime-deps: "oldest" + +# fail-fast: false + +# runs-on: ${{ matrix.os }} + +# steps: +# - name: Set up Git repository +# uses: actions/checkout@v4 + +# - name: Set up WSL (Windows) +# uses: Vampire/setup-wsl@v5 +# if: runner.os == 'Windows' +# with: +# distribution: Ubuntu-24.04 + +# - name: Set up Python +# if: runner.os != 'Windows' +# uses: actions/setup-python@v5 +# with: +# python-version: ${{ matrix.python-version }} + +# - name: Set up Python (Windows) +# if: runner.os == 'Windows' +# shell: wsl-bash {0} +# run: | +# python_version=${{ matrix.python-version }} +# if [ $python_version == "3.12" ]; then +# # Python 3.12 is the default `python3` in Ubuntu 24.04 +# python_version="3" +# fi + +# export DEBIAN_FRONTEND=noninteractive +# sudo apt-get update +# sudo apt-get install -y software-properties-common gnupg2 +# sudo add-apt-repository ppa:deadsnakes/ppa +# sudo apt-get install -y python3-pip python${python_version} python${python_version}-venv + +# python${python_version} -m venv ~/venv + +# export PATH="$HOME/venv/bin:$PATH" +# python -m pip install --upgrade pip + +# - name: Set up uv +# uses: astral-sh/setup-uv@v6 +# with: +# enable-cache: true + +# - name: Restore UV environment +# run: cp production.uv.lock uv.lock + +# - name: Install package +# if: runner.os != 'Windows' +# run: | +# uv sync --extra dev --frozen + +# if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then +# # replace >= with == in pyproject.toml to install oldest runtime deps +# sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml +# # roll back changes to requires-python +# sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml +# uv pip install .[runtime] +# fi + +# - name: Install package (Windows) +# if: runner.os == 'Windows' +# shell: wsl-bash {0} +# run: | +# export PATH="$HOME/venv/bin:$PATH" + +# pip install uv +# uv sync --extra dev --frozen + +# if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then +# # replace >= with == in pyproject.toml to install oldest runtime deps +# sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml +# # roll back changes to requires-python +# sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml +# uv pip install .[runtime] +# fi + +# - name: Run test suite +# if: runner.os != 'Windows' +# run: | +# uv run --no-sync pytest \ +# --skip-endtoend \ +# --cov-report=term-missing:skip-covered \ +# --cov-report=xml:coverage.xml \ +# --cov=tesseract_core + +# - name: Run test suite (Windows) +# if: runner.os == 'Windows' +# shell: wsl-bash {0} +# run: | +# export PATH="$HOME/venv/bin:$PATH" +# uv run --no-sync pytest \ +# --skip-endtoend \ +# --cov-report=term-missing:skip-covered \ +# --cov-report=xml:coverage.xml \ +# --cov=tesseract_core + +# - name: Upload coverage reports to Codecov +# uses: codecov/codecov-action@v5.4.3 +# with: +# token: ${{ secrets.CODECOV_TOKEN }} +# slug: pasteurlabs/tesseract-core +# files: coverage*.xml +# fail_ci_if_error: true + +# get-e2e-matrix: +# runs-on: ubuntu-latest + +# outputs: +# matrix: ${{ steps.get-matrix.outputs.matrix }} + +# steps: +# - name: Set up Git repository +# uses: actions/checkout@v4 + +# - name: Get available unit Tesseracts +# id: get-matrix +# env: +# E2E_TEST_DIR: examples +# run: | +# # get JSON array of directories in E2E_TEST_DIR +# subjobs=$( +# find "${{ env.E2E_TEST_DIR }}" -type d -maxdepth 1 -mindepth 1 -exec basename {} \; \ +# | jq -R -s -c 'split("\n")[:-1]' +# ) +# # add "base" to subjobs +# subjobs=$(echo "$subjobs" | jq -c -r '. + ["base"]') +# printf 'matrix=%s' "$subjobs" >> $GITHUB_OUTPUT + +# tests-e2e: +# needs: get-e2e-matrix + +# strategy: +# matrix: +# os: [ubuntu-24.04] +# python-version: ["3.12"] + +# arch: ["x64"] +# docker-engine: ["docker"] + +# unit-tesseract: ${{ fromJson(needs.get-e2e-matrix.outputs.matrix) }} + +# exclude: +# - arch: x64 +# unit-tesseract: "pyvista-arm64" + +# include: +# # Test on arm to ensure compatibility with Apple M1 chips +# # (OSX runners don't have access to Docker so we use Linux ARM runners instead) +# - os: "ubuntu-24.04" +# python-version: "3.12" +# arch: "arm" +# docker-engine: "docker" +# unit-tesseract: "base" +# # Run tests using Podman +# - os: "ubuntu-24.04" +# python-version: "3.12" +# arch: "x64" +# docker-engine: "podman" +# unit-tesseract: "base" +# - os: "ubuntu-24.04" +# python-version: "3.12" +# arch: "arm" +# docker-engine: "docker" +# unit-tesseract: "pyvista-arm64" + +# fail-fast: false + +# runs-on: ${{ matrix.arch == 'x64' && matrix.os == 'ubuntu-24.04' && 'ubuntu-24.04' || matrix.arch == 'arm' && matrix.os == 'ubuntu-24.04' && 'linux-arm64-ubuntu2404'}} + +# env: +# TESSERACT_DOCKER_BUILD_ARGS: "--cache-from type=gha --cache-to type=gha,mode=max" + +# defaults: +# run: +# shell: bash -el {0} + +# steps: +# - name: Set up Git repository +# uses: actions/checkout@v4 + +# # Use Conda to install Python (setup-python action doesn't support ARM) +# - uses: conda-incubator/setup-miniconda@v3 +# with: +# auto-update-conda: true +# python-version: ${{ matrix.python-version }} + +# - name: Set up uv +# uses: astral-sh/setup-uv@v6 +# with: +# enable-cache: true + +# - name: Restore UV environment +# run: cp production.uv.lock uv.lock + +# - name: Install package +# run: | +# uv sync --extra dev --frozen + +# - name: Set up Podman +# if: matrix.docker-engine == 'podman' +# run: | +# systemctl start --user podman.socket +# systemctl status --user podman.socket + +# podman --version + +# export DOCKER_HOST=unix:///run/user/1001/podman/podman.sock +# echo "DOCKER_HOST=${DOCKER_HOST}" >> $GITHUB_ENV +# echo "TESSERACT_DOCKER_EXECUTABLE=podman" >> $GITHUB_ENV +# # Podman doesn't support --cache-from +# echo "TESSERACT_DOCKER_BUILD_ARGS=" >> $GITHUB_ENV + +# - name: Run test suite +# run: | +# if [ "${{ matrix.unit-tesseract }}" == "base" ]; then +# uv run --no-sync pytest \ +# --always-run-endtoend \ +# --cov-report=term-missing:skip-covered \ +# --cov-report=xml:coverage.xml \ +# --cov=tesseract_core \ +# tests/endtoend_tests \ +# -k "not test_examples" +# else +# uv run --no-sync pytest \ +# --always-run-endtoend \ +# --cov-report=term-missing:skip-covered \ +# --cov-report=xml:coverage.xml \ +# --cov=tesseract_core \ +# tests/endtoend_tests/test_examples.py \ +# -k "[${{ matrix.unit-tesseract }}]" +# fi + +# - name: Upload coverage reports to Codecov +# uses: codecov/codecov-action@v5.4.3 +# with: +# token: ${{ secrets.CODECOV_TOKEN }} +# slug: pasteurlabs/tesseract-core +# files: coverage*.xml +# fail_ci_if_error: true + +# all-ok: +# needs: [tests-base, tests-e2e] + +# runs-on: ubuntu-latest + +# steps: +# - name: Check for errors +# run: | +# if [ "${{ needs.tests-base.result }}" != "success" ]; then +# echo "Base tests failed" +# exit 1 +# fi + +# if [ "${{ needs.tests-e2e.result }}" != "success" ]; then +# echo "E2E tests failed" +# exit 1 +# fi + +# echo "All tests passed!" From e9e6de29949eafb9b381f75f2ad032ab50a01494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 08:55:42 +0200 Subject: [PATCH 08/11] wip --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2c05aa6..ae77f52d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -165,6 +165,7 @@ jobs: # Get custom notes from the PR body # Fix line endings + printf "%s" "$PR_BODY" custom_notes=$(printf "%s" "$PR_BODY" | tr -d '\r') printf "%s" "$custom_notes" # Keep only the part after the first '---' line From f4bdbc5a991fc162434eefa1bd83ba4240cf4d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 10:15:43 +0200 Subject: [PATCH 09/11] wip --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ae77f52d..5c12df09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -164,9 +164,9 @@ jobs: changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body + custom_notes="$PR_BODY" # Fix line endings - printf "%s" "$PR_BODY" - custom_notes=$(printf "%s" "$PR_BODY" | tr -d '\r') + custom_notes=$(printf "%s" "$custom_notes" | tr -d '\r') printf "%s" "$custom_notes" # Keep only the part after the first '---' line custom_notes=$(echo "$custom_notes" | sed -n '/^---$/,$p' | sed '1d') From 50cbc9d66926e6afa5d5c02b1945ad4738859e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 10:19:41 +0200 Subject: [PATCH 10/11] wip --- .github/workflows/release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5c12df09..a794373c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -151,6 +151,7 @@ jobs: run: | current_version=$(gh release view --json tagName --jq '.tagName' || echo "v0.0.0") echo "current_version=$current_version" >> $GITHUB_OUTPUT + new_version=$(git-cliff --bumped-version) echo "new_version=$new_version" >> $GITHUB_OUTPUT @@ -159,19 +160,18 @@ jobs: env: PR_BODY: ${{ github.event.pull_request.body }} run: | - changelog=$(git cliff --unreleased --bump --latest --strip all) + changelog=$(git-cliff --unreleased --bump --latest --strip all) # strip off first line (which is the version number) changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body custom_notes="$PR_BODY" # Fix line endings - custom_notes=$(printf "%s" "$custom_notes" | tr -d '\r') - printf "%s" "$custom_notes" + custom_notes=$(echo "$custom_notes" | tr -d '\r') # Keep only the part after the first '---' line custom_notes=$(echo "$custom_notes" | sed -n '/^---$/,$p' | sed '1d') # Strip leading / trailing whitespace - custom_notes=$(printf "%s" "$custom_notes" | sed 's/^[ \t]*//;s/[ \t]*$//') + custom_notes=$(echo "$custom_notes" | sed 's/^[ \t]*//;s/[ \t]*$//') # Create the release notes file touch /tmp/notes.md @@ -182,7 +182,7 @@ jobs: printf "## What's Changed\n%s\n" "$changelog" >> /tmp/notes.md # Append link to full diff - echo "\n**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md + echo -e "\n**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md cat /tmp/notes.md echo "release_note_file=/tmp/notes.md" >> $GITHUB_OUTPUT From 35967da952a9f22c370b2697da7cf198da50c60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 5 Jun 2025 10:23:48 +0200 Subject: [PATCH 11/11] final cleanup --- .github/workflows/release.yml | 23 +- .github/workflows/run_tests.yml | 584 ++++++++++++++++---------------- 2 files changed, 303 insertions(+), 304 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a794373c..12e65968 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,8 +18,8 @@ on: # Case 3: release PR is merged -> create a new release pull_request: - # types: - # - closed + types: + - closed branches: - main @@ -126,7 +126,7 @@ jobs: release: runs-on: ubuntu-latest - # if: github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'bot/release/') + if: github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'bot/release/') steps: - name: Checkout code @@ -161,7 +161,7 @@ jobs: PR_BODY: ${{ github.event.pull_request.body }} run: | changelog=$(git-cliff --unreleased --bump --latest --strip all) - # strip off first line (which is the version number) + # Strip off first line (which is the version number) changelog=$(printf "%s" "$changelog" | sed '1d') # Get custom notes from the PR body @@ -184,13 +184,12 @@ jobs: # Append link to full diff echo -e "\n**Full diff**: https://github.com/${{ github.repository_owner }}/${{ github.repository }}/compare/${{ steps.get_version.outputs.current_version }}...${{ steps.get_version.outputs.new_version }}" >> /tmp/notes.md - cat /tmp/notes.md echo "release_note_file=/tmp/notes.md" >> $GITHUB_OUTPUT - # - name: Create new release - # run: | - # gh release create "${{ steps.get_version.outputs.new_version }}" \ - # --title "${{ steps.get_version.outputs.new_version }}" \ - # --notes-file "${{ steps.release_notes.outputs.release_note_file }}" \ - # --target ${{ github.event.pull_request.merge_commit_sha }} \ - # --latest + - name: Create new release + run: | + gh release create "${{ steps.get_version.outputs.new_version }}" \ + --title "${{ steps.get_version.outputs.new_version }}" \ + --notes-file "${{ steps.release_notes.outputs.release_note_file }}" \ + --target ${{ github.event.pull_request.merge_commit_sha }} \ + --latest diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index fd3f32de..3e3a7419 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -1,292 +1,292 @@ -# name: Run test suite - -# on: -# pull_request: - -# push: -# branches: -# - main - -# concurrency: -# group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} -# cancel-in-progress: true - -# jobs: -# tests-base: -# strategy: -# matrix: -# os: [ubuntu-latest, windows-latest, macos-latest] - -# # test with oldest and latest supported Python versions -# # NOTE: If bumping the minimum Python version here, also do it in -# # ruff.toml, setup.py and other CI files as well. -# python-version: ["3.10", "3.12"] -# runtime-deps: ["latest"] - -# include: -# - os: ubuntu-latest -# python-version: "3.12" -# runtime-deps: "oldest" - -# fail-fast: false - -# runs-on: ${{ matrix.os }} - -# steps: -# - name: Set up Git repository -# uses: actions/checkout@v4 - -# - name: Set up WSL (Windows) -# uses: Vampire/setup-wsl@v5 -# if: runner.os == 'Windows' -# with: -# distribution: Ubuntu-24.04 - -# - name: Set up Python -# if: runner.os != 'Windows' -# uses: actions/setup-python@v5 -# with: -# python-version: ${{ matrix.python-version }} - -# - name: Set up Python (Windows) -# if: runner.os == 'Windows' -# shell: wsl-bash {0} -# run: | -# python_version=${{ matrix.python-version }} -# if [ $python_version == "3.12" ]; then -# # Python 3.12 is the default `python3` in Ubuntu 24.04 -# python_version="3" -# fi - -# export DEBIAN_FRONTEND=noninteractive -# sudo apt-get update -# sudo apt-get install -y software-properties-common gnupg2 -# sudo add-apt-repository ppa:deadsnakes/ppa -# sudo apt-get install -y python3-pip python${python_version} python${python_version}-venv - -# python${python_version} -m venv ~/venv - -# export PATH="$HOME/venv/bin:$PATH" -# python -m pip install --upgrade pip - -# - name: Set up uv -# uses: astral-sh/setup-uv@v6 -# with: -# enable-cache: true - -# - name: Restore UV environment -# run: cp production.uv.lock uv.lock - -# - name: Install package -# if: runner.os != 'Windows' -# run: | -# uv sync --extra dev --frozen - -# if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then -# # replace >= with == in pyproject.toml to install oldest runtime deps -# sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml -# # roll back changes to requires-python -# sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml -# uv pip install .[runtime] -# fi - -# - name: Install package (Windows) -# if: runner.os == 'Windows' -# shell: wsl-bash {0} -# run: | -# export PATH="$HOME/venv/bin:$PATH" - -# pip install uv -# uv sync --extra dev --frozen - -# if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then -# # replace >= with == in pyproject.toml to install oldest runtime deps -# sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml -# # roll back changes to requires-python -# sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml -# uv pip install .[runtime] -# fi - -# - name: Run test suite -# if: runner.os != 'Windows' -# run: | -# uv run --no-sync pytest \ -# --skip-endtoend \ -# --cov-report=term-missing:skip-covered \ -# --cov-report=xml:coverage.xml \ -# --cov=tesseract_core - -# - name: Run test suite (Windows) -# if: runner.os == 'Windows' -# shell: wsl-bash {0} -# run: | -# export PATH="$HOME/venv/bin:$PATH" -# uv run --no-sync pytest \ -# --skip-endtoend \ -# --cov-report=term-missing:skip-covered \ -# --cov-report=xml:coverage.xml \ -# --cov=tesseract_core - -# - name: Upload coverage reports to Codecov -# uses: codecov/codecov-action@v5.4.3 -# with: -# token: ${{ secrets.CODECOV_TOKEN }} -# slug: pasteurlabs/tesseract-core -# files: coverage*.xml -# fail_ci_if_error: true - -# get-e2e-matrix: -# runs-on: ubuntu-latest - -# outputs: -# matrix: ${{ steps.get-matrix.outputs.matrix }} - -# steps: -# - name: Set up Git repository -# uses: actions/checkout@v4 - -# - name: Get available unit Tesseracts -# id: get-matrix -# env: -# E2E_TEST_DIR: examples -# run: | -# # get JSON array of directories in E2E_TEST_DIR -# subjobs=$( -# find "${{ env.E2E_TEST_DIR }}" -type d -maxdepth 1 -mindepth 1 -exec basename {} \; \ -# | jq -R -s -c 'split("\n")[:-1]' -# ) -# # add "base" to subjobs -# subjobs=$(echo "$subjobs" | jq -c -r '. + ["base"]') -# printf 'matrix=%s' "$subjobs" >> $GITHUB_OUTPUT - -# tests-e2e: -# needs: get-e2e-matrix - -# strategy: -# matrix: -# os: [ubuntu-24.04] -# python-version: ["3.12"] - -# arch: ["x64"] -# docker-engine: ["docker"] - -# unit-tesseract: ${{ fromJson(needs.get-e2e-matrix.outputs.matrix) }} - -# exclude: -# - arch: x64 -# unit-tesseract: "pyvista-arm64" - -# include: -# # Test on arm to ensure compatibility with Apple M1 chips -# # (OSX runners don't have access to Docker so we use Linux ARM runners instead) -# - os: "ubuntu-24.04" -# python-version: "3.12" -# arch: "arm" -# docker-engine: "docker" -# unit-tesseract: "base" -# # Run tests using Podman -# - os: "ubuntu-24.04" -# python-version: "3.12" -# arch: "x64" -# docker-engine: "podman" -# unit-tesseract: "base" -# - os: "ubuntu-24.04" -# python-version: "3.12" -# arch: "arm" -# docker-engine: "docker" -# unit-tesseract: "pyvista-arm64" - -# fail-fast: false - -# runs-on: ${{ matrix.arch == 'x64' && matrix.os == 'ubuntu-24.04' && 'ubuntu-24.04' || matrix.arch == 'arm' && matrix.os == 'ubuntu-24.04' && 'linux-arm64-ubuntu2404'}} - -# env: -# TESSERACT_DOCKER_BUILD_ARGS: "--cache-from type=gha --cache-to type=gha,mode=max" - -# defaults: -# run: -# shell: bash -el {0} - -# steps: -# - name: Set up Git repository -# uses: actions/checkout@v4 - -# # Use Conda to install Python (setup-python action doesn't support ARM) -# - uses: conda-incubator/setup-miniconda@v3 -# with: -# auto-update-conda: true -# python-version: ${{ matrix.python-version }} - -# - name: Set up uv -# uses: astral-sh/setup-uv@v6 -# with: -# enable-cache: true - -# - name: Restore UV environment -# run: cp production.uv.lock uv.lock - -# - name: Install package -# run: | -# uv sync --extra dev --frozen - -# - name: Set up Podman -# if: matrix.docker-engine == 'podman' -# run: | -# systemctl start --user podman.socket -# systemctl status --user podman.socket - -# podman --version - -# export DOCKER_HOST=unix:///run/user/1001/podman/podman.sock -# echo "DOCKER_HOST=${DOCKER_HOST}" >> $GITHUB_ENV -# echo "TESSERACT_DOCKER_EXECUTABLE=podman" >> $GITHUB_ENV -# # Podman doesn't support --cache-from -# echo "TESSERACT_DOCKER_BUILD_ARGS=" >> $GITHUB_ENV - -# - name: Run test suite -# run: | -# if [ "${{ matrix.unit-tesseract }}" == "base" ]; then -# uv run --no-sync pytest \ -# --always-run-endtoend \ -# --cov-report=term-missing:skip-covered \ -# --cov-report=xml:coverage.xml \ -# --cov=tesseract_core \ -# tests/endtoend_tests \ -# -k "not test_examples" -# else -# uv run --no-sync pytest \ -# --always-run-endtoend \ -# --cov-report=term-missing:skip-covered \ -# --cov-report=xml:coverage.xml \ -# --cov=tesseract_core \ -# tests/endtoend_tests/test_examples.py \ -# -k "[${{ matrix.unit-tesseract }}]" -# fi - -# - name: Upload coverage reports to Codecov -# uses: codecov/codecov-action@v5.4.3 -# with: -# token: ${{ secrets.CODECOV_TOKEN }} -# slug: pasteurlabs/tesseract-core -# files: coverage*.xml -# fail_ci_if_error: true - -# all-ok: -# needs: [tests-base, tests-e2e] - -# runs-on: ubuntu-latest - -# steps: -# - name: Check for errors -# run: | -# if [ "${{ needs.tests-base.result }}" != "success" ]; then -# echo "Base tests failed" -# exit 1 -# fi - -# if [ "${{ needs.tests-e2e.result }}" != "success" ]; then -# echo "E2E tests failed" -# exit 1 -# fi - -# echo "All tests passed!" +name: Run test suite + +on: + pull_request: + + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + tests-base: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + # test with oldest and latest supported Python versions + # NOTE: If bumping the minimum Python version here, also do it in + # ruff.toml, setup.py and other CI files as well. + python-version: ["3.10", "3.12"] + runtime-deps: ["latest"] + + include: + - os: ubuntu-latest + python-version: "3.12" + runtime-deps: "oldest" + + fail-fast: false + + runs-on: ${{ matrix.os }} + + steps: + - name: Set up Git repository + uses: actions/checkout@v4 + + - name: Set up WSL (Windows) + uses: Vampire/setup-wsl@v5 + if: runner.os == 'Windows' + with: + distribution: Ubuntu-24.04 + + - name: Set up Python + if: runner.os != 'Windows' + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Set up Python (Windows) + if: runner.os == 'Windows' + shell: wsl-bash {0} + run: | + python_version=${{ matrix.python-version }} + if [ $python_version == "3.12" ]; then + # Python 3.12 is the default `python3` in Ubuntu 24.04 + python_version="3" + fi + + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install -y software-properties-common gnupg2 + sudo add-apt-repository ppa:deadsnakes/ppa + sudo apt-get install -y python3-pip python${python_version} python${python_version}-venv + + python${python_version} -m venv ~/venv + + export PATH="$HOME/venv/bin:$PATH" + python -m pip install --upgrade pip + + - name: Set up uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Restore UV environment + run: cp production.uv.lock uv.lock + + - name: Install package + if: runner.os != 'Windows' + run: | + uv sync --extra dev --frozen + + if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then + # replace >= with == in pyproject.toml to install oldest runtime deps + sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml + # roll back changes to requires-python + sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml + uv pip install .[runtime] + fi + + - name: Install package (Windows) + if: runner.os == 'Windows' + shell: wsl-bash {0} + run: | + export PATH="$HOME/venv/bin:$PATH" + + pip install uv + uv sync --extra dev --frozen + + if [ "${{ matrix.runtime-deps }}" == "oldest" ]; then + # replace >= with == in pyproject.toml to install oldest runtime deps + sed -i 's/>=/==/g' ./tesseract_core/runtime/meta/pyproject.toml + # roll back changes to requires-python + sed -i 's/requires-python\s*=\s*\"==/requires-python = \">=/g' ./tesseract_core/runtime/meta/pyproject.toml + uv pip install .[runtime] + fi + + - name: Run test suite + if: runner.os != 'Windows' + run: | + uv run --no-sync pytest \ + --skip-endtoend \ + --cov-report=term-missing:skip-covered \ + --cov-report=xml:coverage.xml \ + --cov=tesseract_core + + - name: Run test suite (Windows) + if: runner.os == 'Windows' + shell: wsl-bash {0} + run: | + export PATH="$HOME/venv/bin:$PATH" + uv run --no-sync pytest \ + --skip-endtoend \ + --cov-report=term-missing:skip-covered \ + --cov-report=xml:coverage.xml \ + --cov=tesseract_core + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v5.4.3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: pasteurlabs/tesseract-core + files: coverage*.xml + fail_ci_if_error: true + + get-e2e-matrix: + runs-on: ubuntu-latest + + outputs: + matrix: ${{ steps.get-matrix.outputs.matrix }} + + steps: + - name: Set up Git repository + uses: actions/checkout@v4 + + - name: Get available unit Tesseracts + id: get-matrix + env: + E2E_TEST_DIR: examples + run: | + # get JSON array of directories in E2E_TEST_DIR + subjobs=$( + find "${{ env.E2E_TEST_DIR }}" -type d -maxdepth 1 -mindepth 1 -exec basename {} \; \ + | jq -R -s -c 'split("\n")[:-1]' + ) + # add "base" to subjobs + subjobs=$(echo "$subjobs" | jq -c -r '. + ["base"]') + printf 'matrix=%s' "$subjobs" >> $GITHUB_OUTPUT + + tests-e2e: + needs: get-e2e-matrix + + strategy: + matrix: + os: [ubuntu-24.04] + python-version: ["3.12"] + + arch: ["x64"] + docker-engine: ["docker"] + + unit-tesseract: ${{ fromJson(needs.get-e2e-matrix.outputs.matrix) }} + + exclude: + - arch: x64 + unit-tesseract: "pyvista-arm64" + + include: + # Test on arm to ensure compatibility with Apple M1 chips + # (OSX runners don't have access to Docker so we use Linux ARM runners instead) + - os: "ubuntu-24.04" + python-version: "3.12" + arch: "arm" + docker-engine: "docker" + unit-tesseract: "base" + # Run tests using Podman + - os: "ubuntu-24.04" + python-version: "3.12" + arch: "x64" + docker-engine: "podman" + unit-tesseract: "base" + - os: "ubuntu-24.04" + python-version: "3.12" + arch: "arm" + docker-engine: "docker" + unit-tesseract: "pyvista-arm64" + + fail-fast: false + + runs-on: ${{ matrix.arch == 'x64' && matrix.os == 'ubuntu-24.04' && 'ubuntu-24.04' || matrix.arch == 'arm' && matrix.os == 'ubuntu-24.04' && 'linux-arm64-ubuntu2404'}} + + env: + TESSERACT_DOCKER_BUILD_ARGS: "--cache-from type=gha --cache-to type=gha,mode=max" + + defaults: + run: + shell: bash -el {0} + + steps: + - name: Set up Git repository + uses: actions/checkout@v4 + + # Use Conda to install Python (setup-python action doesn't support ARM) + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + + - name: Set up uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Restore UV environment + run: cp production.uv.lock uv.lock + + - name: Install package + run: | + uv sync --extra dev --frozen + + - name: Set up Podman + if: matrix.docker-engine == 'podman' + run: | + systemctl start --user podman.socket + systemctl status --user podman.socket + + podman --version + + export DOCKER_HOST=unix:///run/user/1001/podman/podman.sock + echo "DOCKER_HOST=${DOCKER_HOST}" >> $GITHUB_ENV + echo "TESSERACT_DOCKER_EXECUTABLE=podman" >> $GITHUB_ENV + # Podman doesn't support --cache-from + echo "TESSERACT_DOCKER_BUILD_ARGS=" >> $GITHUB_ENV + + - name: Run test suite + run: | + if [ "${{ matrix.unit-tesseract }}" == "base" ]; then + uv run --no-sync pytest \ + --always-run-endtoend \ + --cov-report=term-missing:skip-covered \ + --cov-report=xml:coverage.xml \ + --cov=tesseract_core \ + tests/endtoend_tests \ + -k "not test_examples" + else + uv run --no-sync pytest \ + --always-run-endtoend \ + --cov-report=term-missing:skip-covered \ + --cov-report=xml:coverage.xml \ + --cov=tesseract_core \ + tests/endtoend_tests/test_examples.py \ + -k "[${{ matrix.unit-tesseract }}]" + fi + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v5.4.3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: pasteurlabs/tesseract-core + files: coverage*.xml + fail_ci_if_error: true + + all-ok: + needs: [tests-base, tests-e2e] + + runs-on: ubuntu-latest + + steps: + - name: Check for errors + run: | + if [ "${{ needs.tests-base.result }}" != "success" ]; then + echo "Base tests failed" + exit 1 + fi + + if [ "${{ needs.tests-e2e.result }}" != "success" ]; then + echo "E2E tests failed" + exit 1 + fi + + echo "All tests passed!"