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 issue

  • Environment Status: Which environments have this deployed (Dev/Staging/Prod)

  • Deployment Risk: Low/Medium/High

  • Rollback Plan: Link to rollback procedure

  • Feature 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:

  1. Extracts Jira issue keys from commit messages (e.g., "PROJ-123: Add payment method validation")

  2. Automatically transitions issues to "Deployed to Dev/Staging/Production"

  3. 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:

  1. CI runs tests first

  2. On merge to main or develop, builds container image

  3. Updates GitOps repository with new image tag

  4. 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:

  1. GitHub Actions merges PR to main

  2. CI pipeline builds container image tagged with commit SHA

  3. GitHub Actions updates gitops-infra repository:

    • Runs kustomize edit set image in staging overlay

    • Commits and pushes change

  4. ArgoCD detects change in Git repository (polls every 3 minutes by default)

  5. ArgoCD compares desired state (Git) with actual state (Kubernetes)

  6. ArgoCD syncs the difference:

    • For staging: Rolling update deployment

    • For production: Canary rollout with Argo Rollouts

  7. ArgoCD monitors health checks until all pods are healthy

  8. 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:

  1. Developer creates feature branch, includes Jira key in commits (PROJ-123: Add feature)

  2. Developer opens pull request in GitHub

  3. GitHub Actions runs CI pipeline:

    • Unit tests

    • Integration tests

    • Code quality checks

    • Security scans

  4. Team member reviews and approves PR

  5. Developer merges PR to main

  6. GitHub Actions CD pipeline:

    • Builds container image tagged with commit SHA

    • Pushes image to GitHub Container Registry

    • Updates gitops-infra repository staging overlay with new image tag

    • Updates Jira issue: transitions to "Deployed to Staging"

  7. ArgoCD detects change in gitops-infra:

    • Syncs new image to staging namespace

    • Performs rolling update

    • Waits for health checks

  8. GitHub Actions runs smoke tests against staging

  9. Tech lead approves production deployment in GitHub UI

  10. GitHub Actions:

    • Updates gitops-infra repository production overlay

    • Updates Jira issue: transitions to "Deployed to Production"

  11. 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

  12. ArgoCD posts notification to Slack: "myapp-production deployed successfully"

  13. Jira issue automatically marked as Done

All of this happens without manual intervention beyond the approval step.

Key Takeaways

  1. Separate application code from deployment manifests: Use two repositoriesβ€”one for code, one for Kubernetes manifests

  2. Automate Jira updates: Extract issue keys from commits and update Jira automatically

  3. GitOps with ArgoCD: Git is the single source of truth for what's deployed

  4. Environment-specific overlays: Use Kustomize to customize deployments per environment

  5. Progressive delivery in production: Use Argo Rollouts for canary deployments with automatic rollback

  6. 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