
ToolUp Days #12
With the game’s microservices architecture designed and a clear definition of done in hand, Chris and Matt turn their attention to getting the World Events Engine working end-to-end. The session opens with an unexpected obstacle: Chris had inadvertently broken all the GitHub Actions builds in the run-up to the stream.
Diagnosing the GitHub Actions deployment bug
Two workflows were triggered simultaneously, both defaulting to the same container name (derived from the workflow filename). Deploying two Azure Container App revisions with identical names into the same resource group created a race condition — one deployment could not start because the other was already in progress under the same name.
The fix: append the GitHub commit SHA to the container name, giving each deployment a unique, traceable identity and preserving a history of revisions in the portal. Chris and Matt weigh the trade-off: SHA-based names give you deployment history, but static names keep resource group deployment counts low.
Building the World Events Engine
The engine is stripped back to a minimal .NET HTTP endpoint. The /world-events route deliberately matches the name of the Dapr storage-queue binding component, so any message dropped on the Azure Storage Queue automatically routes to the handler — no polling or custom trigger code required.
Random modifier logic — a dictionary maps each BarType to a random multiplier (±0.5), applied to each player’s bar value in a batch. The team debates where to apply the modifier (bar value vs. player funds) before settling on the bar’s value, keeping the world-event effect cleanly scoped.
Dapr service invocation — the engine uses DaprClient.InvokeMethodAsync to reach the Player State API and update player data, with GitHub Copilot generating the invocation boilerplate. A conversation about cross-service model sharing references WCF/SOAP-era namespace horrors; the pragmatic decision is to duplicate the models for now.
GitHub Codespaces
A live viewer question from Cedric (Belgium) about Codespaces triggers a longer conversation. Chris and Matt both acknowledge the pain of maintaining multiple local configurations — WSL distros, mismatched tool versions, forgotten setup steps. They commit to dedicating the next episode to setting up a Codespaces environment, drawing a parallel to the CI/CD argument: the upfront investment pays for itself many times over.
The episode ends with both container apps running, a storage queue message successfully consumed, and the World Events Engine invoking the Player State API — with error handling and a full local debugging setup on the agenda for next time.
Related Content

GitHub Actions and Azure - Using Environments with GitHub Actions
Once you have a working GitHub Actions workflow, the next challenge is safely deploying across dev, staging, and production with the right secrets in the right places. This episode deep-dives into GitHub Actions Environments: how to scope secrets per environment to enforce the principle of least privilege, configure required reviewers and wait timers as production gates, and assign service principals with minimal Azure RBAC permissions. A live demo deploys the cloudwithchris.com Hugo site to Azure Storage, making every concept concrete.

ToolUp Days #11
The series officially rebrands from ToolUp Tuesday to ToolUp Days, giving Chris and Matt the flexibility to keep a consistent cadence. This episode focuses on rethinking the game's data model — simplifying the player state object, introducing a BarType enum, and scaffolding both a player creation API and a bar management controller, with GitHub Copilot generating much of the boilerplate in real time.

ToolUp Day #10
Chris and Matt set up federated identity credentials (OIDC) for passwordless GitHub Actions authentication to Azure, deploy container apps via CI/CD, and discuss workflow trigger strategies for container image deployments.