1 | stages:
|
2 | - test
|
3 | - upload
|
4 | - bump
|
5 | - publish
|
6 | - review
|
7 | - bake
|
8 | - deploy
|
9 |
|
10 | before_script:
|
11 |
|
12 | - git submodule sync --recursive
|
13 | - git submodule update --init --recursive
|
14 |
|
15 | - git fetch --prune origin
|
16 | - git checkout develop && git pull
|
17 | - git checkout master && git pull
|
18 | - git checkout production && git pull
|
19 | - if [[ -z ${CI_BUILD_TAG} ]]; then
|
20 | - git checkout "${CI_BUILD_REF_NAME}" && git pull
|
21 | - else
|
22 | - git checkout tags/"${CI_BUILD_REF_NAME}"
|
23 | - fi
|
24 |
|
25 | - if [[ ! -z $(git remote -v | grep back-to-gitlab) ]]; then git remote remove back-to-gitlab; fi
|
26 | - gitlab_origin=$(echo $CI_BUILD_REPO | sed 's|^.*@|http://gitlab-runner@|' | sed "s|@|:${GITLAB_RUNNER_PASSWORD}@|")
|
27 | - git config --global push.default simple
|
28 | - git config --global user.name "GitLab Runner"
|
29 | - git config --global user.email "gitlab-runner@arisan.io"
|
30 | - git remote add back-to-gitlab $gitlab_origin
|
31 | ## Ensure Nodejs installed
|
32 | - source ~/.nvm/nvm.sh
|
33 | - nvm install 6.9.2
|
34 |
|
35 | units:
|
36 | stage: test
|
37 | script:
|
38 | - export CI_BUILD_ENVIRONMENT=sandbox
|
39 | - . opskit/load-deployment-context.sh
|
40 |
|
41 | - npm install
|
42 |
|
43 | - export CLIO_MONGO_URL=$TEST_MONGO_URL
|
44 | - npm run cover
|
45 | artifacts:
|
46 | paths:
|
47 | - coverage/lcov-report/
|
48 | cache:
|
49 | key: $CI_BUILD_NAME
|
50 | paths:
|
51 | - node_modules/
|
52 |
|
53 | coverage report:
|
54 | stage: upload
|
55 | only:
|
56 | - develop
|
57 | script:
|
58 |
|
59 | - if [[ ! -z $(git tag -l --points-at HEAD) ]] && [[ -z ${CI_BUILD_TAG} ]]; then exit 0; fi
|
60 |
|
61 | - export VAULT_TOKEN=$(vault write -field=token auth/approle/login role_id=${ROLE_ID})
|
62 |
|
63 | - vault read -format json secret/io-arisan-ci | jq '.data' > account.json
|
64 | ## Activate service account
|
65 | - gcloud auth activate-service-account --key-file account.json
|
66 | ## Prepare coverage report to be uploaded
|
67 | - cd coverage
|
68 | - mv lcov-report data-api
|
69 | ## Upload coverage report
|
70 | - gsutil -m cp -r data-api gs://coverage.arisan.io
|
71 |
|
72 | version:
|
73 | stage: bump
|
74 | only:
|
75 | - develop
|
76 | - master
|
77 | - production
|
78 | script:
|
79 |
|
80 | - if [[ ! -z $(git tag -l --points-at HEAD) ]] && [[ -z ${CI_BUILD_TAG} ]]; then exit 0; fi
|
81 |
|
82 | - . opskit/next-version.sh
|
83 |
|
84 | - npm config set tag-version-prefix ''
|
85 |
|
86 | - 'npm version ${NEXT_VERSION} -m "ver: %s"'
|
87 |
|
88 | - git push back-to-gitlab
|
89 |
|
90 | - git push back-to-gitlab refs/tags/${NEXT_VERSION}
|
91 |
|
92 | npm package:
|
93 | stage: publish
|
94 | only:
|
95 | - tags
|
96 | script:
|
97 | - npm install
|
98 | - packaged_name=$(node -e "console.log(require('./package.json').name)")
|
99 | - packaged_version=$(node -e "console.log(require('./package.json').version)")
|
100 | - if [[ -z $(npm info $packaged_name@$packaged_version) ]]; then
|
101 | - npm publish
|
102 | - fi
|
103 | cache:
|
104 | key: $CI_BUILD_NAME
|
105 | paths:
|
106 | - node_modules/
|
107 |
|
108 | alpha:
|
109 | stage: review
|
110 | only:
|
111 | - /alpha/
|
112 | except:
|
113 | - branches
|
114 | variables:
|
115 | CI_BUILD_ENVIRONMENT: 'sandbox'
|
116 | environment:
|
117 | name: 'sandbox'
|
118 | script:
|
119 |
|
120 | - . opskit/load-deployment-context.sh
|
121 |
|
122 | - export VERSION=${CI_BUILD_TAG}
|
123 |
|
124 | - ./iac/configure-variables
|
125 |
|
126 | - tar -zcf iac.tar.gz iac
|
127 |
|
128 | - instance_name='data-api'
|
129 |
|
130 | - instance_count=$(gcloud compute instances list
|
131 | --filter="name=${instance_name}"
|
132 | --format='(name)' | tail -n -1 | wc -l)
|
133 | ## Create an instance if review instance is not already up
|
134 | - if [[ "${instance_count}" -lt "1" ]]; then
|
135 | - gcloud compute instances create ${instance_name}
|
136 | --machine-type=${DATA_API_MACHINE_TYPE}
|
137 | --image-project=ubuntu-os-cloud
|
138 | --image-family=ubuntu-1404-lts
|
139 | --tags=http-server
|
140 | - sleep 30
|
141 | - fi
|
142 | ## Cleanup staging area before installation
|
143 | - gcloud compute ssh ubuntu@${instance_name} -- sudo bash -e <<HERE
|
144 | - rm -rf /tmp/*
|
145 | - HERE
|
146 | ## Copy iac tarballs and setup script to instance
|
147 | - gcloud compute copy-files iac.tar.gz iac/setup ${instance_name}:/tmp/
|
148 | ## Run setup script
|
149 | - gcloud compute ssh ubuntu@${instance_name} -- sudo bash -e <<HERE
|
150 | - /tmp/setup
|
151 | - HERE
|
152 |
|
153 | .bake_template: &apply_bake_template
|
154 | stage: bake
|
155 | except:
|
156 | - branches
|
157 | script:
|
158 |
|
159 | - . opskit/load-deployment-context.sh
|
160 | - export ACCOUNT_FILE='account.json'
|
161 | - export PACKER_TEMPLATE='iac/packer.json'
|
162 | - export TARGET_IMAGE_NAME=data-api-${CI_PIPELINE_ID}
|
163 | - export VERSION=$CI_BUILD_TAG
|
164 |
|
165 | - ./iac/configure-variables
|
166 |
|
167 | - tar -zcf iac.tar.gz iac
|
168 |
|
169 | - ./opskit/create-image
|
170 | - ./opskit/deprecate-old-images ${CI_PROJECT_NAME}
|
171 |
|
172 | image on demo:
|
173 | <<: *apply_bake_template
|
174 | only:
|
175 | - /beta/
|
176 | variables:
|
177 | CI_BUILD_ENVIRONMENT: 'demo'
|
178 |
|
179 | image on production:
|
180 | <<: *apply_bake_template
|
181 | only:
|
182 | - tags
|
183 | except:
|
184 | - /alpha/
|
185 | - /beta/
|
186 | variables:
|
187 | CI_BUILD_ENVIRONMENT: 'production'
|
188 |
|
189 | .deploy_template: &apply_deploy_template
|
190 | stage: deploy
|
191 | script:
|
192 |
|
193 | - . opskit/load-deployment-context.sh
|
194 | - it_name=data-api-it-$CI_PIPELINE_ID
|
195 |
|
196 | - existing_template=$(gcloud compute instance-templates list
|
197 | --filter="name=${it_name}"
|
198 | --format='value(name)')
|
199 | - if [[ -z $existing_template ]]; then
|
200 | - gcloud compute instance-templates create $it_name
|
201 | --machine-type "$DATA_API_MACHINE_TYPE"
|
202 | --image data-api-$CI_PIPELINE_ID
|
203 | --boot-disk-type pd-ssd
|
204 | --tags "http-server"
|
205 | - fi
|
206 |
|
207 | - groups=$(gcloud compute instance-groups managed list
|
208 | --filter="name~^${CI_PROJECT_NAME}-ig-.*$"
|
209 | --format='csv[no-heading](name,zone)')
|
210 | - echo ${groups}
|
211 | - echo "${groups}"
|
212 | - while read -r group; do
|
213 | - IFS=',' ig_desc=($group)
|
214 | - ig_name=${ig_desc[0]}
|
215 | - ig_zone=${ig_desc[1]}
|
216 |
|
217 | - gcloud compute instance-groups managed set-instance-template $ig_name
|
218 | --template=$it_name
|
219 | --zone=$ig_zone
|
220 |
|
221 | - set +e
|
222 | - gcloud compute instance-groups managed stop-autoscaling $ig_name --zone=$ig_zone
|
223 | - set -e
|
224 |
|
225 | - for i in $(gcloud compute instance-groups managed list-instances $ig_name
|
226 | --zone=$ig_zone
|
227 | --format='value(instance)'); do
|
228 | - echo $i;
|
229 | - gcloud compute instance-groups managed recreate-instances $ig_name
|
230 | --instances=$i
|
231 | --zone=$ig_zone
|
232 | - gcloud compute instance-groups managed wait-until-stable $ig_name
|
233 | --zone=$ig_zone
|
234 | - done
|
235 |
|
236 | - gcloud compute instance-groups managed set-autoscaling $ig_name --zone=$ig_zone
|
237 | --max-num-replicas=3
|
238 | --min-num-replicas=1
|
239 | --scale-based-on-cpu
|
240 | --target-cpu-utilization=0.8
|
241 | - done <<< "${groups}"
|
242 |
|
243 | demo:
|
244 | <<: *apply_deploy_template
|
245 | only:
|
246 | - /beta/
|
247 | except:
|
248 | - branches
|
249 | variables:
|
250 | CI_BUILD_ENVIRONMENT: 'demo'
|
251 | MODULE_NAME: $CI_PROJECT_NAME
|
252 | environment:
|
253 | name: demo
|
254 |
|
255 | production:
|
256 | <<: *apply_deploy_template
|
257 | except:
|
258 | - branches
|
259 | - /alpha/
|
260 | - /beta/
|
261 | variables:
|
262 | CI_BUILD_ENVIRONMENT: 'production'
|
263 | MODULE_NAME: $CI_PROJECT_NAME
|
264 | environment:
|
265 | name: production
|