UNPKG

8.5 kBYAMLView Raw
1stages:
2 - test
3 - upload
4 - bump
5 - publish
6 - review
7 - bake
8 - deploy
9
10before_script:
11 ## Update submodules
12 - git submodule sync --recursive
13 - git submodule update --init --recursive
14 ## Update repository
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 ## Setup remote to push back
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
35units:
36 stage: test
37 script:
38 - export CI_BUILD_ENVIRONMENT=sandbox
39 - . opskit/load-deployment-context.sh
40 ## Install all dependencies
41 - npm install
42 ## Run tests and parse coverage
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
53coverage report:
54 stage: upload
55 only:
56 - develop
57 script:
58 ## Avoid uploading coverage on new version
59 - if [[ ! -z $(git tag -l --points-at HEAD) ]] && [[ -z ${CI_BUILD_TAG} ]]; then exit 0; fi
60 ## Login to vault server
61 - export VAULT_TOKEN=$(vault write -field=token auth/approle/login role_id=${ROLE_ID})
62 ## Retrieve service account credentials
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
72version:
73 stage: bump
74 only:
75 - develop
76 - master
77 - production
78 script:
79 ## Avoid version bump on new version
80 - if [[ ! -z $(git tag -l --points-at HEAD) ]] && [[ -z ${CI_BUILD_TAG} ]]; then exit 0; fi
81 ## Calculate next version
82 - . opskit/next-version.sh
83 ## Avoid using any version prefix like 'v'
84 - npm config set tag-version-prefix ''
85 ## Bump, tag and commit next version
86 - 'npm version ${NEXT_VERSION} -m "ver: %s"'
87 ## Push the updated package.json back to repo
88 - git push back-to-gitlab
89 ## Push the new version tag back to repo
90 - git push back-to-gitlab refs/tags/${NEXT_VERSION}
91
92npm 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
108alpha:
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 ## Load deployment context
120 - . opskit/load-deployment-context.sh
121 ## Use current commit revision as version
122 - export VERSION=${CI_BUILD_TAG}
123 ## Configure deployment variables
124 - ./iac/configure-variables
125 ## Create an iac tarball
126 - tar -zcf iac.tar.gz iac
127 ## Compose an appropriate instance name
128 - instance_name='data-api'
129 ## Check if review instance is already up
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 ## Load deployment context
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 ## Configure deployment variables
165 - ./iac/configure-variables
166 ## Create an iac tarball
167 - tar -zcf iac.tar.gz iac
168 ## Bake image
169 - ./opskit/create-image
170 - ./opskit/deprecate-old-images ${CI_PROJECT_NAME}
171
172image on demo:
173 <<: *apply_bake_template
174 only:
175 - /beta/
176 variables:
177 CI_BUILD_ENVIRONMENT: 'demo'
178
179image 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 ## Load deployment context
193 - . opskit/load-deployment-context.sh
194 - it_name=data-api-it-$CI_PIPELINE_ID
195 ## Create instance template
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 ## Update instance groups with newly created instance template
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 ## Set new instance template
217 - gcloud compute instance-groups managed set-instance-template $ig_name
218 --template=$it_name
219 --zone=$ig_zone
220 ## Stop auto scaling for instance recreation
221 - set +e
222 - gcloud compute instance-groups managed stop-autoscaling $ig_name --zone=$ig_zone
223 - set -e
224 ## Recreate instances to use latest template
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 ## Enable autoscaling after instance recreation
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
243demo:
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
255production:
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