-
Notifications
You must be signed in to change notification settings - Fork 7
/
.gitlab-ci.yml
140 lines (120 loc) · 4.7 KB
/
.gitlab-ci.yml
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
image: obezuk/gitlab-ci-cloudflare:latest
stages:
- build-test-stack
- deploy-test-app
- test-test-app
- destroy-test-app
- build-branch-stack
- deploy-branch-app
# Templates
.build-stack: &build_stack
script:
- aws cloudformation deploy --template-file ./cloudformation.yml --stack-name $STACK_NAME --no-fail-on-empty-changeset
.deploy-stack: &deploy_stack
script:
- cd src
- export APPLICATION_NAME=`aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='ApplicationName'].OutputValue" --output text`
- echo $APPLICATION_NAME
- export APPLICATION_ENDPOINT=`aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='Endpoint'].OutputValue" --output text`
- echo $APPLICATION_ENDPOINT
- export ENVIRONMENT_NAME=`aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='EnvironmentName'].OutputValue" --output text`
- echo $ENVIRONMENT_NAME
- mkdir -p .elasticbeanstalk
- cp ../elasticbeanstalk-config.tmpl.yml .elasticbeanstalk/config.yml
- sed -i "s~%%APPLICATION_NAME%%~${APPLICATION_NAME}~g" .elasticbeanstalk/config.yml
- sed -i "s~%%ENVIRONMENT_NAME%%~${ENVIRONMENT_NAME}~g" .elasticbeanstalk/config.yml
- sed -i "s~%%AWS_DEFAULT_REGION%%~${AWS_DEFAULT_REGION}~g" .elasticbeanstalk/config.yml
- cat .elasticbeanstalk/config.yml
- eb use $ENVIRONMENT_NAME
- eb deploy
.deploy-cloudflare-dns: &deploy_cloudflare_dns
script:
- export ENDPOINT=`aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='Endpoint'].OutputValue" --output text`
- echo $ENDPOINT;
- 'if cli4 --yaml name=${SUB}.${TLD} /zones/:${TLD}/dns_records | grep "name: ${SUB}.${TLD}"; then cli4 --delete /zones/:${TLD}/dns_records/:${SUB}.${TLD} && cli4 --yaml --post name="${SUB}" type="${TYPE}" content="${ENDPOINT}" proxied="true" /zones/:${TLD}/dns_records; else cli4 --yaml --post name="${SUB}" type="${TYPE}" content="${ENDPOINT}" proxied="true" /zones/:${TLD}/dns_records; fi'
.destroy-cloudflare-dns: &destroy_cloudflare_dns
script:
- 'if cli4 --yaml name=${SUB}.${TLD} /zones/:${TLD}/dns_records | grep "name: ${SUB}.${TLD}"; then cli4 --delete /zones/:${TLD}/dns_records/:${SUB}.${TLD}; else echo Skipping; fi'
.destroy-stack: &destroy_stack
script:
- aws cloudformation delete-stack --stack-name $STACK_NAME
- aws cloudformation wait stack-delete-complete --stack-name $STACK_NAME
# Test Stage
build-test-stack:
<<: *build_stack
stage: build-test-stack
variables:
STACK_NAME: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
test-test-app:
stage: test-test-app
script:
- curl https://${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}.${CF_DOMAIN} | grep "Hello world"
deploy-test-app:
<<: *deploy_stack
stage: deploy-test-app
variables:
STACK_NAME: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
deploy-test-dns:
<<: *deploy_cloudflare_dns
stage: deploy-test-app
variables:
TYPE: CNAME
SUB: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
STACK_NAME: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
TLD: ${CF_DOMAIN}
destroy-test-dns:
<<: *destroy_cloudflare_dns
stage: destroy-test-app
when: always # Destroy test dns regardless of Pipeline success
variables:
SUB: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
STACK_NAME: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
TLD: ${CF_DOMAIN}
destroy-test-app:
<<: *destroy_stack
stage: destroy-test-app
when: always # Destroy test environment regardless of Pipeline success
variables:
STACK_NAME: ${CI_PROJECT_NAME}-ci${CI_PIPELINE_ID}
# Review Apps
build-branch-stack:
<<: *build_stack
stage: build-branch-stack
environment:
name: $CI_COMMIT_REF_SLUG-app
on_stop: destroy-branch-app
variables:
STACK_NAME: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
deploy-branch-app:
<<: *deploy_stack
stage: deploy-branch-app
variables:
STACK_NAME: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
deploy-branch-dns:
<<: *deploy_cloudflare_dns
stage: deploy-branch-app
variables:
TYPE: CNAME
SUB: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
STACK_NAME: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
TLD: ${CF_DOMAIN}
destroy-branch-dns:
<<: *destroy_cloudflare_dns
stage: build-branch-stack
environment:
name: $CI_COMMIT_REF_SLUG-app
action: stop
when: manual
variables:
SUB: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
STACK_NAME: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}
TLD: ${CF_DOMAIN}
destroy-branch-app:
<<: *destroy_stack
stage: build-branch-stack
environment:
name: $CI_COMMIT_REF_SLUG-app
action: stop
when: manual
variables:
STACK_NAME: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_SLUG}