I contributed to PipeCD, a CNCF Sandbox GitOps continuous deployment tool, by fixing a bug where template variables weren't being rendered in certain analysis strategies, causing raw template strings to appear in logs and queries instead of actual values.
What is PipeCD?
PipeCD is a CNCF Sandbox project that provides GitOps continuous deployment for Kubernetes, ECS, Lambda, and other platforms. It offers progressive delivery features like canary deployments, blue-green deployments, and automated analysis stages that monitor metrics during deployments.
The Problem
PipeCD's analysis stage supports different strategies for monitoring deployments: CANARY_BASELINE, THRESHOLD, and PREVIOUS. The CANARY_BASELINE strategy correctly rendered template variables like {{ .App.Name }} into actual values, but THRESHOLD and PREVIOUS strategies were displaying raw template strings in logs and queries.
This inconsistency meant:
- Users saw confusing template variables instead of actual application names in logs
- Monitoring queries contained unprocessed template syntax like
{{ .App.Name }} - Different analysis strategies behaved inconsistently, breaking user expectations
- Debugging deployments was significantly harder with meaningless template strings
My Solution
I identified and fixed the root cause in metrics_analyzer.go:
Before: Only CANARY_BASELINE strategy was calling renderQuery() to process templates
After: All strategies (CANARY_BASELINE, THRESHOLD, PREVIOUS) now use renderQuery() consistently
The fix was surgical and focused:
- Updated the
THRESHOLDstrategy to callrenderQuerybefore executing queries - Updated the
PREVIOUSstrategy to callrenderQuerybefore executing queries - Unified the behavior across all analysis stage strategies
- No breaking changes - purely a bug fix that made things work as users expected
Review Process
The review process was collaborative and thorough:
Warashi (PipeCD maintainer) provided excellent guidance:
- Helped identify the exact issue location and solution approach
- Requested proper commit signing for the project (security best practice)
- Tested the changes with actual PipeCD deployments
- Provided before/after screenshots showing the fix working in production
- Approved the implementation after validation
ffjlabo performed the final review and merged the PR, confirming it met all project standards.
Technical Impact
The fix ensures consistent behavior across all analysis strategies:
- ✅ Users now see actual application names instead of
{{ .App.Name }} - ✅ Monitoring queries execute with proper values (e.g., actual service names, namespaces)
- ✅ All analysis strategies follow the same template rendering pattern
- ✅ Improved debugging experience for PipeCD users across all deployment strategies
- ✅ Quick cherry-pick to v0.52.2 release demonstrates importance to users
Community Recognition
The contribution was quickly cherry-picked to the v0.52.2 release, demonstrating its importance for existing users. The PipeCD maintainers encouraged me to continue contributing to the project, which led to several more contributions in documentation and tooling.
Links: Pull Request #6010 • Issue #6005 • Repository