Skip to content

Publish to GitHub & PyPI #5

Publish to GitHub & PyPI

Publish to GitHub & PyPI #5

---
name: Publish package
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:
pypi-version:
name: Update package version
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@v3
with:
fetch-depth: 0
token: ${{ secrets.TEK_OPENSOURCE_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: x
check-latest: true
- name: Check for unreleased entries in the Changelog
run: python scripts/check_unreleased_changelog_items.py
- name: Copy Changelog to template directory
run: cp CHANGELOG.md python_semantic_release_templates/.previous_changelog_for_template.md
- name: Python Semantic Release
id: release
uses: python-semantic-release/[email protected]
with:
root_options: --verbose --strict
force: ${{ inputs.release_level }}
github_token: ${{ secrets.GITHUB_TOKEN }}
git_committer_name: Tektronix
git_committer_email: [email protected]
ssh_public_signing_key: ${{ secrets.TEK_OPENSOURCE_PUBLIC_KEY }}
ssh_private_signing_key: ${{ secrets.TEK_OPENSOURCE_PRIVATE_KEY }}
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@v3
with:
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@v3
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@v3
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
steps:
- name: Download built packages
uses: actions/download-artifact@v3
with:
name: Packages
path: dist
- name: Publish package distributions to GitHub Releases
uses: python-semantic-release/upload-to-gh-release@main
with:
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@v4
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@v2
with:
timeout_minutes: 2
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 }}