Software Delivery
Software delivery is the process of moving your applications from development to production. This involves building, testing, deploying, and promoting them through environments like dev, staging, and production, with approval gates at each stage. Whether you're using EKS, ECS, or Lambdas, the solutions may vary slightly, but we maintain a consistent, reusable pattern across all applications.
1 Deploy all Backing Services & Databases
Ensure all the backing services that your applications depend on are deployed and running. This includes databases, caches, and message queues, etc.
Get Started2 Implement CI/CD
Choose a path for delivery of your services with GitHub Actions. The reference architecture supports deployment to AWS EKS, Amazon ECS, and Lambda functions.
- Use ECS with ecspresso
- Use EKS with Argo CD
- Use Lambas
We use the ecspresso
deployment tool for Amazon ECS to manage ECS services using a code-driven approach, alongside reusable GitHub Action workflows. This setup allows tasks to be defined with Terraform within the infrastructure repository, and task definitions to reside alongside the application code.
Argo CD is an open-source declarative, GitOps continuous delivery tool for Kubernetes applications. It enables developers to manage and deploy applications on Kubernetes clusters using Git repositories as the source of truth for configuration and definitions. Our Argo CD implementation follows the GitOps methodology and integrates with GitHub Actions, ensuring that the entire application configuration, including manifests, parameters, and even application state, is stored in a Git repository.
Get StartedDeploy Lambda functions using GitHub Workflows with a code-driven approach. The build process updates S3 with assets and SSM with the new version, requiring a Terraform run for promotion. GitHub Workflows manage the entire lifecycle, from building and packaging Lambda functions to deploying them, with reusable workflows. Get Started
Once you're done deploying your apps, it's time to start monitoring everything. We'll show you how to do that next.
Our Examples
Reusable Workflows
We've consolidated all the workflows into the example applications, including the GitHub reusable workflows. We've done this to make it easier for Developers to understand how the example leverages all the workflows. In practice, we recommend moving the reusable workflows into a centralized repository, where they can be shared by other application repositories.
For example,
we would recommend moving all the ecspresso-*
and all workflow-*
workflow files to a centralized repository
(e.g. a repository named github-action-workflows
, alternatively the infrastructure
repository directly).
The best solution will depend on your GitHub Organization structure and team size.
Pick what works for you and your team.
When your workflows are consolidated, you will need only 3 inside an application repository:
feature-branch.yaml
main-branch.yaml
release.yaml
- (optional)
hotfix-branch.yaml
- (optional)
hotfix-enabled.yaml
- (optional)
hotfix-release.yaml
The remaining workflows are the reusable/shared implementation. This approach makes it easier to define a standardized CI/CD interface for all of your services.
.github
├── configs/
│ ├── draft-release.yml
│ └── environment.yaml
└── workflows/
├── ecspresso-feature-branch.yml
├── ecspresso-hotfix-branch.yml
├── ecspresso-hotfix-mixin.yml
├── ecspresso-hotfix-release.yml
├── ecspresso-main-branch.yml
├── ecspresso-release.yml
├── feature-branch.yml
├── main-branch.yaml
├── release.yaml
├── workflow-cd-ecspresso.yml
├── workflow-cd-preview-ecspresso.yml
├── workflow-ci-dockerized-app-build.yml
├── workflow-ci-dockerized-app-promote.yml
├── workflow-controller-draft-release.yml
├── workflow-controller-hotfix-reintegrate.yml
├── workflow-controller-hotfix-release-branch.yml
└── workflow-controller-hotfix-release.yml
After moving to a centralized workflow repository, you should have a setup like the following:
Application Repository
├── .github
│ ├── configs/
│ │ └── draft-release.yml
│ └── workflows/
│ ├── feature-branch.yml
│ ├── main-branch.yaml
│ └── release.yaml
└── ...
github-action-workflows
├── .github/
│ └── workflows
│ ├── ecspresso-feature-branch.yml
│ ├── ecspresso-hotfix-branch.yml
│ ├── ecspresso-hotfix-mixin.yml
│ ├── ecspresso-hotfix-release.yml
│ ├── ecspresso-main-branch.yml
│ ├── ecspresso-release.yml
│ ├── workflow-cd-ecspresso.yml
│ ├── workflow-cd-preview-ecspresso.yml
│ ├── workflow-ci-dockerized-app-build.yml
│ ├── workflow-ci-dockerized-app-promote.yml
│ ├── workflow-controller-draft-release.yml
│ ├── workflow-controller-hotfix-reintegrate.yml
│ ├── workflow-controller-hotfix-release-branch.yml
│ └── workflow-controller-hotfix-release.yml
└── ...