-
Notifications
You must be signed in to change notification settings - Fork 98
342 lines (292 loc) · 10.2 KB
/
test-and-ship.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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
name: Test & Ship
on:
- push
- pull_request
env:
CYPRESS_PROJECT_ID: '43gftm'
DEFAULT_NODE_VERSION: '16'
LC_ALL: en_US.UTF-8
TZ: UTC
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 30
## While tests are not fixed
continue-on-error: false
strategy:
matrix:
node_version:
- '14'
- '16'
- '18'
include:
- node_version: '16' # update along with DEFAULT_NODE_VERSION
run_lint_tests: 'True'
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node_version }}
- name: Get npm cache directory
id: npm-cache-dir
run: |
echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: |
set -e;
npm install;
- name: List installed dependencies
run: |
npm ls || true;
- uses: actions/cache@v3
id: eslint-cache
with:
path: ./.eslintcache
key: ${{ runner.os }}-eslint-${{ hashFiles('.eslintrc.js', './apps/**/.eslintrc.js') }}-${{ github.ref_name }}
restore-keys: |
${{ runner.os }}-eslint-${{ hashFiles('.eslintrc.js', './apps/**/.eslintrc.js') }}-${{ github.event.repository.default_branch }}
- name: Run lint tests (web)
if: ${{ matrix.run_lint_tests }}
run: |
npm run lint;
- name: Run lint tests (mobile)
if: ${{ matrix.run_lint_tests }}
run: |
npm run mobile:lint;
# TBD: we need to make tests runnable in a CI environment
# currently Karma doesn't finish
# - name: Run tests
# run: |
# npm run test;
e2e-test:
runs-on: ubuntu-latest
timeout-minutes: 30
continue-on-error: true
services:
mysql:
image: mariadb:10.11
ports:
- '33061:3306'
env:
MARIADB_ROOT_PASSWORD: root
MARIADB_DATABASE: ushahidi
MARIADB_USER: ushahidi
MARIADB_PASSWORD: ushahidi
LC_ALL: ${{ env.LC_ALL }}
TZ: ${{ env.TZ }}
redis:
image: redis:4-alpine
platform:
image: ghcr.io/ushahidi/platform:develop
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
ports:
- '8080:8080'
env:
APP_KEY: SomeRandomKey!!!SomeRandomKey!!!
DOCKERIZE_TIMEOUT: 180s
DOCKERIZE_WAIT_FOR_mysql: tcp://mysql:3306
DOCKERIZE_WAIT_FOR_redis: tcp://redis:6379
ENABLE_NGINX: 'true'
ENABLE_PHPFPM: 'true'
ENABLE_PLATFORM_TASKS: 'false'
DB_MIGRATIONS_HANDLED: 'false'
RUN_PLATFORM_MIGRATIONS: 'false'
DB_CONNECTION: mysql
DB_DATABASE: ushahidi
DB_HOST: mysql
DB_PORT: 3306
DB_USERNAME: ushahidi
DB_PASSWORD: ushahidi
REDIS_HOST: redis
CACHE_DRIVER: redis
QUEUE_DRIVER: redis
LC_ALL: ${{ env.LC_ALL }}
TZ: ${{ env.TZ }}
steps:
- uses: actions/checkout@v3
## set up API endpoint
- name: Setup API endpoint
run: |
set -ex;
SNAPSHOT_URL="https://ushahidi-static-web-assets.s3.eu-west-1.amazonaws.com/ushahidi-e2e-data-2023.07.05.sql.gz"
wget -O sql-snapshot.sql.gz ${SNAPSHOT_URL} 2>/dev/null || { echo "Failed downloading snapshot!" && exit 1; }
tmp_defaults=`mktemp`
echo -e "[client]\nhost=127.0.0.1\nuser=ushahidi\nport=33061\npassword=ushahidi" > $tmp_defaults
zcat sql-snapshot.sql.gz | mysql --defaults-extra-file=$tmp_defaults ushahidi
echo '!! Snapshot restored !!'
while ! docker exec ${{ job.services.platform.id }} /bin/true ; do
echo "Waiting for platform container to start..."
sleep 1
done
while ! docker exec ${{ job.services.platform.id }} util wait_bootstrap 60; do
echo "Platform still bootstrapping (logs follow)..."
docker logs ${{ job.services.platform.id }}
done
echo "Waiting for MySQL to be ready..."
docker exec ${{ job.services.platform.id }} util wait_for_mysql
echo "Running migrations..."
docker exec ${{ job.services.platform.id }} util run_migrations
- name: Verify and setup API endpoint
run: |
set -ex;
curl --fail http://localhost:8080/api/v3/config || \
{ echo "Failed getting API config!";
sleep 5;
docker logs ${{ job.services.platform.id }};
exit 1; }
env_file=./apps/web-mzima-client/src/env.json
env_json="$(jq '.backend_url = "http://localhost:8080"' $env_file)" &&
echo -E "${env_json}" > $env_file
## same as above step
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Get npm cache directory
id: npm-cache-dir
run: |
echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm install;
- name: Run server
run: |
npm run web:serve &
- name: Wait until the front-end is ready
run: |
retry() {
local -r -i max_attempts="$1"; shift
local -r cmd="$@"
local -i attempt_num=1
until $cmd
do
if (( attempt_num == max_attempts ))
then
echo "Attempt $attempt_num failed and there are no more attempts left!"
return 1
else
echo "Attempt $attempt_num failed! Trying again in $attempt_num seconds..."
sleep $(( attempt_num++ ))
fi
done;
}
server='http://localhost:4200'
retry 60 timeout 1 curl --silent ${server}/index.html || { echo "Failed getting index.html!" && exit 1; }
- name: Cypress run
uses: cypress-io/github-action@v5
with:
record: true
working-directory: e2e-testing
env:
CYPRESS_ush_admin_email: '${{secrets.e2e_ush_admin_email}}'
CYPRESS_ush_admin_pwd: '${{secrets.e2e_ush_admin_pwd}}'
CYPRESS_ush_admin_name: '${{secrets.e2e_ush_admin_name}}'
CYPRESS_ush_user_name: '${{secrets.e2e_ush_user_name}}'
CYPRESS_ush_user_email: '${{secrets.e2e_ush_user_email}}'
CYPRESS_ush_user_pwd: '${{secrets.e2e_ush_user_pwd}}'
CYPRESS_RECORD_KEY: ${{ secrets.E2E_CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ship:
needs: [test, e2e-test]
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_ECR_SECRET_ACCESS_KEY }}
aws-region: eu-west-1
- name: Login to AWS Container Registry
uses: docker/login-action@v1
with:
registry: 513259414768.dkr.ecr.eu-west-1.amazonaws.com
- name: Docker meta
id: meta
uses: docker/metadata-action@v3
with:
images: |
513259414768.dkr.ecr.eu-west-1.amazonaws.com/platform-client-mzima
tags: |
type=ref,event=branch
type=ref,event=pr
type=ref,event=tag
type=semver,pattern={{version}}
type=sha
- name: Build and push to Amazon ECR
uses: docker/build-push-action@v2
with:
pull: true
push: ${{ github.event_name != 'pull_request' }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
gh-release:
needs: [test]
runs-on: ubuntu-latest
timeout-minutes: 15
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.DEFAULT_NODE_VERSION }}
- name: Get npm cache directory
id: npm-cache-dir
run: |
echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: |
set -e;
npm install;
- name: prod build
id: bin_build
run: |
npm run web:build;
FILENAME="platform-client-mzima-${GITHUB_REF##*/}-bin.tar.gz"
tar -czv -f ${FILENAME} -C dist/apps/web-mzima-client/ . ;
rm -fr dist/apps/web-mzima-client;
echo "tarball=${FILENAME}" >> "$GITHUB_OUTPUT"
- name: dev build
id: bindev_build
run: |
npm run web:devbuild;
FILENAME="platform-client-mzima-${GITHUB_REF##*/}-bin-dev.tar.gz" ;
tar -czv -f ${FILENAME} -C dist/apps/web-mzima-client/ . ;
rm -fr dist/apps/web-mzima-client;
echo "tarball=${FILENAME}" >> "$GITHUB_OUTPUT"
- name: Release
uses: softprops/action-gh-release@v1
with:
draft: true
files: |
${{steps.bin_build.outputs.tarball}}
${{steps.bindev_build.outputs.tarball}}