Workers¶
The platform's long-running and event-driven work is performed by 11 workers built on the ConnectSoft.WorkerTemplate. Each worker is triggered by an event, schedule, or command, processes idempotently, and emits envelope-wrapped events that drive the next stage of delivery.
Target Architecture — Final-State Design
Workers are deployed as independently scalable background services on the Runtime & Cloud Platform. They consume from Azure Service Bus via MassTransit and honor the consumer rules in the event envelope.
Worker Catalog¶
| Worker | Trigger | Purpose | Input | Output | Retry | Idempotency |
|---|---|---|---|---|---|---|
| RepositoryProvisioningWorker | Command ProvisionRepository |
Create and configure the Azure DevOps Git repository. | Provision request | RepositoryProvisioned |
Exponential, 5x | Natural key tenantId+name; existing repo returns provisioned |
| CommitWorker | Command CreateCommit |
Write generated artifact files into a branch and commit. | Artifact bundle, branch | CommitCreated |
Exponential, 5x | Dedup on content hash; same tree → no-op |
| PullRequestWorker | Event CommitCreated / command OpenPullRequest |
Open a PR and attach policy/build checks. | Commit, branch pair | PullRequestOpened |
Exponential, 5x | Dedup on (repo, source, target) open PR |
| PipelineGenerationWorker | Event RepositoryProvisioned / PullRequestOpened |
Generate YAML pipeline from module metadata. | Module metadata | PipelineGenerated |
Exponential, 3x | Dedup on (repo, moduleId, templateVersion) |
| PipelineMonitorWorker | Schedule + event PipelineRunStarted |
Poll/stream Azure DevOps run status to completion. | Pipeline run id | BuildCompleted (via ingestion) |
Poll w/ backoff | Status reconciled on pipelineRunId |
| BuildResultIngestionWorker | Event from pipeline completion | Normalize build/test results, store logs in Blob. | Build outputs | BuildCompleted |
Exponential, 5x | Dedup on buildId |
| ReleaseOrchestrationWorker | Event BuildCompleted / ReleaseApproved |
Drive the release state machine: plan → approve → promote. | Build result, release plan | ReleasePlanned, DeploymentPromoted |
Exponential, 5x | Saga keyed on releaseId |
| IaCProvisioningWorker | Event ReleaseApproved / command ProvisionInfrastructure |
Run Pulumi preview + apply; detect drift. | Infrastructure plan | InfrastructureProvisioned |
Exponential, 3x (apply guarded) | Pulumi stack state is idempotent; dedup on planId |
| GitOpsSyncWorker | Schedule + event DeploymentPromoted |
Reconcile cluster/env state with Git desired state. | Desired-state ref | GitOpsSynced |
Continuous reconcile loop | Convergent reconcile; dedup on (env, commitSha) |
| ContainerBuildWorker | Event BuildCompleted |
Build and push container image to ACR. | Build artifacts | ContainerImageBuilt |
Exponential, 3x | Dedup on image digest |
| PackagePublishingWorker | Event BuildCompleted |
Publish NuGet package(s) to Azure Artifacts. | Build artifacts | PackagePublished |
Exponential, 5x | Dedup on (packageId, version); immutable versions |
Event-Flow Diagram¶
flowchart TB
ProvCmd["ProvisionRepository"] --> RepoWk["RepositoryProvisioningWorker"]
RepoWk -->|"RepositoryProvisioned"| PipeGenWk["PipelineGenerationWorker"]
CommitCmd["CreateCommit"] --> CommitWk["CommitWorker"]
CommitWk -->|"CommitCreated"| PRWk["PullRequestWorker"]
PRWk -->|"PullRequestOpened"| PipeGenWk
PipeGenWk -->|"PipelineGenerated"| PipeMonWk["PipelineMonitorWorker"]
PipeMonWk --> BuildWk["BuildResultIngestionWorker"]
BuildWk -->|"BuildCompleted"| ContWk["ContainerBuildWorker"]
BuildWk -->|"BuildCompleted"| PkgWk["PackagePublishingWorker"]
BuildWk -->|"BuildCompleted"| RelWk["ReleaseOrchestrationWorker"]
ContWk --> RelWk
PkgWk --> RelWk
RelWk -->|"ReleaseApproved"| IaCWk["IaCProvisioningWorker"]
RelWk -->|"DeploymentPromoted"| GitWk["GitOpsSyncWorker"]
IaCWk -->|"InfrastructureProvisioned"| GitWk
GitWk -->|"GitOpsSynced"| Runtime["Runtime and Cloud Platform"]
Hold "Alt" / "Option" to enable pan & zoom
Reliability Patterns¶
- Retry — transient failures use exponential backoff with jitter; the retry count is recorded on the message. Apply operations (Pulumi, deployment) are guarded so they never retry a partially-applied mutation without re-previewing.
- Idempotency — every worker derives an idempotency key from
eventId+ handler name (see metadata schema); processed keys are persisted so re-delivery is a no-op. - Dead-lettering — messages that exhaust retries move to a dead-letter subqueue with the full envelope preserved for replay and human triage.
- Sagas — multi-step flows (release orchestration, GitOps reconciliation) are MassTransit sagas keyed by
releaseId/ environment, making them resumable after restart.
Pillar Alignment¶
- Autonomy — workers let agents fire-and-forget delivery commands while the platform drives them to completion.
- Observability — each worker emits start/finish events carrying
traceId, feeding the Observability & Feedback Platform. - Governance — the ReleaseOrchestrationWorker will not promote without a recorded
ReleaseApproved.