From bd2040551bc3a279aa5a9459b8990a9eb95f98f7 Mon Sep 17 00:00:00 2001 From: Florian Frantzen Date: Mon, 21 Oct 2024 12:47:28 +0200 Subject: [PATCH] Automatic distribution to PyPI and TestPyPI --- .github/release.yml | 4 ++ .github/workflows/deploy.yml | 102 +++++++++++++++++++++++++++++++++++ pyproject.toml | 14 +++-- 3 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 .github/release.yml create mode 100644 .github/workflows/deploy.yml diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..ddb3e480 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,4 @@ +changelog: + exclude: + authors: + - dependabot diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..db377dfb --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,102 @@ +name: Publish to PyPI and TestPyPI + +on: push + +jobs: + build: + name: Build Distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get history and tags for SCM versioning to work + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + run: | + git fetch --prune --unshallow + git tag -d $(git tag --points-at HEAD) + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Install pypa/build + run: 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@v4 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: Publish 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/TopoModelX + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + github-release: + name: Sign and Upload as GitHub Release + needs: [publish-to-pypi] + runs-on: ubuntu-latest + + permissions: + contents: write + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Sign the dists with Sigstore + uses: sigstore/gh-action-sigstore-python@v3.0.0 + with: + inputs: >- + ./dist/*.tar.gz + ./dist/*.whl + - name: Create GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + run: gh release create '${{ github.ref_name }}' --repo '${{ github.repository }}' --notes "" + - name: Upload artifact signatures to GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + run: gh release upload '${{ github.ref_name }}' dist/** --repo '${{ github.repository }}' + + publish-to-testpypi: + name: Publish to TestPyPI + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + needs: [build] + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/TopoModelX + + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ diff --git a/pyproject.toml b/pyproject.toml index c5b69fc9..e5663631 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools", "wheel"] +requires = ["setuptools", "setuptools_scm"] build-backend = "setuptools.build_meta" [project] @@ -103,14 +103,12 @@ convention = "numpy" [tool.ruff.per-file-ignores] "__init__.py" = ["F403"] -[tool.setuptools.dynamic] -version = {attr = "topomodelx.__version__"} - [tool.setuptools.packages.find] -include = [ - "topomodelx", - "topomodelx.*" -] +include = ["topomodelx"] + +[tool.setuptools_scm] +local_scheme = "no-local-version" +version_file = "topomodelx/_version.py" [tool.mypy] warn_redundant_casts = true