diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml deleted file mode 100644 index 906e6c39a..000000000 --- a/.github/workflows/pypi.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: PyPI - -on: - release: - types: [created] - -jobs: - publish: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Setup Python - uses: actions/setup-python@v3 - with: - python-version: '3.6' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install setuptools wheel twine - - name: Remove existing packages - run: rm -rf ./dist/ ./caluma.egg-info/ ./build/ - - name: Run twine - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - TWINE_NON_INTERACTIVE: true - run: | - python setup.py sdist bdist_wheel - twine upload dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..5146aaf7a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,50 @@ +name: Release + +on: + workflow_dispatch: + inputs: + prerelease: + type: boolean + description: Prerelease + +concurrency: + group: release + cancel-in-progress: true + +jobs: + release: + name: Release + runs-on: ubuntu-latest + + if: github.event.ref == 'refs/heads/main' + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup python + uses: actions/setup-python@v2 + with: + python-version: "3.10" + + - uses: actions/cache@v2 + with: + path: ~/.venv + key: poetry-${{ hashFiles('poetry.lock') }} + restore-keys: | + poetry- + - name: Install dependencies + run: | + pip install -U poetry + poetry config virtualenvs.in-project true + poetry install + - name: Run semantic release + run: | + git config user.name github-actions + git config user.email github-actions@github.com + poetry run semantic-release publish -v DEBUG ${{ github.event.inputs.prerelease == 'true' && '--prerelease' || '' }} + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + REPOSITORY_USERNAME: __token__ + REPOSITORY_PASSWORD: ${{ secrets.PYPI_TOKEN }} diff --git a/.reuse/dep5 b/.reuse/dep5 index eb06cb202..d52e213aa 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -12,7 +12,7 @@ Files: .github/dependabot.yml .github/workflows/compatibility-tests.yml .github/workflows/ghcr.yml - .github/workflows/pypi.yml + .github/workflows/release.yml .github/workflows/tests.yml .gitignore .gitlint diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b00d3fc9..ef89f1c5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ + + # v7.15.1 (15 March 2022) ### Fix diff --git a/MAINTAINING.md b/MAINTAINING.md index aee7c07ad..8be3aa2f0 100644 --- a/MAINTAINING.md +++ b/MAINTAINING.md @@ -1,72 +1,10 @@ # Maintainer's Handbook -## Release Management +## Make a new release -The release procedure was recently changed from automatic to manual, due to too -many problems with it. +We're using `python-semantic-release` to generate a changelog, update the +version and publish it to Github and PyPi. -Here is a rough outline / checklist for the release (explained further below): - -1. Checkout `main` branch, ensure you have all tags -2. Prepare changelog -3. Figure out the next version -4. Update code (CHANGELOG, version info) -5. Pull Request with the version bump. -6. Create tag on the merge commit -7. Upload / edit change log -8. If new deprecations have been introduced, make sure they are listed in the - `Deprecations` issue, and ensure the deprecations are explicitly mentioned in the release notes as well. - -Here's how this works in detail: - -### Get release information - -The `semantic-release` tool can help you with the first few tasks of the above -checklist: - -```bash -# Ensure you're on the current main and have all release tags -git checkout main -git pull origin --tags - -# Prepare changelog -semantic-release changelog --noop --unreleased -D version_source=tag - -# Figure out the next version -semantic-release version --noop -D version_source=tag -``` - -You should verify that the version proposed by `semantic-release` is actually -correct. At the time of writing (2020-01-22), it didn't detect some "BREAKING -CHANGES" labels, for example. Adjust the version to what you think is correct. - -### Update version, changelog in source - -The version is also put in code. Update the file -`caluma/caluma_metadata.py`. - -Put the changelog on top of the `CHANGELOG.md` file along with the proposed date -of release. If needed, amend it with some informative text about the release - -### Create a Pull request for the proposed version bump - -Put the changelog in the commit message or in the PR discussion somewhere, so -it won't be forgotten once the release actually happens. - -Note: If other PRs are merged after you create the version bump PR, you may need -to revisit the changelog, and potentially even the version number to be created. -It is thus important to create and merge the version bump in a timely, -coordinated manner. - -### Create Release - -Once the version bump PR has been merged, take the corresponding merge commit, -and tag it with the version. Note that the tag needs to be prefixed with `v`, -so for example version 5.0.0 will need a tag named exactly `v5.0.0`. - -You should then edit the release on Github and paste the changelog there as well. - -Docker Hub will automatically trigger a build for the new tag, and publish it. - -The `pypi` github workflow will automatically build a source package and a wheel and -publish them on [PyPI](https://pypi.org/project/caluma/). +To release a new version simply head over to [Github +Actions](https://github.com/projectcaluma/caluma/actions/workflows/release.yml) +and trigger the workflow dispatch event on the branch `main`. diff --git a/pyproject.toml b/pyproject.toml index 20c523a53..e2461c799 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -129,6 +129,15 @@ omit = [ ] show_missing = true +[tool.semantic_release] +version_toml = "pyproject.toml:tool.poetry.version" +branch = "main" +upload_to_repository = true +upload_to_release = true +build_command = "poetry build" +commit_subject = "chore(release): v{version}" +commit_author = "github-actions " + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"