Skip to content

Release

Release #52

Workflow file for this run

name: Release
on:
push:
tags: ["v*"]
workflow_dispatch:
inputs:
tag:
type: string
description: The tag of the release, leave empty for latest.
required: false
env:
GH_TOKEN: ${{ github.token }}
PIP_DISABLE_PIP_VERSION_CHECK: 1
permissions: write-all
jobs:
prep:
runs-on: windows-latest
outputs:
tag: ${{ steps.determine_tag.outputs.tag }}
message: ${{ steps.determine_tag.outputs.message }}
steps:
- name: Determine Release Tag
id: determine_tag
uses: actions/github-script@v7
with:
debug: true
# noinspection TypeScriptUnresolvedReference
script: |
let tag = context.payload.inputs.tag
if (!tag) {
let refs = await github.rest.git.listMatchingRefs({
owner: context.repo.owner,
repo: context.repo.repo,
ref: "tags/v"
}).data
console.log(JSON.stringify(refs))
let tags = await Promise.all(
refs.map(
async ref => await github.rest.git.getTag({
owner: context.repo.owner,
repo: context.repo.repo,
tag_sha: ref.object.sha
}).data
)
).sort(tag => Date.parse(tag.tagger.date))
tag = tags[tags.length - 1]
}
console.log(`Using tag: ${tag.tag}`)
core.setOutput("tag", tag.tag)
core.setOutput("message", tag.message)
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ steps.determine_tag.outputs.tag }}
- name: Validate Tag
uses: actions/github-script@v7
with:
# noinspection TypeScriptUnresolvedReference
script: |
const version_pattern = new RegExp("version\s*=\s*\"(?<version>[^\"]+])\"")
const tag = ""
if (tag[0] != "v") {
core.setFailed("Invalid version tag: must be \"v*.*.*\".")
return
}
const fs = require("node:fs")
const readline = require("node:readline")
for await (const line of readline.createInterface({
input: fs.createReadStream("pyproject.toml"),
crlfDelay: Infinity
})) {
const match = line.match(version_pattern)
if (match) {
if (tag.substring(1) != match.groups.version)
core.setFailed("Tag doesn't match the version defined in pyproject.toml")
return
}
}
codegen:
name: Codegen
needs: prep
uses: ./.github/workflows/codegen.yml
with:
ref: ${{ needs.prep.outputs.tag }}
source_dists:
name: Source Dists
runs-on: windows-latest
needs: [codegen, prep]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ needs.prep.outputs.tag }}
- name: Download Codegen Output
uses: actions/download-artifact@v4
with:
name: codegen_results
path: src/spatium
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: 3.12
- name: Install Dependencies
run: pip install -r requirements.txt
- name: Build
run: python setup.py sdist --formats=gztar,zip
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: src_dists
path: dist/
binary_dists:
name: Binary Dists
runs-on: ${{ matrix.platform }}
needs: [codegen, prep]
strategy:
fail-fast: true
matrix:
python: ["cp39", "cp310", "cp311", "cp312", "pp39", "pp310"]
platform: ["windows-latest", "ubuntu-latest", "macos-latest"]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ needs.prep.outputs.tag }}
- name: Download Codegen Output
uses: actions/download-artifact@v4
with:
name: codegen_results
path: src/spatium
- name: CIBuildWheel
uses: pypa/[email protected]
with:
output-dir: dist
env:
CIBW_BUILD: "${{ matrix.python }}-*"
# - name: Upload
# shell: pwsh
# run: |
# foreach ($file in (Get-ChildItem dist/*)) {
# gh release upload "${{ github.ref_name }}" "$($file.FullName)"
# }
- name: Upload to Artifacts
uses: actions/upload-artifact@v4
with:
name: bin_dists
path: dist/
github_release:
name: "GitHub Release"
runs-on: ubuntu-latest
needs: [source_dists, prep]
steps:
# - name: Checkout
# uses: actions/checkout@v4
- name: Download Artifacts
uses: actions/download-artifact@v4
with:
name: src_dists
path: dist
- name: Remove Prior Release
run: gh release delete "${{ needs.prep.outputs.tag }}"
continue-on-error: true
- name: Create Release
run: gh release create "${{ needs.prep.outputs.tag }}" --verify-tag --title "${{ needs.prep.outputs.tag }}" --notes "${{ needs.prep.outputs.message }}" --draft
- name: Upload
shell: pwsh
run: |
foreach ($file in (Get-ChildItem dist/*)) {
gh release upload "${{ needs.prep.outputs.tag }}" "$($file.FullName)"
}
- name: Publish
run: gh release edit ${{ needs.prep.outputs.tag }} --draft=false
pypi_upload:
name: "PyPI Upload"
runs-on: ubuntu-latest
needs: [source_dists, binary_dists]
permissions:
id-token: write # pypi trusted publishing
steps:
# - name: Checkout
# uses: actions/checkout@v4
- run: mkdir dist
- name: Download Artifacts
uses: actions/download-artifact@v4
with:
pattern: "*dists"
path: dist
merge-multiple: true
- name: Delete Redundant Source Dist
shell: pwsh
# only keep .tar.gz
run: rm dist/*.zip
# use trusted publishing
- name: Upload
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/