Publish to GitHub & PyPI #28
This file contains 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 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 }} |