-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
113 lines (79 loc) · 2.78 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
SHELL=/bin/bash
# === Name of the Cloudformation Stack
stack_name=$(shell whoami)-jenkins-ecs
# === Bucket containing S3 objects.
s3_bucket=jenkins-ecs-refarch-cloudformation
# === Bucket URL.
s3_bucket_url=https://s3.amazonaws.com/$(s3_bucket)
# === File containing Template Parameters
parameter_file?=stack_params.json
AWS:=$(shell command -v aws)
UPLOAD_COMMAND=$(AWS) s3 cp
SOURCE_FILES=$(shell find . -type f -name "*.cf.yml" -print)
CFN_TEMPLATES := $(patsubst %.cf.yml,%.yml,$(SOURCE_FILES))
AWS_ACCOUNT_ID?=$(shell $(AWS) sts get-caller-identity --query 'Account' --output text)
AWS_REGION?=us-east-1
export AWS_ACCOUNT_ID
export AWS_REGION
DOCKER:=$(shell command -v docker)
docker_image_tag=1.0.0
DOCKER_TAG?=$(shell whoami)/jenkins:$(docker_image_tag)
vpath %.cf.yml infrastructure
vpath %.cf.yml jenkins
define changeset_id
$(shell echo "$$(whoami)-$$($(AWS) cloudformation describe-stack-events \
--stack-name $(stack_name) \
--query 'StackEvents[0].EventId' \
--output json | cut -d'-' -f5 | cut -d'"' -f1)")
endef
.PHONY: lint upload plan apply create changeset-delete docker docker-publish
.DEFAULT_GOAL: lint
%.yml: %.cf.yml
$(UPLOAD_COMMAND) $< s3://$(s3_bucket)/$@
create plan apply changeset-delete: changeset_name?=$(changeset_id)
lint: $(SOURCE_FILES)
for i in $(SOURCE_FILES); do \
$(AWS) cloudformation validate-template \
--template-body file://$$i \
--output table \
--query 'Description' || echo "$$i Failed"; \
done
docker:
$(DOCKER) build \
--force-rm \
--compress \
--tag $(DOCKER_TAG) \
jenkins
docker-publish: ECR_REPO_URL=$(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(ECR_REPO):$(docker_image_tag)
docker-publish:
$(DOCKER) tag $(DOCKER_TAG) $(ECR_REPO_URL)
$(DOCKER) push $(ECR_REPO_URL)
create:
$(AWS) cloudformation create-change-set \
--stack-name '$(stack_name)' \
--template-url "$(s3_bucket_url)/stack.yml" \
--change-set-name '$(changeset_name)' \
--change-set-type 'CREATE' \
--description "Changeset: $(changeset_name)" \
--capabilities 'CAPABILITY_NAMED_IAM' \
--parameters file://$(parameter_file)
changeset-delete:
# Delete current changeset if it exists
$(AWS) cloudformation delete-change-set \
--change-set-name '$(changeset_name)' \
--stack-name '$(stack_name)' || true
plan: changeset-delete
# Create a new changeset
$(AWS) cloudformation create-change-set \
--stack-name '$(stack_name)' \
--template-url "$(s3_bucket_url)/stack.yml" \
--change-set-name '$(changeset_name)' \
--description "Changeset: $(changeset_name)" \
--change-set-type 'UPDATE' \
--capabilities 'CAPABILITY_NAMED_IAM' \
--parameters file://$(parameter_file)
apply:
$(AWS) cloudformation execute-change-set \
--stack-name '$(stack_name)' \
--change-set-name '$(changeset_name)'
upload: $(CFN_TEMPLATES)