Skip to content

Production hardening & animated startup/exit #2

Production hardening & animated startup/exit

Production hardening & animated startup/exit #2

name: Windows Release Package
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'Existing git tag to attach assets to (e.g., v1.2.3)'
required: true
type: string
permissions:
contents: write
concurrency:
group: windows-release-${{ github.event.release.id || github.run_id }}
cancel-in-progress: false
env:
CARGO_TERM_COLOR: always
jobs:
build-and-attach-windows-artifacts:
if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
runs-on: windows-latest
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install stable Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Validate manual tag input
if: ${{ github.event_name == 'workflow_dispatch' }}
shell: pwsh
run: |
$tag = "${{ inputs.tag }}"
if ([string]::IsNullOrWhiteSpace($tag)) {
throw "Input 'tag' is required for manual runs."
}
git rev-parse --verify "refs/tags/$tag" | Out-Null
- name: Install Inno Setup
shell: pwsh
run: choco install innosetup --no-progress -y
- name: Build Windows package
shell: pwsh
run: .\build-windows-package.ps1
- name: Validate release artifacts
shell: pwsh
run: |
$zipPath = "dist/chatify-windows-x64.zip"
$shaPath = "dist/chatify-windows-x64.zip.sha256"
$setup = Get-ChildItem -Path dist -Filter "chatify-setup-*.exe" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (-not (Test-Path -Path $zipPath)) {
throw "Missing artifact: $zipPath"
}
if (-not (Test-Path -Path $shaPath)) {
throw "Missing checksum: $shaPath"
}
# Validate checksum file matches the generated zip checksum.
$expectedHash = (Get-Content -Path $shaPath | Select-Object -First 1).Split(' ')[0].Trim().ToLowerInvariant()
if ([string]::IsNullOrWhiteSpace($expectedHash)) {
throw "Checksum file is empty or invalid: $shaPath"
}
$actualHash = (Get-FileHash -Path $zipPath -Algorithm SHA256).Hash.Trim().ToLowerInvariant()
if ($actualHash -ne $expectedHash) {
throw "Checksum mismatch for $zipPath. Expected $expectedHash but got $actualHash"
}
if (-not $setup) {
throw "Missing installer artifact matching dist/chatify-setup-*.exe"
}
$setupPath = $setup.FullName
$setupShaPath = "$setupPath.sha256"
if (-not (Test-Path -Path $setupShaPath)) {
throw "Missing installer checksum: $setupShaPath"
}
$expectedSetupHash = (Get-Content -Path $setupShaPath | Select-Object -First 1).Split(' ')[0].Trim().ToLowerInvariant()
if ([string]::IsNullOrWhiteSpace($expectedSetupHash)) {
throw "Installer checksum file is empty or invalid: $setupShaPath"
}
$actualSetupHash = (Get-FileHash -Path $setupPath -Algorithm SHA256).Hash.Trim().ToLowerInvariant()
if ($actualSetupHash -ne $expectedSetupHash) {
throw "Checksum mismatch for $setupPath. Expected $expectedSetupHash but got $actualSetupHash"
}
- name: Upload package as release asset
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.release.tag_name || inputs.tag }}
fail_on_unmatched_files: true
files: |
dist/chatify-windows-x64.zip
dist/chatify-windows-x64.zip.sha256
dist/chatify-setup-*.exe
dist/chatify-setup-*.exe.sha256
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}