Two Phase Deployments Using CircleCI

I want to implement a two-phase deployment strategy using CircleCI. Here’s my goal:

  • On every commit: build Docker images for multiple services from a monolithic codebase, tag them, and push to ECR.
  • Later, manually choose a specific image tag to deploy to either Dev or Prod environments — enabling controlled promotions and rollbacks.

For deployments:

  • I use ECS Fargate, where the task definition points to :latest.
  • To deploy, I apply the latest tag to the chosen image in ECR, triggering an ECS service update.
  • For rollbacks, I simply move the latest tag back to a previous image.

I also use separate ECR repos for Dev and Prod. Once an image is tested in Dev, I copy it from the Dev ECR to Prod ECR and apply the latest tag — avoiding redundant builds.

I’ve implemented this successfully with GitHub Actions, but the UI makes it hard for developers to navigate due to the scale (15+ services). CircleCI’s deployment workflows and approval gates look promising.

Can CircleCI support this workflow effectively? Specifically:

  • Build once, deploy multiple times
  • Manual promotion between environments
  • Easy rollback via image tagging
  • Clear visibility for developers

Hi Muhammad,

Thanks for writing in. I’m Aditya, a PM here at CircleCI. We’re currently evaluating manual promotion between environments as a feature on our roadmap.

As for rollbacks, you can try out our deploy markers feature and setup rollbacks from there:

Let me know what you think if you get a chance to set this up, or if you have any questions along the way.