Add CI/CD workflows, WiX installer, and design documentation - #3
Merged
Conversation
- 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
build_on_push.yaml) and for manual or scheduled releases (release.yaml), including artifact packaging and GitHub release creation. [1] [2]Code Quality Tooling:
dotnet-sonarscannerto.config/dotnet-tools.jsonand updateddemaconsulting.sysml2tools.toolto version0.1.0-beta.13for improved code analysis support. [1] [2].versionmark.yamland added CodeQL configuration (codeql-config.yml). [1] [2]Documentation Enhancements:
Test Traceability and Requirements:
Miscellaneous: