-
Notifications
You must be signed in to change notification settings - Fork 26
/
.gitlab-ci.yml
206 lines (186 loc) · 5.67 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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
image: docker:latest
services:
- docker:dind
stages:
- build
- test
- registry-update
- stage-deployment
- end-to-end-tests
- production-deployment
.build-template: &buildTemplate
stage: build
script:
# Build the image
- docker build --build-arg VERSION=$BUILD_VERSION --target $BUILD_TARGET -t $BUILD_IMAGE:$BUILD_TARGET -f $BUILD_DOCKERFILE $BUILD_CONTEXT
after_script:
# Save the image as an artifact
- mkdir -p build/$BUILD_IMAGE
- docker save $BUILD_IMAGE:$BUILD_TARGET -o build/$BUILD_IMAGE/$BUILD_TARGET.tar
artifacts:
name: $CI_JOB_NAME-${CI_COMMIT_SHA:0:8}
expire_in: 1 day
paths:
- build/$BUILD_IMAGE
dependencies: []
build-php-fpm-test:
<<: *buildTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-php-fpm
BUILD_TARGET: test
BUILD_DOCKERFILE: docker/php-fpm/Dockerfile
BUILD_CONTEXT: .
before_script:
# Export build version
- source .env && export BUILD_VERSION=$PHP_VERSION
build-php-fpm-prod:
<<: *buildTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-php-fpm
BUILD_TARGET: prod
BUILD_DOCKERFILE: docker/php-fpm/Dockerfile
BUILD_CONTEXT: .
before_script:
# Export build version
- source .env && export BUILD_VERSION=$PHP_VERSION
build-nginx-prod:
<<: *buildTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-nginx
BUILD_TARGET: prod
BUILD_DOCKERFILE: docker/nginx/Dockerfile
BUILD_CONTEXT: .
before_script:
# Export build version
- source .env && export BUILD_VERSION=$NGINX_VERSION
build-mysql-prod:
<<: *buildTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-mysql
BUILD_TARGET: prod
BUILD_DOCKERFILE: docker/mysql/Dockerfile
BUILD_CONTEXT: docker/mysql
before_script:
# Export build version
- source .env && export BUILD_VERSION=$MYSQL_VERSION
unit-tests:
stage: test
before_script:
# Load php image from the build stage
- docker load -i build/symfony-dummy-project-php-fpm/test.tar
script:
- docker run --rm symfony-dummy-project-php-fpm:test bin/phpunit --testsuit unit --testdox
dependencies:
- build-php-fpm-test
integration-tests:
stage: test
before_script:
# Load php image from the build stage
- docker load -i build/symfony-dummy-project-php-fpm/test.tar
- docker load -i build/symfony-dummy-project-mysql/prod.tar
# Start mysql
- source .env
- docker network create symfony-dummy-project-net
- docker run --rm -d --network symfony-dummy-project-net --network-alias mysql -e MYSQL_DATABASE=$MYSQL_DATABASE -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD symfony-dummy-project-mysql:prod
script:
- docker run --rm --network symfony-dummy-project-net symfony-dummy-project-php-fpm:test sh -c "sh ci/check-connection mysql 3306 && bin/phpunit --testsuit integration --testdox"
dependencies:
- build-php-fpm-test
- build-mysql-prod
.registry-update-template: ®istryUpdateTemplate
stage: registry-update
before_script:
# Load image from the build stage
- docker load -i build/$BUILD_IMAGE/$BUILD_TARGET.tar
script:
# Tag the image
- docker tag $BUILD_IMAGE:$BUILD_TARGET babenkoivan/$BUILD_IMAGE:${CI_COMMIT_SHA:0:8}
# Push the image
- echo $CONTAINER_REGISTRY_PASSWORD | docker login -u $CONTAINER_REGISTRY_USER --password-stdin
- docker push babenkoivan/$BUILD_IMAGE:${CI_COMMIT_SHA:0:8}
only:
- master
registry-update-php-fpm:
<<: *registryUpdateTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-php-fpm
BUILD_TARGET: prod
dependencies:
- build-php-fpm-prod
registry-update-nginx:
<<: *registryUpdateTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-nginx
BUILD_TARGET: prod
dependencies:
- build-nginx-prod
registry-update-mysql:
<<: *registryUpdateTemplate
variables:
BUILD_IMAGE: symfony-dummy-project-mysql
BUILD_TARGET: prod
dependencies:
- build-mysql-prod
.deploy-template: &deployTemplate
image: babenkoivan/helm-gke
before_script:
# Fetch cluster credentials
- sh ci/fetch-cluster-credentials $SERVICE_ACCOUNT_KEY $CLUSTER_NAME $CLUSTER_ZONE
script:
- helm upgrade symfony-dummy-project helm --install --set-string phpfpm.env.plain.APP_ENV=$ENVIRONMENT,nginx.host=$HOST,imageTag=${CI_COMMIT_SHA:0:8} --namespace symfony-dummy-project
dependencies: []
only:
- master
deploy-staging:
<<: *deployTemplate
variables:
ENVIRONMENT: stage
CLUSTER_NAME: $CLUSTER_NAME_STAGE
CLUSTER_ZONE: $CLUSTER_ZONE_STAGE
HOST: $HOST_STAGE
stage: stage-deployment
after_script:
# Wait for the rollout to complete
- sh ci/wait-for-rollout symfony-dummy-project
deploy-production:
<<: *deployTemplate
variables:
ENVIRONMENT: prod
CLUSTER_NAME: $CLUSTER_NAME_PROD
CLUSTER_ZONE: $CLUSTER_ZONE_PROD
HOST: $HOST_PROD
stage: production-deployment
when: manual
end-to-end-test:
stage: end-to-end-tests
image:
name: postman/newman:alpine
entrypoint: [""]
script:
- newman run -e tests/EndToEnd/env.stage.json tests/EndToEnd/collection.json
dependencies: []
only:
- master
.rollback-template: &rollbackTemplate
image: babenkoivan/helm-gke
before_script:
# Fetch cluster credentials
- sh ci/fetch-cluster-credentials $SERVICE_ACCOUNT_KEY $CLUSTER_NAME $CLUSTER_ZONE
script:
- helm rollback symfony-dummy-project 0
dependencies: []
when: manual
only:
- master
rollback-staging:
<<: *rollbackTemplate
variables:
CLUSTER_NAME: $CLUSTER_NAME_STAGE
CLUSTER_ZONE: $CLUSTER_ZONE_STAGE
stage: stage-deployment
rollback-production:
<<: *rollbackTemplate
variables:
CLUSTER_NAME: $CLUSTER_NAME_PROD
CLUSTER_ZONE: $CLUSTER_ZONE_PROD
stage: production-deployment