Release #50
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: 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.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/ |