Release/v0.6.3 (#68) #27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Publish Python 🐍 distribution 📦 to PyPI | |
| on: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| build: | |
| name: Build distribution 📦 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| 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@v4 | |
| with: | |
| name: python-package-distributions | |
| path: dist/ | |
| publish-to-pypi: | |
| name: >- | |
| Publish Python 🐍 distribution 📦 to PyPI | |
| needs: | |
| - build | |
| runs-on: ubuntu-latest | |
| environment: | |
| name: pypi | |
| url: https://pypi.org/p/cocode | |
| permissions: | |
| id-token: write # IMPORTANT: mandatory for trusted publishing | |
| 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: >- | |
| Test GitHub Release Creation with Changelog | |
| needs: | |
| - build | |
| - publish-to-pypi | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write # IMPORTANT: mandatory for making GitHub Releases | |
| id-token: write # IMPORTANT: mandatory for sigstore | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Extract version from pyproject.toml | |
| id: get_version | |
| run: | | |
| VERSION=$(grep -m 1 'version = ' pyproject.toml | cut -d '"' -f 2) | |
| echo "VERSION=$VERSION" >> $GITHUB_ENV | |
| - name: Extract changelog notes for current version | |
| id: get_changelog | |
| run: | | |
| VERSION=${{ env.VERSION }} | |
| echo "Extracting changelog for version v$VERSION" | |
| # Find the start of the current version section | |
| START_LINE=$(grep -n "## \[v$VERSION\] - " CHANGELOG.md | cut -d: -f1) | |
| if [ -z "$START_LINE" ]; then | |
| echo "Warning: No changelog entry found for version v$VERSION" | |
| echo "CHANGELOG_NOTES=" >> $GITHUB_ENV | |
| exit 0 | |
| fi | |
| # Find the start of the next version section (previous version) | |
| NEXT_VERSION_LINE=$(tail -n +$((START_LINE + 1)) CHANGELOG.md | grep -n "^## \[v.*\] - " | head -1 | cut -d: -f1) | |
| if [ -z "$NEXT_VERSION_LINE" ]; then | |
| # No next version found, extract from current version till end of file | |
| CHANGELOG_CONTENT=$(tail -n +$START_LINE CHANGELOG.md) | |
| else | |
| # Extract content from current version header to before next version | |
| END_LINE=$((START_LINE + NEXT_VERSION_LINE - 1)) | |
| CHANGELOG_CONTENT=$(sed -n "$START_LINE,$((END_LINE - 1))p" CHANGELOG.md) | |
| fi | |
| # Clean up the content but preserve the blank line after the header | |
| # First, get the header line and add a blank line after it | |
| HEADER_LINE=$(echo "$CHANGELOG_CONTENT" | head -1) | |
| CONTENT_LINES=$(echo "$CHANGELOG_CONTENT" | tail -n +2 | sed '/^$/d' | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//') | |
| # Combine header + blank line + content | |
| CHANGELOG_CONTENT=$(printf "%s\n\n%s" "$HEADER_LINE" "$CONTENT_LINES") | |
| # Escape for GitHub Actions | |
| echo "CHANGELOG_NOTES<<EOF" >> $GITHUB_ENV | |
| echo "$CHANGELOG_CONTENT" >> $GITHUB_ENV | |
| echo "EOF" >> $GITHUB_ENV | |
| - 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: | | |
| if [ -n "$CHANGELOG_NOTES" ]; then | |
| gh release create "v$VERSION" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --title "v$VERSION" \ | |
| --notes "$CHANGELOG_NOTES" | |
| else | |
| gh release create "v$VERSION" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --title "v$VERSION" \ | |
| --notes "Release v$VERSION" | |
| fi | |
| - 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 | |
| "v$VERSION" dist/** | |
| --repo "$GITHUB_REPOSITORY" |