name: release # To release this package: # 1. Update the version number and changelog in the source. # Commit and push (to branch main or a vX.Y patch branch), # and wait for tests to complete. # 2. Tag with "vX.Y" or "vX.Y.Z": either create and push tag # directly via git, or create and publish a GitHub release. # # This workflow will run in response to the new tag, and will: # - Verify the source code and git tag version numbers match # - Publish the package to PyPI # - Create or update the release on GitHub on: push: tags: ["v[0-9]*"] workflow_dispatch: jobs: release: runs-on: ubuntu-22.04 environment: release permissions: # `gh release` requires write permission on repo contents contents: write steps: - name: Get code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install build requirements run: | python -m pip install --upgrade build hatch twine - name: Get version # (This will end the workflow if git and source versions don't match.) id: version run: | VERSION="$(python -m hatch version)" TAG="v$VERSION" GIT_TAG="$(git tag -l --points-at "$GITHUB_REF" 'v*')" if [ "x$GIT_TAG" != "x$TAG" ]; then echo "::error ::package version '$TAG' does not match git tag '$GIT_TAG'" exit 1 fi echo "version=$VERSION" >> $GITHUB_OUTPUT echo "tag=$TAG" >> $GITHUB_OUTPUT echo "anchor=${TAG//[^[:alnum:]]/-}" >> $GITHUB_OUTPUT - name: Build run: | rm -rf build dist django_anymail.egg-info python -m build python -m twine check dist/* - name: Publish to PyPI env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} # For test PyPI, set release var PYPI_REPOSITORY_URL=https://test.pypi.org/legacy/. # For production PyPI, leave unset (or set to empty string). TWINE_REPOSITORY_URL: ${{ vars.PYPI_REPOSITORY_URL }} run: | python -m twine upload --disable-progress-bar --non-interactive dist/* - name: Release to GitHub env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ steps.version.outputs.tag }} TITLE: ${{ steps.version.outputs.tag }} NOTES: | [Changelog](https://anymail.dev/en/stable/changelog/#${{ steps.version.outputs.anchor }}) run: | if ! gh release edit "$TAG" --verify-tag --target "$GITHUB_SHA" --title "$TITLE" --notes "$NOTES"; then gh release create "$TAG" --verify-tag --target "$GITHUB_SHA" --title "$TITLE" --notes "$NOTES" fi gh release upload "$TAG" ./dist/*