Skip to content

feat: implement automated CI/CD release pipeline - #8

Merged
stabldev merged 4 commits into
mainfrom
ci/release-action
Jul 4, 2026
Merged

feat: implement automated CI/CD release pipeline#8
stabldev merged 4 commits into
mainfrom
ci/release-action

Conversation

@stabldev

@stabldev stabldev commented Jul 4, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

Summary of changes

  • New Features

    • Added an automated release workflow that runs on version tag pushes and publishes both an MSIX package and a Windows installer.
    • Installer now supports optional desktop icon creation and optional startup launch.
  • Bug Fixes

    • Updated MSIX packaging to be generated via publish-based output to ensure correct MSIX/AppX contents.
    • Improved release asset handling by extracting the version from the tag and copying the generated MSIX into a versioned release asset.
    • Ensures the app version is applied consistently across released artifacts and installer metadata.

@stabldev
stabldev marked this pull request as ready for review July 4, 2026 13:39
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0903c585-a941-4a33-8db0-fd4c4a0b2eff

📥 Commits

Reviewing files that changed from the base of the PR and between ee7209f and f599a58.

📒 Files selected for processing (1)
  • .github/workflows/release.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/release.yml

📝 Walkthrough

Walkthrough

Adds a tag-triggered release workflow that version-bumps the app manifest, builds MSIX and installer artifacts, and publishes a GitHub Release with both outputs. It also switches the MSIX packaging script to dotnet publish and adds a new Inno Setup installer definition.

Changes

Release Pipeline

Layer / File(s) Summary
Workflow trigger, environment, and versioning
.github/workflows/release.yml
New workflow triggers on v* tag pushes, checks out code, installs .NET SDK 10.0.x, extracts the version from the tag, and updates Package.appxmanifest.
MSIX build and packaging
build-msix.ps1, .github/workflows/release.yml
The MSIX build script now uses dotnet publish with sideload packaging mode, and the workflow runs it, locates the generated .msix, and renames it for release output.
Publish and installer compilation
installer.iss, .github/workflows/release.yml
The workflow publishes a self-contained Win-x64 build and compiles a new Inno Setup installer that defines app metadata, setup options, languages, tasks, files, icons, and post-install launch behavior.
GitHub Release publishing
.github/workflows/release.yml
The workflow creates a GitHub Release and uploads the versioned MSIX and installer executable with generated release notes.

Estimated code review effort: 2 (Simple) | ~12 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding an automated release pipeline.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/release-action

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
installer.iss (2)

31-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant explicit file entry.

Line 31 explicitly includes {#MyAppExeName}, but line 32's recursive wildcard publish_output\* already covers it. Not harmful, but redundant duplication.

♻️ Proposed simplification
 [Files]
-Source: "publish_output\{`#MyAppExeName`}"; DestDir: "{app}"; Flags: ignoreversion
 Source: "publish_output\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@installer.iss` around lines 31 - 32, Remove the redundant explicit Source
entry for {`#MyAppExeName`} in installer.iss, since the recursive publish_output\*
rule already includes it. Keep the broader Source: "publish_output\*"; DestDir:
"{app}"; Flags: ignoreversion recursesubdirs createallsubdirs entry and delete
the duplicate file line to avoid duplicated packaging behavior.

8-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Declare x64-compatible install mode installer.iss is publishing a win-x64 app, but Setup will still default to 32-bit mode. Add ArchitecturesAllowed=x64compatible and ArchitecturesInstallIn64BitMode=x64compatible so {autopf} resolves to the 64-bit Program Files path and the installer stays aligned with the package architecture.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@installer.iss` around lines 8 - 21, The Setup section in installer.iss is
missing the x64-compatible architecture settings, so the installer may default
to 32-bit behavior even for a win-x64 package. Update the [Setup] block by
adding ArchitecturesAllowed and ArchitecturesInstallIn64BitMode with
x64compatible so DefaultDirName using {autopf} resolves to the 64-bit Program
Files path and matches the app architecture.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 15-16: The checkout step in the release workflow is leaving the
GitHub token persisted in the repo config; update the existing actions/checkout
usage in the release job to set persist-credentials to false so the token is not
stored for the rest of the job. Make this change on the Checkout Code step only,
since no later git push is needed, and keep the rest of the release flow
unchanged.
- Around line 23-53: The release workflow is interpolating `github.ref_name` and
`env.VERSION` directly into PowerShell scripts, which risks template injection
in the `Extract version from tag`, `Update AppxManifest Version`, `Find MSIX`,
and `Compile Inno Setup` steps. Update those `run:` blocks to read values from
PowerShell environment variables like `$env:VERSION` instead of `${{ ... }}`
expansion, and keep the version extraction confined to setting `GITHUB_ENV` so
later steps consume the already-exported value safely.

In `@installer.iss`:
- Around line 27-28: The startup task is currently enabled by default in the
installer task list, unlike the desktop icon option. Update the startup task
entry in the installer task definition so it behaves as an opt-in choice, and
confirm the task symbol for the Windows startup option is configured
consistently with desktopicon by adding the same unchecked-style default
behavior if that is intended.

---

Nitpick comments:
In `@installer.iss`:
- Around line 31-32: Remove the redundant explicit Source entry for
{`#MyAppExeName`} in installer.iss, since the recursive publish_output\* rule
already includes it. Keep the broader Source: "publish_output\*"; DestDir:
"{app}"; Flags: ignoreversion recursesubdirs createallsubdirs entry and delete
the duplicate file line to avoid duplicated packaging behavior.
- Around line 8-21: The Setup section in installer.iss is missing the
x64-compatible architecture settings, so the installer may default to 32-bit
behavior even for a win-x64 package. Update the [Setup] block by adding
ArchitecturesAllowed and ArchitecturesInstallIn64BitMode with x64compatible so
DefaultDirName using {autopf} resolves to the 64-bit Program Files path and
matches the app architecture.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3af889e0-5e57-4ef1-8cda-9f37a6088622

📥 Commits

Reviewing files that changed from the base of the PR and between 775d767 and d03528d.

📒 Files selected for processing (3)
  • .github/workflows/release.yml
  • build-msix.ps1
  • installer.iss

Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread installer.iss Outdated
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 1 file(s) based on 3 unresolved review comments.

Files modified:

  • installer.iss

Commit: 70c78852809000c5517597a99f3b9a4f31ee42ea

The changes have been pushed to the ci/release-action branch.

Time taken: 2m 47s


⚠️ 1 file(s) could not be committed — the agent does not have permission to push to .github/workflows/. Please apply these changes manually:

.github/workflows/release.yml — 4 changes:

Lines 14–19
     steps:
       - name: Checkout Code
         uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Setup .NET
         uses: actions/setup-dotnet@v5
Lines 23–35
       - name: Extract version from tag
         id: get_version
         run: |
-          $version = "${{ github.ref_name }}".TrimStart('v')
+          $version = "$env:GITHUB_REF_NAME".TrimStart('v')
           echo "VERSION=$version" >> $env:GITHUB_ENV
 
       - name: Update AppxManifest Version
         run: |
           $manifest = [xml](Get-Content "Package.appxmanifest")
-          $manifest.Package.Identity.Version = "${{ env.VERSION }}.0"
+          $manifest.Package.Identity.Version = "$env:VERSION.0"
           $manifest.Save("Package.appxmanifest")
 
       - name: Build MSIX
Lines 39–45
         run: |
           $msix = Get-ChildItem -Path bin/Release -Filter *.msix -Recurse | Select-Object -First 1
           if ($msix) {
-            Copy-Item $msix.FullName "DuskControl.v${{ env.VERSION }}.msix"
+            Copy-Item $msix.FullName "DuskControl.v$env:VERSION.msix"
           } else {
             Write-Error "MSIX package not found."
             exit 1
Lines 50–56
 
       - name: Compile Inno Setup
         run: |
-          & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss "/dAppVersion=${{ env.VERSION }}"
+          & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss "/dAppVersion=$env:VERSION"
 
       - name: Release
         uses: softprops/action-gh-release@v3

coderabbitai Bot and others added 3 commits July 4, 2026 13:51
Fixed 1 file(s) based on 3 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@stabldev
stabldev merged commit ae9a3bf into main Jul 4, 2026
1 check passed
@stabldev
stabldev deleted the ci/release-action branch July 4, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant