Skip to content

Publish to GitHub & PyPI #28

Publish to GitHub & PyPI

Publish to GitHub & PyPI #28

---
name: Publish to GitHub & PyPI
on:
workflow_dispatch:
inputs:
release_level:
type: choice
required: true
description: |
Select the release level,
patch for backward compatible minor changes and bug fixes,
minor for backward compatible larger changes,
major for non-backward compatible changes.
options: [patch, minor, major]
concurrency:
group: pypi
jobs:
print-inputs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: x
- name: Check for unreleased entries in the Changelog
run: python scripts/check_unreleased_changelog_items.py
- name: Create summary of workflow inputs and incoming changes
run: |
echo "## Workflow Inputs" >> $GITHUB_STEP_SUMMARY
echo "- release_level: ${{ inputs.release_level }}" >> $GITHUB_STEP_SUMMARY
echo "## Incoming Changes" >> $GITHUB_STEP_SUMMARY
cat python_semantic_release_templates/.previous_release_notes_for_template.md >> $GITHUB_STEP_SUMMARY
# This job requires a Personal Access Token (Classic) with
# the public_repo permission. It also needs a private/public
# ssh key pair that can be used for signing. The public key must
# be attached to the account as an SSH signing key.
pypi-version:
name: Update package version
needs: [print-inputs]
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: package-release-gate
permissions:
id-token: write
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.TEK_OPENSOURCE_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: x
check-latest: true
- name: Check for unreleased entries in the Changelog and copy files to templates
run: |
python scripts/check_unreleased_changelog_items.py
git config --global tag.gpgSign true
- name: Python Semantic Release
uses: python-semantic-release/[email protected]
id: release
with:
force: ${{ inputs.release_level }}
root_options: -v --strict
github_token: ${{ secrets.TEK_OPENSOURCE_TOKEN }}
git_committer_email: ${{ vars.TEK_OPENSOURCE_EMAIL }}
git_committer_name: ${{ vars.TEK_OPENSOURCE_NAME }}
ssh_public_signing_key: ${{ secrets.TEK_OPENSOURCE_SSH_SIGNING_KEY_PUBLIC }}
ssh_private_signing_key: ${{ secrets.TEK_OPENSOURCE_SSH_SIGNING_KEY_PRIVATE }}
outputs:
built-version: ${{ steps.release.outputs.version }}
pypi-build:
name: Build package
needs: [pypi-version]
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: main # Make sure to check out the latest commit on main, not the original commit that triggered the workflow
fetch-depth: 0
- name: Build package
uses: hynek/[email protected]
upload-testpypi:
name: Upload package to TestPyPI
needs: [pypi-build]
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: package-testpypi
permissions:
id-token: write
steps:
- name: Download built packages
uses: actions/download-artifact@v4
with:
name: Packages
path: dist
- name: Upload package to Test PyPI
uses: pypa/[email protected]
with:
repository-url: https://test.pypi.org/legacy/
upload-pypi:
name: Upload package to PyPI
needs: [upload-testpypi]
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: package-release
permissions:
id-token: write
steps:
- name: Download built packages
uses: actions/download-artifact@v4
with:
name: Packages
path: dist
- name: Upload package to PyPI
uses: pypa/[email protected]
upload-github:
name: Upload package to GitHub Release
needs: [upload-pypi]
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
steps:
- uses: actions/checkout@v4
with:
ref: main # Make sure to check out the latest commit on main, not the original commit that triggered the workflow
fetch-depth: 0
- name: Download built packages
uses: actions/download-artifact@v4
with:
name: Packages
path: dist
- name: Publish package distributions to GitHub Releases
uses: python-semantic-release/upload-to-gh-release@main
with:
root_options: -v --strict
github_token: ${{ secrets.GITHUB_TOKEN }}
pypi-install:
name: Install package
needs:
- pypi-version
- pypi-build
- upload-testpypi
- upload-pypi
- upload-github
if: github.repository == 'tektronix/tm_devices' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
index_urls:
- ''
- ' --index-url=https://test.pypi.org/simple/ --extra-index-url=https://pypi.org/simple'
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: x
check-latest: true
- name: Test installing package
# A retry is used to allow for some downtime before the package is installable
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 30
warning_on_retry: false
command: pip install${{ matrix.index_urls }} tm_devices==${{ needs.pypi-version.outputs.built-version }}