Debug release.yml #64
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: | |
# FIXME: DEBUG ONLY, REMOVE AFTERWARD | |
# push: | |
# tags: ["v*"] | |
push: | |
paths: | |
- ".github/workflows/release.yml" | |
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: | | |
const specified_tag = context.payload.inputs && context.payload.inputs.tag | |
let tag = undefined | |
let commit = undefined | |
for await (const tags of github.paginate.iterator( | |
github.rest.repos.listTags, | |
{ | |
owner: context.repo.owner, | |
repo: context.repo.repo | |
} | |
)) { | |
for (const tag_data of tags.data) { | |
core.info(`Checking tag ${tag_data.name}`) | |
const commit_data = (await github.rest.repos.getCommit({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref: tag_data.commit.sha | |
})).data.commit | |
if (specified_tag) { | |
if (tag_data.name == context.payload.inputs.tag) { | |
tag = tag_data | |
commit = commit_data | |
} | |
} else { | |
if (tag == undefined || Date.parse(commit_data.committer.date) > Date.parse(commit.committer.date)) { | |
tag = tag_data | |
commit = commit_data | |
} | |
} | |
} | |
} | |
if (tag == undefined) { | |
core.setFailed("Failed to determine a tag.") | |
return | |
} | |
core.info(`Using tag: ${tag.name}`) | |
core.info(`Message: ${commit.message}`) | |
core.notice(`Using tag: ${tag.name}`) | |
core.setOutput("tag", tag.name) | |
core.setOutput("message", commit.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) { | |
core.info(`Version from pyproject.toml: ${match.groups.version}`) | |
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/ |