Skip to content

Debug release.yml

Debug release.yml #61

Workflow file for this run

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: |
console.log(JSON.stringify(context))
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 (context.payload.inputs.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_date
commit = commit_data
}
}
}
}
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/