# Quick release-pipeline checks without a Rust build: workflow and packaging-script syntax, # Linux desktop metadata, and the Windows desktop-shortcut installer lifecycle. name: Packaging lint on: push: branches: [main, release] paths: [".github/workflows/**", "packaging/**", "assets/app-icon/**"] pull_request: paths: [".github/workflows/**", "packaging/**", "assets/app-icon/**"] workflow_dispatch: permissions: contents: read concurrency: group: packaging-lint-${{ github.ref }} cancel-in-progress: true jobs: lint: runs-on: ubuntu-latest env: ACTIONLINT_VERSION: 1.7.12 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Install tools run: | sudo apt-get update sudo apt-get install -y --no-install-recommends shellcheck desktop-file-utils appstream libxml2-utils python3-yaml curl -fsSL "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" \ | tar -xz -C "$RUNNER_TEMP" actionlint - name: actionlint run: | "$RUNNER_TEMP/actionlint" -color - name: shellcheck run: shellcheck packaging/*.sh packaging/*/*.sh - name: PowerShell shell: pwsh run: | foreach ($f in Get-ChildItem packaging/windows/*.ps1) { $errors = $null [System.Management.Automation.Language.Parser]::ParseFile($f.FullName, [ref]$null, [ref]$errors) | Out-Null if ($errors) { $errors | ForEach-Object { Write-Output "::error file=$($f.Name)::$_" }; exit 1 } Write-Output "ok $($f.Name)" } - name: XML, desktop entry, AppStream, Flatpak manifest run: | xmllint --noout packaging/windows/gridcraft.wxs packaging/macos/*.plist* packaging/linux/*.xml* # Windows Installer needs Icon ids ending in .ico or .exe, or shortcuts show a blank icon. if grep -oE '"$RUNNER_TEMP/ai.storyteller.gridcraft.metainfo.xml" appstreamcli validate --no-net --explain "$RUNNER_TEMP/ai.storyteller.gridcraft.metainfo.xml" python3 - <<'EOF' import yaml src = yaml.safe_load(open("packaging/linux/flatpak/ai.storyteller.gridcraft.yml")) bundle = yaml.safe_load(open("packaging/linux/flatpak/ai.storyteller.gridcraft.bundle.yml")) for m in (src, bundle): assert m["id"] == "ai.storyteller.gridcraft" and m["command"] == "gridcraft", m["id"] for key in ("runtime", "runtime-version", "sdk", "finish-args"): assert src[key] == bundle[key], f"Flatpak manifests disagree on {key}: {src[key]} vs {bundle[key]}" print("Flatpak manifests ok") EOF desktop-shortcut: name: Windows desktop shortcut smoke runs-on: windows-latest timeout-minutes: 10 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Build fixture MSIs and test shortcut lifecycle shell: pwsh run: | dotnet tool install --tool-path "$env:RUNNER_TEMP\wix" wix --version 5.0.2 if ($LASTEXITCODE -ne 0) { throw 'Could not install WiX' } $env:PATH = "$env:RUNNER_TEMP\wix;$env:PATH" ./packaging/windows/test-desktop-shortcut.ps1 - name: Capture native MSI dialog previews shell: pwsh run: | pwsh -NoProfile -STA -File ./packaging/windows/preview-installer-dialogs.ps1 ` -Msi "$env:RUNNER_TEMP\gridcraft-shortcut-smoke\gridcraft-90.0.0.msi" ` -OutputDir "$env:RUNNER_TEMP\gridcraft-shortcut-smoke\dialogs" if ($LASTEXITCODE -ne 0) { throw 'Native MSI dialog preview failed' } - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 if: always() with: name: desktop-shortcut-msi-evidence path: | ${{ runner.temp }}/gridcraft-shortcut-smoke/*.log ${{ runner.temp }}/gridcraft-shortcut-smoke/dialogs/* if-no-files-found: ignore retention-days: 7