flash555588_ai-model-workbench/.github/workflows/release.yml
2026-06-25 23:10:49 +08:00

125 lines
3.6 KiB
YAML

name: Release
on:
push:
tags:
- "*.*.*"
workflow_dispatch:
inputs:
tag:
description: "Release tag to publish, for example 0.5.5"
required: false
permissions:
contents: write
id-token: write
attestations: write
jobs:
release:
name: Build and publish Obsidian assets
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm install
- name: Typecheck
run: npm run typecheck
- name: Lint
run: npm run lint
- name: Verify knowledge index
run: npm run verify:knowledge-index
- name: Verify diagnostics
run: npm run verify:diagnostics
- name: Build
run: npm run build
- name: Verify release assets
run: npm run verify:release
- name: Prepare release notes
run: |
mkdir -p .tmp
VERSION="$(node -p "require('./manifest.json').version")"
NOTES="docs/release-notes/${VERSION}.md"
if [[ -f "${NOTES}" ]]; then
cat "${NOTES}" > .tmp/release-notes.md
printf "\n\n---\n\n" >> .tmp/release-notes.md
else
printf "# AI Model Workbench ${VERSION}\n\n" > .tmp/release-notes.md
fi
node scripts/verify-release-assets.mjs --format markdown >> .tmp/release-notes.md
- name: Attest release assets
uses: actions/attest@v4
with:
subject-path: |
main.js
manifest.json
styles.css
- name: Resolve release metadata
id: release_meta
shell: bash
run: |
VERSION="$(node -p "require('./manifest.json').version")"
TAG="${GITHUB_REF_NAME}"
if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then
TAG="${{ inputs.tag }}"
if [[ -z "${TAG}" ]]; then
TAG="${VERSION}"
fi
fi
TAG_VERSION="${TAG}"
if [[ "${TAG_VERSION}" != "${VERSION}" ]]; then
echo "Tag ${TAG} does not match manifest version ${VERSION}" >&2
exit 1
fi
{
echo "version=${VERSION}"
echo "tag=${TAG}"
} >> "$GITHUB_OUTPUT"
- name: Create release if needed
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.release_meta.outputs.tag }}
VERSION: ${{ steps.release_meta.outputs.version }}
run: |
gh release view "$TAG" >/dev/null 2>&1 || \
gh release create "$TAG" \
--title "AI Model Workbench ${VERSION}" \
--notes-file .tmp/release-notes.md
gh release edit "$TAG" \
--title "AI Model Workbench ${VERSION}" \
--notes-file .tmp/release-notes.md
- name: Remove unsupported release assets
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.release_meta.outputs.tag }}
run: |
for asset_id in $(gh api "repos/${GITHUB_REPOSITORY}/releases/tags/${TAG}" --jq '.assets[] | select((.name == "main.js" or .name == "manifest.json" or .name == "styles.css") | not) | .id'); do
gh api --method DELETE "repos/${GITHUB_REPOSITORY}/releases/assets/${asset_id}"
done
- name: Upload supported release assets
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.release_meta.outputs.tag }}
run: |
gh release upload "$TAG" main.js manifest.json styles.css --clobber