Skip to content

Add PyPI release tooling - #6

Merged
eddietejeda merged 1 commit into
mainfrom
feat/release-tooling
Jul 22, 2026
Merged

Add PyPI release tooling#6
eddietejeda merged 1 commit into
mainfrom
feat/release-tooling

Conversation

@eddietejeda

Copy link
Copy Markdown
Contributor

Mirrors the sdk-python release convention: ./scripts/release.sh prepare|publish, tag-triggered publish.yml (build, twine check, tag↔version guard, PyPI trusted publishing via the pypi environment), release.yml for GitHub Releases from CHANGELOG.md. One adaptation: release.sh bumps both pyproject.toml and hotdata_materialized/__init__.py since the package tests enforce they match. Changelog helpers verified locally (roll + extract). Note: PyPI trusted publishing for this repo must be configured once on pypi.org before the first publish.

- scripts/release.sh: prepare (version bump in pyproject + __init__,
  changelog roll, release PR) and publish (tag push) — mirrors the
  sdk-python convention
- publish.yml: tag-triggered build + twine check + PyPI trusted
  publishing (pypi environment); release.yml: GitHub Release from
  CHANGELOG.md
- CHANGELOG.md seeded with the unreleased 0.1.0 feature set; RELEASING.md
Comment thread scripts/release.sh
ensure_clean

local current new base branch pkg
current="$(get_version)"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: current is read here, before the base branch is checked out at line 127. If prepare is run from a branch whose pyproject.toml version differs from base (e.g. a stale feature branch), the bump is computed against the wrong version, and set_version "$new" then writes that onto base. Consider reading current="$(get_version)" after git checkout "$base" / git pull so the bump is always relative to the branch you actually tag from. (not blocking)

name: ${{ steps.meta.outputs.name }} ${{ steps.meta.outputs.version }}
body: ${{ steps.notes.outputs.body }}
generate_release_notes: false
make_latest: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super nit: make_latest: true is unconditional, so re-running this workflow via workflow_dispatch for an older tag (the documented GitHub-Release recovery path in RELEASING.md) would re-mark that older release as "latest". Consider gating it to the tag-push path, e.g. make_latest: ${{ github.event_name == 'push' }}. (not blocking)

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Release tooling looks solid — pinned action SHAs, PyPI trusted publishing, minimal per-job permissions, tag↔version guard, and safe multiline GITHUB_OUTPUT handling. Verified the changelog roll + extract logic. Left two non-blocking nits.

@eddietejeda
eddietejeda merged commit 5116cd2 into main Jul 22, 2026
3 checks passed
@eddietejeda
eddietejeda deleted the feat/release-tooling branch July 22, 2026 23:37
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.

1 participant