Skip to content

Add CI/CD workflows, WiX installer, and design documentation - #3

Merged
Malcolmnixon merged 8 commits into
mainfrom
feature/ci-release-packaging
Jul 19, 2026
Merged

Add CI/CD workflows, WiX installer, and design documentation#3
Malcolmnixon merged 8 commits into
mainfrom
feature/ci-release-packaging

Conversation

@Malcolmnixon

Copy link
Copy Markdown
Member

This pull request introduces several improvements and new configurations related to build automation, code quality, documentation, and test traceability for the SysML2Workbench project. The main changes include the addition of new GitHub workflow files for build and release automation, enhanced integration with code quality tools, expanded documentation resources, and standardization of test method references for requirements traceability.

Build and Release Automation:

  • Added new GitHub Actions workflows for automated build on push (build_on_push.yaml) and for manual or scheduled releases (release.yaml), including artifact packaging and GitHub release creation. [1] [2]

Code Quality Tooling:

  • Added dotnet-sonarscanner to .config/dotnet-tools.json and updated demaconsulting.sysml2tools.tool to version 0.1.0-beta.13 for improved code analysis support. [1] [2]
  • Integrated SonarScanner version tracking in .versionmark.yaml and added CodeQL configuration (codeql-config.yml). [1] [2]
  • Updated code quality documentation to include generated Sonar and CodeQL quality reports.

Documentation Enhancements:

  • Added a comprehensive software design document definition and title for SysML2Workbench, consolidating design resources and sections. [1] [2]

Test Traceability and Requirements:

Miscellaneous:

  • Updated the cspell dictionary with new domain-specific terms to improve spell checking for documentation and code.

Malcolm Nixon and others added 8 commits July 16, 2026 15:26
- Adds build.yaml (reusable), build_on_push.yaml, and release.yaml
  workflows modeled closely on TemplateDotNetTool's pattern: quality
  checks, matrix build+test+SonarCloud, CodeQL, and full documentation
  generation (build notes, code quality, code review, design,
  verification, user guide, requirements/trace matrix). Integration
  testing is intentionally omitted (not yet applicable to this app).
- Adds package-zip (win-x64/linux-x64/osx-x64/osx-arm64 self-contained
  publish + zip, built on ubuntu-latest) and package-msi (Windows-only
  WiX v5 MSI build) jobs, both new relative to the template since this
  is a desktop app rather than a NuGet package.
- release.yaml drops the NuGet publish step (this repo does not
  produce a package) and instead attaches the zip archives, MSI, and
  generated documents directly to the GitHub Release.
- Adds src/DemaConsulting.SysML2Workbench.Installer: a WiX Toolset v5
  SDK-style .wixproj/.wxs pinned to 5.0.2 (predates the v6+ Open
  Source Maintenance Fee EULA), producing a per-machine MSI for the
  self-contained win-x64 build with a Start Menu shortcut. Kept out of
  SysML2Workbench.slnx so solution-level restore/build still works on
  Linux/macOS runners.
- Adds the previously-missing docs/design/definition.yaml and
  docs/design/title.txt so the design document section (already
  present in .fileassert.yaml) can actually be generated.
- Fixes docs/code_quality/definition.yaml to include the CodeQL and
  Sonar quality generated markdown as Pandoc input files, matching
  the template.
- Adds publish/ to .gitignore (local dotnet publish output used to
  validate the installer).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Adds dotnet-sonarscanner to .versionmark.yaml and .config/dotnet-tools.json
  (pinned to 11.2.1, matching TemplateDotNetTool). VersionMark capture in
  the build job referenced this tool but it was never declared, causing
  'Tool 'dotnet-sonarscanner' not found in configuration' at runtime.
- Removes the standalone package-zip and package-msi jobs and instead runs
  publish/zip/MSI steps directly in the existing build matrix job, keyed
  off matrix.os. This avoids re-checking-out, re-restoring dotnet tools,
  and rebuilding from scratch in separate jobs, and lets each RID publish
  and get zipped on its natively matching runner (win-x64 on windows-latest,
  linux-x64 on ubuntu-latest, osx-x64/osx-arm64 on macos-latest) rather than
  cross-compiling all 4 RIDs from a single ubuntu-latest runner. This also
  fixes a correctness concern: zip archives store Unix executable
  permission bits in their external file attributes, and Compress-Archive
  (used for the Windows leg) does not understand Unix permissions, so
  zipping Linux/macOS output on a Windows-hosted step would have silently
  dropped the executable bit. Using native zip on ubuntu-latest/macos-latest
  and Compress-Archive only for windows-latest preserves this correctly.
- Normalizes build.yaml to LF line endings to match repository convention.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Package.wxs's Files Include="**" harvested files relative to the
  wixproj's own project directory rather than the intended published
  app output (the BindPath item is only consulted when resolving a
  File's SourceFile, not when expanding a Files glob), so the MSI
  silently packaged the installer project's own bin/obj/.wxs files
  instead of the app - producing a ~11KB/40KB MSI with no real
  content. Fixed by harvesting an absolute path built from the
  SysML2WorkbenchPublishDir MSBuild property (now also exposed as a
  WiX preprocessor variable via DefineConstants) directly in the
  Files Include glob, which harvests the correct directory. Confirmed
  by administratively extracting the MSI (msiexec /a) before and
  after: before the fix it contained only Package.wxs/obj/*; after,
  it contains the actual published app files. Removed the now-unused
  BindPath item since the Files Include glob no longer depends on it.
- Adds a cleanup step after each RID's dotnet publish in build.yaml
  to delete *.pdb and *.xml from the publish output before zipping/
  MSI-building, so packaged zips and the MSI no longer ship debug
  symbols (including large third-party native pdbs from SkiaSharp/
  HarfBuzzSharp) or XML doc-comment files.
- Updates a stale wixproj comment referencing the now-removed
  package-msi job.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Every docs/*/definition.yaml (build_notes, code_quality, code_review_plan,
code_review_report, design, requirements_doc, requirements_report,
user_guide, verification) references docs/template/template.html as its
pandoc HTML template and adds docs/template to resource-path, but the
file itself was never added to this repo, so every build-docs pandoc
invocation failed with 'Could not find data file templates\template.html'.

Copied verbatim from TemplateDotNetTool's docs/template/template.html -
it is fully generic (no product-specific content) so no changes were
needed. Verified locally: dotnet pandoc --defaults
docs/build_notes/definition.yaml ... now resolves the template and
produces build_notes.html successfully.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
docs/template/template.html (added in previous commit) uses pandoc
template variable/CSS-selector names that aren't real words: dcterms,
pagetitle, doctitle, docversion, and Blockquotes. Adds them to
.cspell.yaml's words list, matching TemplateDotNetTool's dictionary,
so cspell passes on the new file.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Adds Icon.png (DEMA Consulting logo, sourced by the user) and a generated
  Icon.ico containing only the practical app-icon sizes (16/24/32/48/64px),
  encoded as uncompressed 32bpp BMP frames per Microsoft's documented ICO
  guidance. Skips 128/256 "jumbo" sizes deliberately - this file is only
  ever used as an exe/window/installer icon, never as a general-purpose
  image (Icon.png itself is used directly wherever a larger/compressed
  bitmap is needed).
- Adds make_icon.py, a small repeatable Pillow-based script to regenerate
  Icon.ico from Icon.png if the logo ever changes. Iterated through a few
  ICO encoders while producing this: ImageMagick's default writer stores
  all frames as uncompressed BMP (372KB, wasteful for 5 tiny icon sizes);
  Pillow's default ICO writer instead stores every frame as PNG (dropping
  our requested 256 size since it exceeds the 128x128 source and encoding
  everything, including 16x16, as PNG, which contradicts Microsoft's
  guidance that only 256x256 icons should use PNG compression). The final
  script hand-writes the ICO container with real BITMAPINFOHEADER/XOR/AND
  DIB frames for each small size, matching Microsoft's recommended format
  exactly and avoiding the "non-RGBA/palette-indexed PNG inside ICO"
  WIC-decode warnings those other tools' output triggered.
- DemaConsulting.SysML2Workbench.Desktop.csproj: sets ApplicationIcon to
  the repository-root Icon.ico, embedding it as the win-x64 exe's icon
  (exe icon, taskbar, Alt-Tab, Explorer). Harmless no-op on other RIDs.
- DemaConsulting.SysML2Workbench.csproj: adds Icon.png as an
  AvaloniaResource (avares://DemaConsulting.SysML2Workbench/Assets/Icon.png)
  and MainWindowView.axaml sets Window.Icon to it, so the window title bar
  icon matches on all platforms.
- Installer.wixproj / Package.wxs: adds a SysML2WorkbenchIconFile MSBuild
  property (defaulting to the repository-root Icon.ico) exposed as a WiX
  preprocessor variable, and adds an <Icon>/ARPPRODUCTICON pair so the MSI
  shows the logo in Add/Remove Programs. The Start Menu shortcut already
  picks up the icon automatically from the installed exe's embedded icon
  resource, so no separate Shortcut Icon attribute was needed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ReqStream matches 'tests:' entries against the bare xUnit method name
found in each TRX result's <TestMethod name="..."/> element (see
.github/standards/reqstream-usage.md: 'ReqStream matches these by method
name in test results') - it does not use the class-qualified name. Every
docs/reqstream/**/*.yaml file in this repo listed tests as
'ClassName.MethodName' instead, so none of the 61 requirements ever
matched any evidence, and CI failed with 'Only 0 of 61 requirements are
satisfied with tests' even though the referenced tests existed and
passed (confirmed - their TRX files were present in the artifacts-build-*
artifacts, exactly as reported).

Stripped the class-name prefix from every tests: entry across all 26
affected docs/reqstream/*.yaml files, preserving existing platform/runtime
source filters (e.g. 'windows@Method', 'net9.0@Method') introduced by the
prior '@' prefix. Verified locally: ran the full test suite with a
LogFilePrefix matching CI's naming convention and fed the resulting TRX
files to dotnet reqstream --requirements requirements.yaml --tests
"artifacts/**/*.trx" --enforce - went from 0/61 to 59/61 satisfied (the
remaining 2 are the Ubuntu/macOS platform requirements, which only have
evidence from those OS legs of the CI matrix and are expected to resolve
once the full 3-OS matrix runs). Also re-ran dotnet reqstream --lint
to confirm no structural regressions in requirements.yaml.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Updated the demaconsulting.sysml2tools.tool local tool manifest and all
DemaConsulting.SysML2Tools.{Core,Language,Stdlib} PackageReferences from
0.1.0-beta.11 to 0.1.0-beta.13.

Verified locally after the bump: dotnet build (0 warnings/errors),
dotnet test (124/124 passed), dotnet sysml2tools lint (21 files, no
errors), dotnet sysml2tools --validate self-test (9/9 passed), and
dotnet sysml2tools render (9 views rendered successfully) - no breaking
changes observed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Malcolmnixon
Malcolmnixon merged commit db16376 into main Jul 19, 2026
6 checks passed
@Malcolmnixon
Malcolmnixon deleted the feature/ci-release-packaging branch July 21, 2026 00:18
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