Publish specified tags of Spine packages #58
Workflow file for this run
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 specified tags of Spine packages | |
on: | |
workflow_dispatch: | |
inputs: | |
Spine-Toolbox: | |
description: Git tag to use for 'Spine-Toolbox' | |
type: string | |
default: 'skip' | |
spine-items: | |
description: Git tag to use for 'spine-items' | |
type: string | |
default: 'skip' | |
spine-engine: | |
description: Git tag to use for 'spine-engine' | |
type: string | |
default: 'skip' | |
Spine-Database-API: | |
description: Git tag to use for 'Spine-Database-API' | |
type: string | |
default: 'skip' | |
jobs: | |
build: | |
strategy: | |
matrix: | |
pkg: ['Spine-Database-API', 'spine-engine', 'spine-items', 'Spine-Toolbox'] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout ${{ matrix.pkg }} for publishing | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: actions/checkout@v4 | |
with: | |
repository: 'spine-tools/${{ matrix.pkg }}' | |
path: ${{ matrix.pkg }} | |
ref: ${{ inputs[matrix.pkg] }} | |
- name: Checkout ${{ matrix.pkg }} for testing only | |
if: ${{ inputs[matrix.pkg] == 'skip' }} | |
uses: actions/checkout@v4 | |
with: | |
repository: 'spine-tools/${{ matrix.pkg }}' | |
path: ${{ matrix.pkg }} | |
- name: Ensure Git checkout is not dirty | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: cd ${{ matrix.pkg }} && git describe --tags --dirty | grep -vE '[-]dirty$' | |
- name: Ensure Git checkout does not have additional commits | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: cd ${{ matrix.pkg }} && git describe --tags | grep -vE '[-]g[a-z0-9]{8}$' | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.8' | |
- name: Install dependencies | |
run: | | |
python -m pip install --upgrade pip | |
python -m pip install build | |
- name: Build | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: | | |
python -m build ${{ matrix.pkg }} | |
- name: Download wheels for packages excluded from build | |
if: ${{ inputs[matrix.pkg] == 'skip' }} | |
run: | | |
mkdir -p ${{ matrix.pkg }}/dist/ | |
sed -nEe 's/name[ ]*=[ ]*"?([a-z0-9_-]+)"?/\1/p' ${{ matrix.pkg }}/pyproject.toml > pkgname | |
python -m pip download --no-deps --python-version 3.8.1 \ | |
--dest ${{ matrix.pkg }}/dist/ $(cat pkgname) | |
- name: Save ${{ matrix.pkg }} wheel | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.pkg }} | |
path: ${{ matrix.pkg }}/dist/* | |
retention-days: 7 | |
test: | |
needs: build | |
strategy: | |
matrix: | |
pkg: ['Spine-Database-API', 'spine-engine', 'spine-items', 'Spine-Toolbox'] | |
os: [ubuntu-latest, windows-latest] | |
python: ["3.8", "3.9", "3.10", "3.11"] | |
fail-fast: false | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Make dist directory | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: mkdir -p dist | |
- name: Download all wheels | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Checkout ${{ matrix.pkg }} | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: actions/checkout@v4 | |
with: | |
repository: 'spine-tools/${{ matrix.pkg }}' | |
path: ${{ matrix.pkg }} | |
ref: ${{ inputs[matrix.pkg] }} | |
- name: Set up Python ${{ matrix.python }} | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Upgrade Pip and install pytest | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: | | |
python -m pip install --upgrade pip | |
python -m pip install pytest | |
- name: Built wheels on *NIX | |
if: ${{ inputs[matrix.pkg] != 'skip' && runner.os != 'Windows' }} | |
run: | | |
ls dist | |
python -m pip install dist/*/*.whl | |
- name: Built wheels on Windows | |
if: ${{ inputs[matrix.pkg] != 'skip' && runner.os == 'Windows' }} | |
run: | | |
Get-ChildItem ./dist/*.whl -Recurse | ForEach-Object {python -m pip install $_} | |
- name: Install additional packages for Linux | |
if: ${{ inputs[matrix.pkg] != 'skip' && runner.os == 'Linux' }} | |
run: | | |
sudo apt-get update -y | |
sudo apt-get install -y libegl1 | |
- name: Remove source from checkouts for *NIX | |
if: ${{ inputs[matrix.pkg] != 'skip' && runner.os != 'Windows' }} | |
run: | | |
rm -rf Spine-Toolbox/spinetoolbox* spine-items/spine_items \ | |
spine-engine/spine_engine Spine-Database-API/spinedb_api | |
- name: Remove source from checkouts for Windows | |
if: ${{ inputs[matrix.pkg] != 'skip' && runner.os == 'Windows' }} | |
run: | | |
Remove-Item Spine-Toolbox\spinetoolbox* -Recurse -Force -ErrorAction Ignore | |
Remove-Item spine-items\spine_items -Recurse -Force -ErrorAction Ignore | |
Remove-Item spine-engine\spine_engine -Recurse -Force -ErrorAction Ignore | |
Remove-Item Spine-Database-API\spinedb_api -Recurse -Force -ErrorAction Ignore | |
- name: Test wheels | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
env: | |
QT_QPA_PLATFORM: offscreen | |
run: | | |
python -m unittest discover -s ${{ matrix.pkg }} --verbose | |
- name: Execution tests | |
if: ${{ inputs[matrix.pkg] != 'skip' && matrix.pkg == 'Spine-Toolbox' }} | |
run: | | |
python -m unittest discover -s ${{ matrix.pkg }} --pattern execution_test.py --verbose | |
publish: | |
needs: test | |
strategy: | |
matrix: | |
pkg: ['Spine-Database-API', 'spine-engine', 'spine-items', 'Spine-Toolbox'] | |
runs-on: ubuntu-latest | |
environment: | |
name: pypi | |
url: https://pypi.org/p/${{ steps.package_name.outputs.name }} | |
permissions: | |
id-token: write | |
steps: | |
- name: Make dist directory | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: mkdir -p dist | |
- name: Download package wheel | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ matrix.pkg }} | |
path: dist | |
- id: package_name | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
run: | | |
echo name=$(ls dist | awk -F'[-]' '{print $1}') >> $GITHUB_OUTPUT | |
- name: Publish to PyPI using trusted publishing | |
if: ${{ inputs[matrix.pkg] != 'skip' }} | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
# with: | |
# repository-url: https://test.pypi.org/legacy/ | |
# packages-dir: dist/ | |
# skip-existing: true | |
# verify-metadata: false |