Skip to content

Commit 1cbae9f

Browse files
committed
Add email notifications to CloudFormation templates
1 parent 8bbdbc4 commit 1cbae9f

File tree

5 files changed

+84
-13
lines changed

5 files changed

+84
-13
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
build/
2+
TODO.txt
3+
14
.scannerwork
25

36
# Logs

README.md

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ The ci_tools folder contains the following tools for use with AWS Lambda and Ama
3333

3434
Contains an appspec.yml file and deploy_scripts folder for deploying the service with AWS CodeDeploy.
3535

36-
### CloudFormation
36+
## CloudFormation Templates
3737

3838
Create a CodeCommit repository called 'aws-codebuild-samples' and push this sample code into the repo. Then spin up all of the above easily with CloudFormation.
3939

40-
Create the continuous deployment stack, with a CodePipeline pipeline:
40+
### Continuous Deployment
41+
Set up continuous deployment with a CodePipeline pipeline:
4142
```
42-
aws cloudformation create-stack --stack-name aws-codebuild-samples --template-body file://cloudformation/continuous-deployment.yml --capabilities CAPABILITY_NAMED_IAM
43-
44-
aws cloudformation wait stack-create-complete --stack-name aws-codebuild-samples
43+
aws cloudformation deploy --stack-name aws-codebuild-samples --template-file cloudformation/continuous-deployment.yml --capabilities CAPABILITY_NAMED_IAM
4544
4645
aws cloudformation describe-stacks --stack-name aws-codebuild-samples --query 'Stacks[0].Outputs[?OutputKey==`PipelineConsoleUrl`].OutputValue' --output text
4746
```
@@ -53,13 +52,30 @@ aws cloudformation describe-stacks --stack-name aws-codebuild-samples-test-stack
5352
aws cloudformation describe-stacks --stack-name aws-codebuild-samples-prod-stack --query 'Stacks[0].Outputs[?OutputKey==`Url`].OutputValue' --output text
5453
```
5554

56-
Set up continuous integration for the application:
55+
### Continuous Integration: Nightly Checks
56+
57+
Choose an email address for receiving email notifications. Then, [verify the email address in SES](https://us-west-2.console.aws.amazon.com/ses/home?region=us-west-2#verified-senders-email:) before setting up the CloudFormation stack.
58+
59+
```
60+
mkdir build
61+
62+
S3_BUCKET=$(aws cloudformation describe-stacks --stack-name aws-codebuild-samples --query 'Stacks[0].Outputs[?OutputKey==`ArtifactsBucket`].OutputValue' --output text)
63+
64+
aws cloudformation package --template-file cloudformation/continuous-integration-nightly-checks.yml --s3-bucket $S3_BUCKET --force-upload --output-template-file build/continuous-integration-nightly-checks.yml
65+
66+
aws cloudformation deploy --stack-name aws-codebuild-samples-nightly-checks --template-file build/continuous-integration-nightly-checks.yml --capabilities CAPABILITY_NAMED_IAM --parameter-overrides NotificationEmailAddress="example@example.com"
67+
```
68+
69+
### Continuous Integration: Branch Checks
70+
71+
```
72+
aws cloudformation deploy --stack-name aws-codebuild-samples-branch-checks --template-file cloudformation/continuous-integration-branch-checks.yml --capabilities CAPABILITY_NAMED_IAM
5773
```
58-
aws cloudformation create-stack --stack-name aws-codebuild-samples-nightly-checks --template-body file://cloudformation/continuous-integration-nightly-checks.yml --capabilities CAPABILITY_NAMED_IAM
5974

60-
aws cloudformation create-stack --stack-name aws-codebuild-samples-branch-checks --template-body file://cloudformation/continuous-integration-branch-checks.yml --capabilities CAPABILITY_NAMED_IAM
75+
### Continuous Integration: Pull Request Checks
6176

62-
aws cloudformation create-stack --stack-name aws-codebuild-samples-pull-request-checks --template-body file://cloudformation/continuous-integration-pull-request-checks.yml --capabilities CAPABILITY_NAMED_IAM
77+
```
78+
aws cloudformation deploy --stack-name aws-codebuild-samples-pull-request-checks --template-file cloudformation/continuous-integration-pull-request-checks.yml --capabilities CAPABILITY_NAMED_IAM
6379
```
6480

6581
## License

ci_tools/email_notifications.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
'use strict';
22

33
const AWS = require('aws-sdk');
4-
const codebuild = new AWS.CodeBuild();
54
const cloudwatchlogs = new AWS.CloudWatchLogs();
6-
const ses = new AWS.SES();
5+
const ses = new AWS.SES({region: 'us-west-2'});
76
const sourceEmailAddress = process.env.sourceEmailAddress;
87
const destinationEmailAddress = process.env.destinationEmailAddress;
98

@@ -48,8 +47,6 @@ function handleBuildEvent(event, callback) {
4847
const buildArn = event.detail['build-id'];
4948
const buildId = buildArn.split('/').pop();
5049
const buildUuid = buildId.split(':').pop();
51-
const sourceUrl = event.detail['additional-information'].source.location;
52-
const repoName = sourceUrl.split('/').pop();
5350
const projectName = event.detail['project-name'];
5451
const region = event.region;
5552

cloudformation/continuous-deployment.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ Outputs:
2525
- !Ref 'AWS::Region'
2626
- '#/view/'
2727
- !Ref 'AWS::StackName'
28+
ArtifactsBucket:
29+
Description: S3 bucket used for artifacts
30+
Export:
31+
Name: !Join
32+
- '-'
33+
- - !Ref 'AWS::StackName'
34+
- !Ref 'AWS::Region'
35+
- ArtifactsBucket
36+
Value: !Ref ArtifactsBucket
2837

2938
Resources:
3039
CloudFormationTrustRole:

cloudformation/continuous-integration-nightly-checks.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
AWSTemplateFormatVersion: 2010-09-09
2+
Transform: 'AWS::Serverless-2016-10-31'
23

34
Description: Perform continuous integration nightly checks on a CodeCommit repository with CodeBuild
45

@@ -7,6 +8,9 @@ Parameters:
78
Description: A CodeCommit repository that contains the application code. Must be in same region as this stack.
89
Type: String
910
Default: aws-codebuild-samples
11+
NotificationEmailAddress:
12+
Description: The email address where email notifications should be sent
13+
Type: String
1014

1115
Resources:
1216
NightlyEvent:
@@ -142,3 +146,45 @@ Resources:
142146
- - !Ref 'AWS::StackName'
143147
- CodeBuild
144148
Type: AWS::IAM::Role
149+
150+
EmailNotifications:
151+
Type: 'AWS::Serverless::Function'
152+
Properties:
153+
Handler: email_notifications.handler
154+
Runtime: nodejs8.10
155+
CodeUri: ../ci_tools
156+
Description: >-
157+
Sends emails when builds fail
158+
Policies:
159+
- AWSLambdaBasicExecutionRole
160+
- Version: '2012-10-17'
161+
Statement:
162+
- Effect: Allow
163+
Action:
164+
- ses:SendEmail
165+
- ses:SendRawEmail
166+
Resource: '*'
167+
- Effect: Allow
168+
Action:
169+
- logs:GetLogEvents
170+
Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/*"
171+
Events:
172+
BuildTrigger:
173+
Type: CloudWatchEvent
174+
Properties:
175+
Pattern:
176+
source:
177+
- aws.codebuild
178+
detail-type:
179+
- CodeBuild Build State Change
180+
detail:
181+
build-status:
182+
- FAILED
183+
- TIMED_OUT
184+
additional-information:
185+
initiator:
186+
- !Sub "rule/${NightlyEvent}"
187+
Environment:
188+
Variables:
189+
sourceEmailAddress: !Ref NotificationEmailAddress
190+
destinationEmailAddress: !Ref NotificationEmailAddress

0 commit comments

Comments
 (0)