Skip to content

Publish to PyPI when a GitHub release is published #214

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Feb 6, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 37 additions & 103 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -1,114 +1,48 @@
name: Release
on:
push:
branches: [ release ]

concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
on:
release:
types: [released]

env:
PYTHON_RUNTIME_VERSION: "3.11"
PYTHON_PACKAGE_NAME: netboxlabs-netbox-branching
permissions:
contents: read

jobs:
get-package-name:
name: Get package name
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Python package name
id: package-name
run: echo "package-name=${{ env.PYTHON_PACKAGE_NAME }}" >> "$GITHUB_OUTPUT"
outputs:
package-name: ${{ steps.package-name.outputs.package-name }}
get-next-version:
name: Get next version
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Set short sha output
id: short-sha
run: echo "short-sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
- name: Set release version
id: release-version
run: |
pip install toml-cli
release_version=`toml get --toml-path pyproject.toml project.version`
echo "Release version: $release_version"
echo "release-version=$release_version" >> "$GITHUB_OUTPUT"
outputs:
short-sha: ${{ steps.short-sha.outputs.short-sha }}
release-version: ${{ steps.release-version.outputs.release-version }}
get-release-notes:
name: Get release notes
build:
name: Build distribution
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Set release notes
id: release-notes
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
echo 'release-notes<<EOF' >> $GITHUB_OUTPUT
echo $PR_BODY >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
outputs:
release-notes: ${{ steps.release-notes.outputs.release-notes }}
build:
name: Build
needs: [ get-package-name, get-next-version, get-release-notes ]
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install pypa/build
run: |
python3 -m pip install build
- name: Build distribution package
run: |
python3 -m build
- name: Upload distribution package
uses: actions/upload-artifact@v4
with:
name: python-package-distributions
path: dist/
if-no-files-found: error

publish:
name: Publish to PyPI
needs:
- build
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
id-token: write
contents: read
env:
BUILD_VERSION: ${{ needs.get-next-version.outputs.release-version }}
BUILD_TRACK: release
BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }}
OUTPUT_FILENAME: ${{ needs.get-package-name.outputs.package-name }}-${{ needs.get-next-version.outputs.release-version }}.tar.gz
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_RUNTIME_VERSION }}
- name: Build sdist package
run: |
python3 -m pip install --upgrade build
python3 -m build --sdist --outdir dist/
- name: Replace underscores with hyphens in build filename
run: |
BUILD_FILENAME=$(ls dist/ | grep tar.gz)
mv dist/$BUILD_FILENAME dist/${{ env.OUTPUT_FILENAME }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.OUTPUT_FILENAME }}
path: dist/${{ env.OUTPUT_FILENAME }}
retention-days: 30
if-no-files-found: error
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist
release:
name: Release
needs: [ get-next-version, get-release-notes, build ]
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Create release
id: create_release
uses: actions/create-release@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ needs.get-next-version.outputs.release-version }}
release_name: ${{ needs.get-next-version.outputs.release-version }}
body: ${{ needs.get-release-notes.outputs.release-notes }}
draft: false
- name: Download distribution package
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Publish distribution to PyPI
uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4