リリースと PyPI 公開の手順
検証済みのリリースフロー — CHANGELOG → バージョン更新 → タグ → 自動公開 (TestPyPI → PyPI → GitHub Release) を説明する。自動化は .github/workflows/publish.yml にあり、 v* タグを契機に PyPI Trusted Publishing(OIDC・長期トークン不要)で動く。
一度だけの設定(メンテナ作業・設定済み)
publish ワークフローは Trusted Publishing と GitHub Environments を使う。これは 既に構成済み・稼働中で、参照・復旧用に記録する:
- PyPI / TestPyPI の Trusted Publisher(
nene2-python):- Owner:
hideyukiMORI、Repository:nene2-python - Workflow:
publish.yml - Environment:
pypi(pypi.org)とtestpypi(test.pypi.org) - https://pypi.org/manage/account/publishing/ と TestPyPI の同等画面で登録済み。
- Owner:
- GitHub repo → Settings → Environments:
testpypiとpypi作成済み (pypiに必須レビュアーを設定すれば手動承認ゲートになる)。
パッケージは公開済みで、pip install nene2-python で最新リリース(v1.8.163 以降) を PyPI から直接取得できる。
リリース手順(毎回)
CHANGELOG.mdを更新 —## [X.Y.Z] — YYYY-MM-DDセクションを追加。 GitHub Release ステップはこのヘッダーでノートを抽出するため、無いとリリース ノートが空になる。- バージョンを更新(
pyproject.toml)し lock を再生成:bashuv lock - PR を作成し CI を通す(
package-buildジョブが配布物を検証)→mainにマージ。 - タグを切って push:bash
git checkout main && git pull git tag vX.Y.Z git push origin vX.Y.Z publish.ymlが自動実行:uv build→ TestPyPI 公開 → PyPI 公開 → CHANGELOG からノートを抽出し配布物を添付して GitHub Release を作成。
ローカル検証(タグ前)
CI の package-build ジョブが PR ごとに実行するが、手元でも再現できる:
bash
uv build # dist/ に sdist + wheel
uvx twine check dist/* # PyPI メタデータ妥当性
uv venv /tmp/verify
uv pip install --python /tmp/verify/bin/python dist/*.whl
/tmp/verify/bin/python -c "import nene2; print('OK')" # クリーン import。example/tests は import 不可であることv1.8.163 時点で通過する: twine check は PASSED、wheel はクリーン venv で import 可能、配布物は src/nene2 のみ(example/tests は [tool.hatch.build.targets.wheel] packages = ["src/nene2"] により除外)。
補足
- バージョン管理:
pyproject.tomlのversionが真実の源で、FT / 機能 / 修正 PR ごとに更新する。Gitv*タグはリリース時に選択的に作成(publish はタグ時のみ発火) するため、pyproject がタグより先行する。 - CHANGELOG の粒度: 版ごとの一行サマリーは
docs/todo/current.mdのマイルストーン表に、CHANGELOG.mdにはリリース粒度の集約エントリを記録する。 - 本手順は FT7 相当の「公開フロー」トライアル(#541)に対応する。フローは完全稼働済みで、 v1.8.163 を本フローで PyPI に公開済み(
pip install nene2-pythonで取得可能)。