What's Changed
Fix: render_services now exits non-zero on materialization failures
Previously, when a service failed to render (e.g. a Jinja2 UndefinedError), the behavior was broken in both code paths:
--multithreaded: The first failing future.result() would crash the process immediately, hiding any subsequent failures across other regions/services
Single-threaded: No error handling at all — an unhandled exception would crash with a raw traceback and no context about which service failed
Now both paths:
- Collect all errors and continue processing remaining services
- Print a clear Service FAILED: customer : cluster : service line for each failure as it occurs
- Print a summary of all failures at the end
- Exit with code 1 when any service fails to render, so CI correctly reports failure
- Show full tracebacks with --debug, including customer/cluster/service context
Example output
Service unchanged: region1 : cluster-a : common
Service FAILED: region1 : cluster-a : my-service — UndefinedError: 'dict object' has no attribute 'some_var'
Service unchanged: region2 : cluster-a : common
Service FAILED: region2 : cluster-a : my-service — UndefinedError: 'dict object' has no attribute 'some_var'
2 service(s) failed to render:
- region1 : cluster-a : my-service — 'dict object' has no attribute 'some_var'
- region2 : cluster-a : my-service — 'dict object' has no attribute 'some_var'