diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..938f56a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,85 @@ +name: Publish Python 🐍 distribution 📦 to PyPI + +on: push + +jobs: + build: + name: Build distribution 📦 + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v3 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: >- + Publish Python 🐍 distribution 📦 to PyPI + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/sphinx-autoapi + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + github-release: + name: >- + Sign the Python 🐍 distribution 📦 with Sigstore + and upload them to GitHub Release + needs: + - publish-to-pypi + runs-on: ubuntu-latest + + permissions: + contents: write # IMPORTANT: mandatory for making GitHub Releases + id-token: write # IMPORTANT: mandatory for sigstore + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: python-package-distributions + path: dist/ + - name: Sign the dists with Sigstore + uses: sigstore/gh-action-sigstore-python@v1.2.3 + with: + inputs: >- + ./dist/*.tar.gz + ./dist/*.whl + - name: Upload artifact signatures to GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + # Upload to GitHub Release using the `gh` CLI. + # `dist/` contains the built packages, and the + # sigstore-produced signatures and certificates. + run: >- + gh release upload + '${{ github.ref_name }}' dist/** + --repo '${{ github.repository }}' \ No newline at end of file diff --git a/docs/changes/388.misc b/docs/changes/388.misc new file mode 100644 index 0000000..8774744 --- /dev/null +++ b/docs/changes/388.misc @@ -0,0 +1 @@ +Implemented automatic uploading to PyPI \ No newline at end of file diff --git a/docs/maintenance/release-process.rst b/docs/maintenance/release-process.rst index b80cffc..502ce5b 100644 --- a/docs/maintenance/release-process.rst +++ b/docs/maintenance/release-process.rst @@ -22,9 +22,7 @@ Preparation Release ------- -.. code-block:: bash - - git clean -idx - tox -e release - git tag vX.X.X - git push --tags +Create a new release in github that tags the commit +and uses the built release notes as the description. +The tag created by the release will trigger the github actions to +build and upload the package to PyPI. \ No newline at end of file diff --git a/tox.ini b/tox.ini index def0d59..fc1f383 100644 --- a/tox.ini +++ b/tox.ini @@ -60,14 +60,4 @@ deps = towncrier importlib-resources<6 # pinned due to https://github.com/twisted/towncrier/issues/528 commands = - towncrier {posargs:check} - -[testenv:release] -skip_install = true -deps = - build - twine -commands = - python -c "import shutil, os; os.path.isdir('dist') and shutil.rmtree('dist')" - python -m build - twine upload dist/* + towncrier {posargs:check} \ No newline at end of file