Skip to content

ci: migrate workflows to shared uv_setup composite action and uv sync#420

Open
erichare wants to merge 2 commits into
mainfrom
ci-uv-setup-migration
Open

ci: migrate workflows to shared uv_setup composite action and uv sync#420
erichare wants to merge 2 commits into
mainfrom
ci-uv-setup-migration

Conversation

@erichare

Copy link
Copy Markdown
Collaborator

Summary

Migrates the five CI workflows from the legacy Python/uv bootstrap (actions/setup-python@v2 + pip install --upgrade pip + pipx install uv + make venv) to the shared ./.github/actions/uv_setup composite action followed by uv sync --dev.

The composite action (.github/actions/uv_setup/action.yml) wraps astral-sh/setup-uv@v6, which installs a pinned uv (currently 0.8.11) and provisions the requested Python version in one step. This removes the need for a separate setup-python step and the manual pip/pipx/make bootstrap, centralizing the toolchain version (uv pin + setup mechanism) in a single place so all jobs stay consistent.

This is a mechanical, no-behavior-change migration: the same Python versions are installed and the same dev dependency set is resolved. Only the mechanism of installation changes. Nothing in the package, tests, or Makefile is modified — the make venv target still exists for local development; CI simply no longer routes through it.

Per-file changes

All five edits follow the same shape — replace the two setup/install steps with the composite action + uv sync --dev:

  • .github/workflows/lint.yml — Python 3.11. setup-python@v2 + pip/pipx/make venv replaced with uv_setup (3.11) + uv sync --dev.
  • .github/workflows/local.yml — Python 3.12. Same migration; the subsequent AWS OIDC credentials step is unchanged.
  • .github/workflows/main.yml — Python 3.12. Same migration; pytest step unchanged.
  • .github/workflows/unit.yml — uses the matrix value ${{ matrix.python-version }} (unchanged); only the setup/install steps are migrated.
  • .github/workflows/codecov_aggregator.yml — Python 3.11. Same migration; the existing if: ${{ github.event.action != 'closed' }} guards on both steps are preserved, and the step is renamed "Set up Python" → "Set up Python + uv" to match the others.

Minor cosmetic alignment also applied: quoting python-version values consistently (e.g. 3.11"3.11"), renaming the setup step to "Set up Python + uv", and adding shell: bash to the uv sync --dev run steps.

Scope note

This PR is the CI-tooling half of the split of #411. The release-robustness changes (check-pypi version-exists gate, the success() fix on release.yml, and re-enabling Sigstore attestations on the PyPI publish steps) are intentionally excluded and will land in a separate PR. release.yml and _test_release.yml are not touched here.

Verification

  • Confirmed all five GROUP A files on the feature branch contain no remaining references to actions/setup-python, pipx install uv, or make venv.
  • Validated each migrated workflow parses as valid YAML (yaml.safe_load).
  • Confirmed the referenced composite action exists and is well-formed: .github/actions/uv_setup/action.yml uses astral-sh/setup-uv@v6 and pins UV_VERSION: 0.8.11, accepting a python-version input (MAJOR.MINOR) — matching how every call site invokes it.
  • Confirmed make venv remains a valid Makefile target, so local developer workflows are unaffected by its removal from CI.

Test plan

  • CI green on this PR: lint, unit (across the Python matrix), and main workflows succeed using the new bootstrap.
  • Spot-check a job log to confirm uv resolves the dev dependency group via uv sync --dev and the correct Python version is provisioned.
  • Confirm codecov_aggregator still skips its setup/install steps on closed events (guards preserved).

Migrate lint, local, main, unit, and codecov_aggregator workflows from the
legacy bootstrap (actions/setup-python@v2 + pip install --upgrade pip +
pipx install uv + make venv) to the shared ./.github/actions/uv_setup composite
action followed by `uv sync --dev`.

The composite action wraps astral-sh/setup-uv@v6 (pinned uv 0.8.11) and
provisions Python in one step, centralizing the toolchain version so all jobs
stay consistent. This is a mechanical, no-behavior-change migration: same
Python versions, same dev dependency set; only the install mechanism changes.
`make venv` remains for local development.

Split out of the release-workflow hardening (PR #411); release.yml and
_test_release.yml are intentionally not touched here.
@erichare
erichare requested a review from sl-at-ibm June 15, 2026 18:58
@github-actions

Copy link
Copy Markdown

Coverage report

for commit: 8e96cf4315dde38c1dd674af399d7d38698b9938.
download detailed report here.

                                                File   Stmts   Miss      Cover     Delta
----------------------------------------------------------------------------------------
                      astrapy/exceptions/__init__.py     108     19     82.41%    -0.93%
                                     astrapy/repl.py      77     77      0.00%     0.00%
                              astrapy/admin/admin.py     763    361     52.69%     0.00%
                                 astrapy/__init__.py      26     10     61.54%     0.00%
                                  astrapy/results.py      50     16     68.00%     0.00%
              astrapy/exceptions/table_exceptions.py      27      8     70.37%     0.00%
         astrapy/exceptions/collection_exceptions.py      40     11     72.50%     0.00%
                  astrapy/data_types/data_api_set.py      90     23     74.44%     0.00%
                         astrapy/exceptions/utils.py      53     11     79.25%     0.00%
                  astrapy/data/cursors/pagination.py      21      4     80.95%     0.00%
                           astrapy/authentication.py     138     24     82.61%     0.00%
          astrapy/data/info/collection_descriptor.py     197     33     83.25%     0.00%
                        astrapy/utils/user_agents.py      18      3     83.33%     0.00%
                                   astrapy/client.py      68     11     83.82%     0.00%
               astrapy/data_types/data_api_vector.py      44      7     84.09%     0.00%
                      astrapy/data/info/reranking.py     122     18     85.25%     0.00%
                            astrapy/utils/parsing.py       7      1     85.71%     0.00%
                  astrapy/data_types/data_api_map.py      59      8     86.44%     0.00%
 astrapy/data/info/table_descriptor/table_listing.py      49      6     87.76%     0.00%
                            astrapy/data/database.py     657     75     88.58%     0.00%
 astrapy/data/info/table_descriptor/table_indexes.py     230     26     88.70%     0.00%
            astrapy/data_types/data_api_timestamp.py      98     11     88.78%     0.00%
                      astrapy/data/info/vectorize.py     131     14     89.31%     0.00%
                  astrapy/data/info/database_info.py     104     11     89.42%     0.00%
    astrapy/settings/definitions/definitions_data.py      38      4     89.47%     0.00%
  astrapy/data/info/table_descriptor/type_listing.py      39      4     89.74%     0.00%
             astrapy/data_types/data_api_dict_udt.py      10      1     90.00%     0.00%
                              astrapy/utils/unset.py      10      1     90.00%     0.00%
                        astrapy/utils/api_options.py     206     20     90.29%     0.00%
astrapy/data/info/table_descriptor/table_altering.py     114     11     90.35%     0.00%
             astrapy/data_types/data_api_duration.py      55      5     90.91%     0.00%
                               astrapy/data/table.py     738     65     91.19%     0.00%
                          astrapy/admin/endpoints.py      36      3     91.67%     0.00%
 astrapy/data/info/table_descriptor/table_columns.py     204     17     91.67%     0.00%
 astrapy/data/info/table_descriptor/type_altering.py      85      7     91.76%     0.00%
                 astrapy/utils/duration_std_utils.py      92      7     92.39%     0.00%
         astrapy/exceptions/devops_api_exceptions.py      79      6     92.41%     0.00%
                          astrapy/data/collection.py     752     57     92.42%     0.00%
                astrapy/data/cursors/query_engine.py     214     16     92.52%     0.00%
         astrapy/event_observers/context_managers.py      27      2     92.59%     0.00%
                 astrapy/data_types/data_api_time.py      98      7     92.86%     0.00%
                 astrapy/data_types/data_api_date.py      89      6     93.26%     0.00%
 astrapy/data/info/table_descriptor/type_creation.py      32      2     93.75%     0.00%
             astrapy/exceptions/error_descriptors.py      53      3     94.34%     0.00%
   astrapy/settings/definitions/definitions_types.py      19      1     94.74%     0.00%
         astrapy/data/utils/collection_converters.py      80      4     95.00%     0.00%
              astrapy/data/utils/table_converters.py     411     20     95.13%     0.00%
                 astrapy/data/cursors/find_cursor.py     631     30     95.25%     0.00%
astrapy/data/info/table_descriptor/table_creation.py      49      2     95.92%     0.00%
                astrapy/event_observers/observers.py      30      1     96.67%     0.00%
                      astrapy/data/cursors/cursor.py      92      3     96.74%     0.00%
                 astrapy/data/cursors/farr_cursor.py     350     11     96.86%     0.00%
                           astrapy/utils/str_enum.py      32      1     96.88%     0.00%
                   astrapy/utils/duration_c_utils.py      66      2     96.97%     0.00%
                         astrapy/utils/date_utils.py      80      2     97.50%     0.00%
   astrapy/settings/definitions/definitions_admin.py      41      1     97.56%     0.00%
           astrapy/exceptions/data_api_exceptions.py      84      1     98.81%     0.00%
           astrapy/data/utils/distinct_extractors.py     104      1     99.04%     0.00%
                           astrapy/admin/__init__.py       3      0    100.00%     0.00%
                              astrapy/api_options.py       3      0    100.00%     0.00%
                               astrapy/collection.py       2      0    100.00%     0.00%
                                astrapy/constants.py       5      0    100.00%     0.00%
                                  astrapy/cursors.py       7      0    100.00%     0.00%
                            astrapy/data/__init__.py       0      0    100.00%     0.00%
                    astrapy/data/cursors/__init__.py       1      0    100.00%     0.00%
             astrapy/data/cursors/reranked_result.py       8      0    100.00%     0.00%
                      astrapy/data/utils/__init__.py       0      0    100.00%     0.00%
      astrapy/data/utils/extended_json_converters.py      28      0    100.00%     0.00%
                   astrapy/data/utils/table_types.py      36      0    100.00%     0.00%
               astrapy/data/utils/vector_coercion.py      13      0    100.00%     0.00%
                      astrapy/data_types/__init__.py      10      0    100.00%     0.00%
                                 astrapy/database.py       2      0    100.00%     0.00%
                 astrapy/event_observers/__init__.py       5      0    100.00%     0.00%
                   astrapy/event_observers/events.py      50      0    100.00%     0.00%
                                      astrapy/ids.py       5      0    100.00%     0.00%
                                     astrapy/info.py      15      0    100.00%     0.00%
                        astrapy/settings/__init__.py       0      0    100.00%     0.00%
                        astrapy/settings/defaults.py      44      0    100.00%     0.00%
            astrapy/settings/definitions/__init__.py       0      0    100.00%     0.00%
                  astrapy/settings/error_messages.py       2      0    100.00%     0.00%
                                    astrapy/table.py       2      0    100.00%     0.00%
                           astrapy/utils/__init__.py       0      0    100.00%     0.00%
                     astrapy/utils/document_paths.py      46      0    100.00%     0.00%
                     astrapy/utils/python_version.py       5      0    100.00%     0.00%
                      astrapy/utils/request_tools.py      32      0    100.00%     0.00%
                      astrapy/utils/api_commander.py     248     21     91.53%     0.40%
                               astrapy/utils/meta.py      38     14     63.16%     2.63%
----------------------------------------------------------------------------------------
                                              totals    8827   1147     87.01%     0.01%

@erichare erichare linked an issue Jun 17, 2026 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improvements in the release workflow (and workflows in general)

1 participant