ci: switch to self-hosted ARC runners (runs-on: dotnet) - #86
Merged
Conversation
Pour économiser les minutes GitHub Actions (limites org atteintes). Les runners ARC tournent sur le cluster k8s sassy-solutions-main-live via la GitHub App nxs-runner (cf. https://github.com/sassy-solutions/github-actions-runners). Variante dotnet : Ubuntu 24.04 + .NET 8 SDK + Docker CLI + Buildx. Le step `actions/setup-dotnet@v4` continue de fonctionner et installe la version exacte demandée (9.0.x pour docfx). Validé end-to-end : smoke-deploy + smoke-dotnet PASS sur le cluster.
There was a problem hiding this comment.
Pull request overview
This PR migrates Compendium’s GitHub Actions workflows from GitHub-hosted runners (ubuntu-latest) to the org’s self-hosted ARC runners (label dotnet) running on the sassy-solutions-main-live Kubernetes cluster, in order to reduce GitHub Actions minutes usage.
Changes:
- Update CI workflow to run on the
dotnetself-hosted runner label. - Update docs build/deploy workflow jobs to run on the
dotnetself-hosted runner label. - Update release packaging/publishing workflow to run on the
dotnetself-hosted runner label.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| .github/workflows/ci.yml | Switches CI build-test job from ubuntu-latest to dotnet runner label. |
| .github/workflows/docs-deploy.yml | Switches docs build and deploy jobs from ubuntu-latest to dotnet runner label. |
| .github/workflows/release.yml | Switches release pack-publish job from ubuntu-latest to dotnet runner label. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
16
to
20
| jobs: | ||
| build-test: | ||
| runs-on: ubuntu-latest | ||
| runs-on: dotnet | ||
| timeout-minutes: 20 | ||
| steps: |
Pomdapis
added a commit
that referenced
this pull request
Jun 11, 2026
… Result.Failure (#122) ## P0-02 — Dispatcher swallows handler exceptions silently The Compendium command/query dispatchers convert **any** exception thrown inside a handler into `Result.Failure(Error.Failure("*.ExecutionFailed", ex.Message))` **without logging the exception or stack trace**. In production this makes debugging blind: the only trace is on OTel spans (`exception.type` / `exception.message` activity tags), which are not always sampled or retained. Refs: - Nexus bug inventory **P0-02** - Memory note `project_compendium_dispatcher_silent` - Nexus PR #86 added an HTTP-layer `ProblemDetailsLoggingFilter` that only **partially** mitigated this (REST surface only — MCP, SDK, background/process-manager dispatch paths still went dark). ## What changed Three swallow points fixed (`CommandDispatcher.DispatchAsync<TCommand>`, `CommandDispatcher.DispatchAsync<TCommand,TResult>`, `QueryDispatcher.DispatchAsync<TQuery,TResult>`): 1. **Structured error logging before wrapping.** Each catch block now calls `_logger.LogError(ex, "...", commandOrQueryType, ...)` — logging the full exception (with stack trace) at `Error` level **before** building the failure `Result`. 2. **No public API break.** Both dispatchers already receive `IServiceProvider` only. Rather than change the public single-argument constructor (which downstream consumers call directly — see the existing unit tests), the logger is **resolved from the service provider** with a `NullLogger<T>` fallback when no logging is configured. Binary- and source-compatible. 3. **Non-breaking error enrichment.** `Error.Failure(...)` already supports an optional `metadata` dictionary, so the failure error now carries `{ exceptionType }` — letting consumers discriminate the underlying cause without string-parsing `Error.Message`. 4. **Result contract preserved.** Still returns `Result.Failure`, never rethrows. The pre-existing `LoggingBehavior<TRequest,TResponse>` only logs when registered as a pipeline behavior and rethrows; the dispatcher catch sits outside the behavior pipeline and is the final, unconditional swallow point — which is exactly what this fixes. ## Tests Added to `CommandDispatcherTests` / `QueryDispatcherTests` (+ a tiny `CapturingLogger<T>` helper to avoid a new `Microsoft.Extensions.Diagnostics.Testing` dependency): - handler throws → `Result.Failure` returned **AND** logger received the exception at `Error` level **AND** `exceptionType` metadata present (command no-result, command-with-result, and query paths) - no `ILogger` registered → falls back to `NullLogger`, still returns failure, does not throw - success path → no `Error`-level log emitted `dotnet test Compendium.Application.Tests` → **232 passed**. Architecture tests → **37 passed**. ## Notes - The legacy `[Obsolete]` `SagaOrchestrator` (slated for removal in v1.0) has similar catch-and-wrap blocks but is deprecated dead-path; intentionally **out of scope** for this focused P0 fix. The live choreography path (`ChoreographyRouter`) already aggregates handler errors with messages. Co-authored-by: sacha <sacha@scojhconsult.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.
Summary
Migre tous les workflows GH Actions de Compendium vers les runners self-hosted ARC qui tournent sur le cluster k8s
sassy-solutions-main-live.ci.yml:runs-on: ubuntu-latest→runs-on: dotnetdocs-deploy.yml: 2 jobs (build + deploy) →dotnetrelease.yml:pack-publish→dotnetPourquoi
Minutes GitHub Actions épuisées sur l'org
sassy-solutions. Les runners ARC tournent sur le cluster k8s existant via la GitHub Appnxs-runner(cf. github-actions-runners).Variante
dotnetactions/setup-dotnet@v4continue de marcher (override la version si besoin, e.g. 9.0.x pour docfx)docker buildValidation
Smoke test end-to-end (
smoke-deploy+smoke-dotnet) PASS sur le cluster — le runner pull l'image privée depuis GHCR viaghcr-pull, mint un installation token vianxs-runner(App ID 3676514, installation 131410088), s'enregistre en JIT, exécute le job, le pod meurt.Test plan
arc-runnersns du clusterdotnet restore/dotnet testpassent