CI/CD Pipelines & GitHub Workflows
LocalTelemetry uses GitHub Actions for continuous integration, code quality scanning, automated builds, documentation deployment, and release packaging.
All workflow actions strictly follow OpenSSF Scorecard supply-chain security standards by pinning 40-character commit SHAs.
⚙️ Workflows Breakdown
All workflow definition files are located in .github/workflows/:
.github/workflows/
├── ci.yml # Continuous Integration build & test pipeline
├── release.yml # Automated Release & provenance attestation generation
├── docs.yml # GitHub Pages documentation deployment
├── codeql.yml # CodeQL static security analysis
├── scorecard.yml # OpenSSF Scorecard supply-chain security audit
├── sonar.yml # SonarQube / SonarCloud static analysis
└── project.yml # Project Automation (labels + Project #7 board fields)1. Continuous Integration (ci.yml)
Triggers on:
- Every
pushtomasterbranch. - Every
pull_requesttargetingmaster.
The workflow is split into two jobs:
CommitLint Job
- Checkout Code: Uses
actions/checkoutwith full git history (fetch-depth: 0). - Verify Conventional Commit Messages: Runs
commitlint(wagoid/commitlint-github-action) againstcommitlint.config.mjs.
CI Job (Windows)
- Checkout Code: Uses
actions/checkoutwith full git history (fetch-depth: 0). - Setup Node & Bun: Installs the Bun runtime (
oven-sh/setup-bun). - Frontend Unit Tests: Runs Vitest unit tests in
tests/LocalTelemetry.App.Tests/Settings/wwwroot, emitting a JUnit report consumed by Codecov Test Analytics. - Compile Svelte SPA: Runs
bun install&bun run buildinsrc/LocalTelemetry.App/Settings/wwwroot. - Cache .NET Packages: Caches
~/.nuget/packages(actions/cache). - Setup .NET 10: Configures .NET 10.0.x SDK (
actions/setup-dotnet). - Verify C# Code Formatting: Executes
dotnet format --verify-no-changes. - Build Solution: Executes
dotnet build --configuration Debug. - Run Unit Tests & Coverage: Runs
dotnet testper test project (Core, Notifier, App), collecting XPlat Cobertura coverage and JUnit test results for Codecov Test Analytics. - Upload Coverage: Uploads each project's coverage to Codecov under a dedicated flag (
core,notifier,app). - Upload Test Results: Uploads JUnit reports - including the Vitest report from the frontend tests - to Codecov Test Analytics (
report_type: test_results). - Upload Artifacts: Stores the raw test results & coverage as workflow artifacts.
2. Project Automation (project.yml)
Triggers on:
issuesopened.pull_requestopened.- Manual
workflow_dispatch(backfills all open issues & PRs).
Authenticates with the PROJECTS secret (falling back to PROJECTS_PAT, then GITHUB_TOKEN) using a pinned actions/github-script SHA.
For every issue/PR it:
- Labels: Assigns labels from the Conventional Commit type in the title (
feat→enhancement,fix→bug,perf→perf,docs→documentation, etc.).revertis intentionally unlabeled so the changelog groups it under Reverts. - Scope: Detects the board Scope (Core, App, Overlay, Monitor, Config, CI) from the changed files (
pulls.listFiles) and title scope markers, tags every matchingscope:*label, and sets the single-select Scope field using precedence Core > App > Overlay > Monitor > Config > CI. - Dependabot:
dependabot[bot]PRs are auto-labeled by dependabot and re-verified here. Package bumps (NuGet, Bun, dotnet-sdk) getdependabot+dependenciesand KindBuild; GitHub Actions bumps getdependabot+actions+scope:ciand KindCI. Scope is always derived from the files they touch (.github/**/global.json→ CI,*.csproj→ their project,wwwroot/**→ App). - Board: Adds the item to Project #7 and sets the Kind field from the title, the Scope field, and the Sprint field (active → next future iteration → creates a new 14-day iteration if none exist).
The changelog (git-cliff, cliff.toml) groups commits by these same labels so PR labels, Project #7 fields, and CHANGELOG sections stay consistent.
3. Release Workflow (release.yml)
Triggers on pushes to master that touch release-relevant paths (setup.iss, src/LocalTelemetry.App/**, src/LocalTelemetry.Core/**, src/LocalTelemetry.Notifier/**).
Job-level permissions:
contents: read,id-token: writeandattestations: write(for provenance attestations).
Workflow Steps
- GitHub App Authentication: Generates a GitHub App installation token (
actions/create-github-app-token) for committing to protected branches. - Checkout Code: Full history (
fetch-depth: 0) using the app token. - Frontend Build: Compiles the Svelte 5 frontend with Bun.
- Calculate Version Tag: Uses
mathieudutour/github-tag-actionto derive the next version from Conventional Commits since the last tag (Semantic Versioning,vprefix). Tag creation is a no-op when there are no new conventional commits. - Fetch Release Tag: Fetches the freshly created tag so MinVer resolves the exact release version.
- Publish .NET Binaries: Publishes
LocalTelemetry.Appas a single-file executable targetingwin-x64, overriding MinVer with the tagged version so the About page and file versions match the release. - Compile Inno Setup Installer: Installs Inno Setup 7 via Chocolatey and executes
ISCC.exe setup.isswith the release version defines, producingLocalTelemetrySetup.exein the repository root. - Package Portable Archive & Checksums: Packages
LocalTelemetry-win-x64.zipand generates SHA-256 hashes inchecksums.txt. - Provenance Attestations: Generates cryptographic build provenance attestations for the installer and portable archive using
actions/attest. - Publish GitHub Release: Uploads the installer, portable archive and checksums to GitHub Releases (
softprops/action-gh-release). - Update CHANGELOG: Prepends the generated changelog to
CHANGELOG.mdand commits it back tomasterasprotected-auto-commits[bot].
4. Documentation Deployment (docs.yml)
Triggers on:
- Pushes to
masterbranch or manualworkflow_dispatch.
Workflow Steps
- Installs documentation dependencies in
docs/via Bun (bun install). - Builds the VitePress static site with
bun run docs:build, passing theGA_MEASUREMENT_IDenvironment secret. - Uploads the VitePress output artifact (
docs/.vitepress/dist). - Deploys the static site to GitHub Pages using
actions/deploy-pages.
5. Security & Quality Analysis Workflows
CodeQL Security Scan (codeql.yml)
- Runs automated static code analysis scanning C# code for security vulnerabilities using
github/codeql-action.
OpenSSF Scorecard Analysis (scorecard.yml)
- Runs supply-chain security analysis on
masterpushes and on branch-protection rule events, uploading SARIF results to GitHub Security Code Scanning.
SonarQube Quality Scan (sonar.yml)
- Executes SonarScanner for .NET analyzing code complexity, duplication, and code smells.