c428661601
Phases 3, 4, 5, 6 of the multi-platform distribution plan. ## create-release.yml rewrite - Replace deprecated actions/create-release@v1 + upload-release-asset@v1 with softprops/action-gh-release@v2 (SHA-pinned) - Expand build-desktop matrix: macos-13 (Intel), macos-14 (ARM), windows-latest, ubuntu-latest × 2 legs (deb+rpm, AppImage+tar.gz) - Each matrix job uploads directly to release (no artifact round-trip — saves ~10 min + 1.5GB transfer per run) - Inline portable archives: Windows .zip via 7z, Linux .tar.gz via tar - linuxdeploy SHA-verified fetch for AppImage builds (not `continuous` tag) - Per-asset size budget: hard fail at 1 GB per asset - prerelease inferred from tag regex (-rc|-beta|-alpha|-dev|-snapshot) - workflow_dispatch dry_run input: builds all assets without publishing, skips Android + bump workflows - Tag-vs-libs.versions.toml assertion as first step in each matrix job - Android + Quartz jobs preserved; migrated to softprops/action-gh-release@v2 ## Package manager bump workflows (Homebrew + Winget) - .github/workflows/bump-homebrew.yml — macauley/action-homebrew-bump-cask on ubuntu-latest (saves macOS runner quota). Cask name: `amethyst-nostr`. - .github/workflows/bump-winget.yml — vedantmgoyal9/winget-releaser on windows-latest. PackageIdentifier: `VitorPamplona.Amethyst`. - Shared composite action .github/actions/assert-stable-release rejects draft/prerelease/malformed-tag releases at action boundary (defense in depth vs workflow-level `if:` alone). - Both workflows auto-open `release-ops`-labeled GH Issues on failure. - Concurrency groups per tag prevent re-fire races. - AUR + Scoop deferred to follow-up PR (unresolved ownership questions). ## Documentation - BUILDING.md: per-platform build commands, asset naming contract, release runbook, bootstrap runbook, troubleshooting, uninstall paths, incident response, fallback plans (macos-13 retirement, Homebrew Sept 2026 deadline) - README: expanded Download section with per-OS install matrix for 7 formats + 2 package managers. Deploying section points at BUILDING.md. ## Supply chain - .github/dependabot.yml: monthly bumps for github-actions ecosystem - All new third-party actions SHA-pinned: - softprops/action-gh-release v2.6.2 - macauley/action-homebrew-bump-cask v4.0.0 - vedantmgoyal9/winget-releaser v2 - nick-fields/retry v3.0.2 - linuxdeploy binary SHA256-verified against pinned release tag
45 lines
1.6 KiB
YAML
45 lines
1.6 KiB
YAML
name: Assert Stable Release
|
|
description: >-
|
|
Defense-in-depth guard for package-manager bump workflows. Re-validates
|
|
tag format, prerelease flag, and draft status before invoking third-party
|
|
actions that hold write credentials to external package manager repos
|
|
(Homebrew, Winget, AUR, Scoop). Prevents RC builds from reaching stable
|
|
channels even if the `release.released` event gating is bypassed.
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Assert release is stable
|
|
shell: bash
|
|
env:
|
|
TAG: ${{ github.event.release.tag_name }}
|
|
IS_PRERELEASE: ${{ github.event.release.prerelease }}
|
|
IS_DRAFT: ${{ github.event.release.draft }}
|
|
run: |
|
|
set -euo pipefail
|
|
echo "tag=$TAG prerelease=$IS_PRERELEASE draft=$IS_DRAFT"
|
|
|
|
# Reject prerelease suffix even if GitHub's flag says false.
|
|
if [[ "$TAG" =~ -(rc|beta|alpha|dev|snapshot) ]]; then
|
|
echo "::error::Tag $TAG contains prerelease suffix; refusing bump"
|
|
exit 1
|
|
fi
|
|
|
|
# Enforce strict vMAJOR.MINOR.PATCH format.
|
|
if ! [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "::error::Tag $TAG does not match vMAJOR.MINOR.PATCH"
|
|
exit 1
|
|
fi
|
|
|
|
# Draft releases must never trigger bumps.
|
|
if [[ "$IS_DRAFT" == "true" ]]; then
|
|
echo "::error::Release is draft; refusing bump"
|
|
exit 1
|
|
fi
|
|
|
|
# Prerelease flag cross-check (belt-and-suspenders with workflow-level `if:`).
|
|
if [[ "$IS_PRERELEASE" == "true" ]]; then
|
|
echo "::error::Release is prerelease; refusing bump"
|
|
exit 1
|
|
fi
|