name: Release on: push: tags: - 'v*.*.*' jobs: release: name: Build installer + publish release runs-on: windows-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Verify version matches tag shell: pwsh run: | $tag = "${{ gitea.ref_name }}" $expected = $tag.TrimStart('v') $actual = (Get-Content package.json | ConvertFrom-Json).version if ($expected -ne $actual) { Write-Error "Tag $tag does not match package.json version $actual" exit 1 } Write-Host "Version match: $actual" - name: Typecheck run: npm run typecheck - name: Run unit tests run: npm run test:run - name: Build NSIS installer run: npm run dist env: # electron-builder uses this when --publish flag is set; we publish # to a Gitea release manually below to avoid hard-coupling. GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Generate release notes from commits id: notes shell: pwsh run: | $tag = "${{ gitea.ref_name }}" $prev = git describe --tags --abbrev=0 "$tag^" 2>$null if ($prev) { $log = git log --pretty=format:"- %s" "$prev..$tag" } else { $log = git log --pretty=format:"- %s" "$tag" } $notes = "### Изменения`n`n$log`n`n---`n`nУстановщик ниже — запустить и следовать мастеру. Если приложение уже стояло — обновится поверх с сохранением настроек." $encoded = $notes -replace "`r?`n", "%0A" "notes=$encoded" | Out-File -FilePath $env:GITEA_OUTPUT -Append - name: Create Gitea release with artifacts uses: akkuman/gitea-release-action@v1 with: server_url: ${{ gitea.server_url }} token: ${{ secrets.GITEA_TOKEN }} name: 'Exercise Reminder ${{ gitea.ref_name }}' body: ${{ steps.notes.outputs.notes }} files: | release/Exercise-Reminder-Setup-*.exe release/Exercise-Reminder-Setup-*.exe.blockmap release/latest.yml