diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index d12889d..0000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,20 +0,0 @@ -[bumpversion] -current_version = 2.3.1.dev -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z0-9]+))? -tag_name = {new_version} -allow_dirty = True -commit = True -tag = False -serialize = - {major}.{minor}.{patch}.{release} - {major}.{minor}.{patch} - -[bumpversion:file:chartpress.py] - -[bumpversion:file:setup.py] - -[bumpversion:part:release] -optional_value = stable -values = - dev - stable diff --git a/.github/workflows/publish.yaml b/.github/workflows/release.yaml similarity index 69% rename from .github/workflows/publish.yaml rename to .github/workflows/release.yaml index 7e4a24f..794639b 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/release.yaml @@ -1,35 +1,33 @@ # This is a GitHub workflow defining a set of jobs with a set of steps. # ref: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions # -# Publish to PyPI on push of version like tags -# -name: Publish +name: Release +# Always tests wheel building, but only publish to PyPI on pushed tags. on: pull_request: paths-ignore: - - "**.md" - - ".github/workflows/*" - - "!.github/workflows/publish.yaml" + - ".github/workflows/*.yaml" + - "!.github/workflows/release.yaml" push: paths-ignore: - - "**.md" - - ".github/workflows/*" - - "!.github/workflows/publish.yaml" + - ".github/workflows/*.yaml" + - "!.github/workflows/release.yaml" branches-ignore: - "dependabot/**" - "pre-commit-ci-update-config" - tags: - - "**" + tags: ["**"] + workflow_dispatch: jobs: - publish-to-pypi: - runs-on: ubuntu-22.04 + build-release: + runs-on: ubuntu-24.04 + steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: install build package run: | @@ -40,7 +38,7 @@ jobs: - name: build release run: | python -m build --sdist --wheel . - ls -alh dist + ls -l dist - name: publish to pypi uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/RELEASE.md b/RELEASE.md index 50d1644..95fe536 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,71 +1,60 @@ # How to make a release -`chartpress` is a package [available on -PyPI](https://pypi.org/project/chartpress/). These are instructions on how to -make a release on PyPI. The PyPI release is packaged and published automatically -by a GitHub workflow when a git tag is pushed. +`chartpress` is a package available on [PyPI] and [conda-forge]. -For you to follow along according to these instructions, you need: +These are the instructions on how to make a release. -- To have push rights to the [chartpress GitHub - repository](https://github.com/jupyterhub/chartpress). +## Pre-requisites + +- Push rights to this GitHub repository ## Steps to make a release -1. Update [CHANGELOG.md](CHANGELOG.md) if it is not up to date, and verify - [README.md](README.md) has an updated output of running `--help`. Make a PR - to review the CHANGELOG notes. +1. Create a PR updating `CHANGELOG.md` with [github-activity] and continue when + its merged. For details about this, see the [team-compass documentation] + about it. - To get the foundation of the changelog written, you can install - [github-activity](https://github.com/choldgraf/github-activity) and run - `github-activity jupyterhub/chartpress` after setting up - credentials as described in the project's README.md file. + [team-compass documentation]: https://jupyterhub-team-compass.readthedocs.io/en/latest/practices/releases.html -1. Once the changelog is up to date, checkout main and make sure it is up to date and clean. +2. Checkout main and make sure it is up to date. - ```bash - ORIGIN=${ORIGIN:-origin} # set to the canonical remote, e.g. 'upstream' if 'origin' is not the official repo + ```shell git checkout main - git fetch $ORIGIN main - git reset --hard $ORIGIN/main - # WARNING! This next command deletes any untracked files in the repo - git clean -xfd + git fetch origin main + git reset --hard origin/main ``` -1. Update the version with `bump2version` (can be installed with `pip install -r dev-requirements.txt`) +3. Update the version, make commits, and push a git tag with `tbump`. - ```bash - VERSION=... # e.g. 1.2.3 - bump2version --tag --new-version $VERSION - + ```shell + pip install tbump ``` -1. Reset the version to the next development version with `bump2version` + `tbump` will ask for confirmation before doing anything. - ```bash - bump2version --no-tag patch + ```shell + # Example versions to set: 1.0.0, 1.0.0b1 + VERSION= + tbump ${VERSION} ``` -1. Push your two commits to main along with the annotated tags referencing - commits on main. - - ``` - git push --follow-tags $ORIGIN main - ``` + Following this, the [CI system] will build and publish a release. -## Manually uploading to PyPI +4. Reset the version back to dev, e.g. `1.0.1.dev` after releasing `1.0.0`. -We are using CI with GitHub workflows to automatically publish to PyPI, but if -you want to do it manually when you are on a tagged commit in a otherwise -cleaned repository, you can do this. - -1. Package the release - - ```bash - python3 setup.py sdist bdist_wheel + ```shell + # Example version to set: 1.0.1.dev + NEXT_VERSION= + tbump --no-tag ${NEXT_VERSION}.dev ``` -1. Upload it to PyPI +5. Following the release to PyPI, an automated PR should arrive within 24 hours + to [conda-forge/chartpress-feedstock] with instructions + on releasing to conda-forge. You are welcome to volunteer doing this, but + aren't required as part of making this release to PyPI. - ```bash - twine upload dist/* - ``` +[github-activity]: https://github.com/executablebooks/github-activity +[pypi]: https://pypi.org/project/chartpress/ +[conda-forge]: https://anaconda.org/conda-forge/chartpress +[conda-forge/chartpress-feedstock]: https://github.com/conda-forge/chartpress-feedstock +[ci system]: https://github.com/jupyterhub/chartpress/actions/workflows/release.yaml diff --git a/pyproject.toml b/pyproject.toml index c375133..d376a0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,3 +83,32 @@ profile = "black" [tool.pytest.ini_options] addopts = "--verbose --color=yes --durations=10 --cov=chartpress" testpaths = ["tests"] + + +# tbump is used to simplify and standardize the release process when updating +# the version, making a git commit and tag, and pushing changes. +# +# ref: https://github.com/your-tools/tbump#readme +# +[tool.tbump] +github_url = "https://github.com/jupyterhub/chartpress" + +[tool.tbump.version] +current = "2.3.1.dev" +regex = ''' + (?P\d+) + \. + (?P\d+) + \. + (?P\d+) + (?P
((a|b|rc)\d+)|)
+    \.?
+    (?P(?<=\.)dev\d*|)
+'''
+
+[tool.tbump.git]
+message_template = "Bump to {new_version}"
+tag_template = "{new_version}"
+
+[[tool.tbump.file]]
+src = "chartpress.py"