Module: ecs-codepipeline
Terraform Module for CI/CD with AWS Code Pipeline using GitHub webhook triggers and Code Build for ECS.
Usage
For a complete example, see examples/complete.
For automated tests of the complete example using bats and Terratest, see test.
Trigger on GitHub Push
In this example, we'll trigger the pipeline anytime the master branch is updated.
module "ecs_push_pipeline" {
source = "cloudposse/ecs-codepipeline/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"
name = "app"
namespace = "eg"
stage = "staging"
github_oauth_token = "xxxxxxxxxxxxxx"
github_webhooks_token = "xxxxxxxxxxxxxx"
repo_owner = "cloudposse"
repo_name = "example"
branch = "master"
service_name = "example"
ecs_cluster_name = "eg-staging-example-cluster"
privileged_mode = "true"
}
Trigger on GitHub Releases
In this example, we'll trigger anytime a new GitHub release is cut by setting the even type to release and using the json_path to exactly match an action of published.
module "ecs_release_pipeline" {
source = "cloudposse/ecs-codepipeline/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"
name = "app"
namespace = "eg"
stage = "staging"
github_oauth_token = "xxxxxxxxxxxxxx"
github_webhooks_token = "xxxxxxxxxxxxxx"
repo_owner = "cloudposse"
repo_name = "example"
branch = "master"
service_name = "example"
ecs_cluster_name = "eg-staging-example-cluster"
privileged_mode = "true"
github_webhook_events = ["release"]
webhook_filter_json_path = "$.action"
webhook_filter_match_equals = "published"
}
(Thanks to Stack Overflow)
Examples
Complete usage can be seen in the terraform-aws-ecs-web-app module.
Example Buildspec
Here's an example buildspec.yaml. Stick this in the root of your project repository.
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- eval $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- REPO_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- docker pull $REPO_URI:latest || true
- docker build --cache-from $REPO_URI:latest --tag $REPO_URI:latest --tag $REPO_URI:$IMAGE_TAG .
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- REPO_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- docker push $REPO_URI:latest
- docker push $REPO_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"%s","imageUri":"%s"}]' "$CONTAINER_NAME" "$REPO_URI:$IMAGE_TAG" | tee imagedefinitions.json
artifacts:
files: imagedefinitions.json