Part 4: Release Management with Modern Tools
The Chaos Before the System
Three years ago, our release process looked like this: developers would message "Ready to deploy feature X" in Slack, someone would manually update a spreadsheet tracking what's going where, and we'd coordinate deployments through back-and-forth messages. We lost track of which features were in which environment, what issues were blocking releases, and who approved what.
Today, our release management is automated and traceable. Jira tracks what's being released, GitHub Actions builds and tests the code, ArgoCD deploys it to Kubernetes, and everything is auditable. In this part, I'll show you exactly how we integrated these tools to create a seamless release management workflow.
The Release Management Stack
Here's the tool chain I use and why:
Jira: Release planning, feature tracking, and approval workflows
GitHub: Source control and CI/CD automation with Actions
ArgoCD: GitOps-based continuous deployment
Kubernetes: Container orchestration and deployment platform
Prometheus/Grafana: Metrics and monitoring (covered in Part 6)
Each tool has a specific role, and they integrate to create a complete release management system.
Jira: Release Planning and Tracking
Jira provides visibility into what's being released, who's working on what, and what's blocking progress.
My Jira Project Structure
I organize Jira around releases, not just features:
Issue Types:
Epic: Large body of work (e.g., "Payment System Overhaul")
Story: User-facing feature (e.g., "As a user, I can save payment methods")
Task: Technical work (e.g., "Add database index for payment queries")
Bug: Defect to fix
Release: Container for tracking what goes out together
Custom Fields I Add:
Target Release Version: Which release version includes this issueEnvironment Status: Which environments have this deployed (Dev/Staging/Prod)Deployment Risk: Low/Medium/HighRollback Plan: Link to rollback procedureFeature Flag: Associated feature flag key (if applicable)
Release Workflow in Jira
My release workflow follows this board structure:
Each column represents a stage in the release lifecycle. Issues automatically move between columns as they progress through GitHub and ArgoCD (through automation I'll show shortly).
Creating a Release in Jira
Automating Jira with GitHub Actions
I automate Jira updates when code moves through the pipeline:
What this does:
Extracts Jira issue keys from commit messages (e.g., "PROJ-123: Add payment method validation")
Automatically transitions issues to "Deployed to Dev/Staging/Production"
Adds a comment with deployment details and links
Now developers don't manually update Jiraβit happens automatically based on deployments.
Commit Message Convention
For Jira automation to work, we follow this commit convention:
The first line includes the Jira issue key. GitHub Actions extracts this and updates Jira.
GitHub Actions: CI/CD Automation
GitHub Actions orchestrates the build, test, and deployment pipeline.
Repository Structure for GitOps
I maintain two repositories:
Application Repository (myapp):
Application source code
Dockerfile
Unit and integration tests
GitHub Actions workflows for CI/CD
GitOps Repository (gitops-infra):
Kubernetes manifests
Kustomize overlays for each environment
ArgoCD application definitions
Infrastructure as Code
This separation follows GitOps principlesβapplication code and deployment configuration are versioned separately.
Application Repository CI Workflow
Key points:
CI runs tests first
On merge to
mainordevelop, builds container imageUpdates GitOps repository with new image tag
ArgoCD detects the change and deploys (shown next)
ArgoCD: GitOps Continuous Deployment
ArgoCD continuously monitors the GitOps repository and automatically syncs changes to Kubernetes clusters.
Installing ArgoCD
Access ArgoCD UI at https://localhost:8080 and log in with username admin and the password from above.
GitOps Repository Structure
Kubernetes Base Manifest
Development Overlay
Production Overlay with Canary
ArgoCD Application Definition
Apply the ArgoCD application:
ArgoCD Synchronization Workflow
Here's what happens when GitHub Actions updates the image tag:
GitHub Actions merges PR to
mainCI pipeline builds container image tagged with commit SHA
GitHub Actions updates
gitops-infrarepository:Runs
kustomize edit set imagein staging overlayCommits and pushes change
ArgoCD detects change in Git repository (polls every 3 minutes by default)
ArgoCD compares desired state (Git) with actual state (Kubernetes)
ArgoCD syncs the difference:
For staging: Rolling update deployment
For production: Canary rollout with Argo Rollouts
ArgoCD monitors health checks until all pods are healthy
GitHub Actions (via webhook) receives sync status and updates Jira
Monitoring ArgoCD
ArgoCD Notifications
I configure ArgoCD to notify Slack when deployments happen or fail:
Subscribe the production app to notifications:
Kubernetes: The Deployment Platform
Kubernetes orchestrates the containers, manages health checks, and handles rollouts.
Namespace Isolation
I isolate environments using namespaces:
Resource Quotas
To prevent resource exhaustion, I set quotas per namespace:
Network Policies
Restrict traffic between namespaces:
Secrets Management
I use External Secrets Operator to sync secrets from AWS Secrets Manager:
Putting It All Together: End-to-End Flow
Here's the complete flow from code commit to production:
Developer creates feature branch, includes Jira key in commits (
PROJ-123: Add feature)Developer opens pull request in GitHub
GitHub Actions runs CI pipeline:
Unit tests
Integration tests
Code quality checks
Security scans
Team member reviews and approves PR
Developer merges PR to
mainGitHub Actions CD pipeline:
Builds container image tagged with commit SHA
Pushes image to GitHub Container Registry
Updates
gitops-infrarepository staging overlay with new image tagUpdates Jira issue: transitions to "Deployed to Staging"
ArgoCD detects change in
gitops-infra:Syncs new image to staging namespace
Performs rolling update
Waits for health checks
GitHub Actions runs smoke tests against staging
Tech lead approves production deployment in GitHub UI
GitHub Actions:
Updates
gitops-infrarepository production overlayUpdates Jira issue: transitions to "Deployed to Production"
ArgoCD:
Syncs new image to production namespace
Starts canary rollout (10% β 25% β 50% β 75% β 100%)
Monitors Prometheus metrics during rollout
Automatically rolls back if error rate spikes
ArgoCD posts notification to Slack: "myapp-production deployed successfully"
Jira issue automatically marked as Done
All of this happens without manual intervention beyond the approval step.
Key Takeaways
Separate application code from deployment manifests: Use two repositoriesβone for code, one for Kubernetes manifests
Automate Jira updates: Extract issue keys from commits and update Jira automatically
GitOps with ArgoCD: Git is the single source of truth for what's deployed
Environment-specific overlays: Use Kustomize to customize deployments per environment
Progressive delivery in production: Use Argo Rollouts for canary deployments with automatic rollback
Integrate notifications: Keep team informed without requiring them to check multiple tools
In the next part, we'll establish standards for reproducible deployments and ensure consistency across environments.
Previous: Part 3: CI/CD Pipeline Best Practices - Testing Gates and Promotion Flows Next: Part 5: Standardization and Reproducible Deployments
Last updated