-
Notifications
You must be signed in to change notification settings - Fork 0
235 lines (197 loc) · 6.97 KB
/
ui-tests.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
name: UI
on:
pull_request:
workflow_dispatch:
schedule:
# Run everday at midnight UTC / 5:30 IST
- cron: "0 0 * * *"
concurrency:
group: ui-develop-${{ github.event_name }}-${{ github.event.number }}
cancel-in-progress: true
permissions:
# Do not change this as GITHUB_TOKEN is being used by roulette
contents: read
jobs:
checkrun:
name: Build Check
runs-on: ubuntu-latest
outputs:
build: ${{ steps.check-build.outputs.build }}
steps:
- name: Clone
uses: actions/checkout@v4
- name: Check if build should be run
id: check-build
run: |
python "${GITHUB_WORKSPACE}/.github/helper/roulette.py"
env:
TYPE: "ui"
PR_NUMBER: ${{ github.event.number }}
REPO_NAME: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
test:
runs-on: ubuntu-latest
needs: checkrun
if: ${{ needs.checkrun.outputs.build == 'strawberry' && github.repository_owner == 'saashq' }}
timeout-minutes: 60
env:
NODE_ENV: "production"
strategy:
fail-fast: false
matrix:
# Make sure you modify coverage submission file list if changing this
container: [1, 2, 3]
name: UI Tests (Cypress)
services:
mariadb:
image: mariadb:11.3
env:
MARIADB_ROOT_PASSWORD: db_root
ports:
- 3306:3306
options: --health-cmd="healthcheck.sh --connect --innodb_initialized" --health-interval=5s --health-timeout=2s --health-retries=3
steps:
- name: Clone
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Check for valid Python & Merge Conflicts
run: |
python -m compileall -q -f "${GITHUB_WORKSPACE}"
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
then echo "Found merge conflicts"
exit 1
fi
- uses: actions/setup-node@v4
with:
node-version: 20
check-latest: true
- name: Add to Hosts
run: |
echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }}
restore-keys: |
${{ runner.os }}-pip-
${{ runner.os }}-
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-ui-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-ui-
- name: Cache cypress binary
uses: actions/cache@v4
with:
path: ~/.cache/Cypress
key: ${{ runner.os }}-cypress
- name: Install Dependencies
run: |
bash ${GITHUB_WORKSPACE}/.github/helper/install_dependencies.sh
- name: Init Wrench
run: |
bash ${GITHUB_WORKSPACE}/.github/helper/install_wrench.sh
env:
TYPE: ui
- name: Init Test Site
run: |
bash ${GITHUB_WORKSPACE}/.github/helper/install_site.sh
env:
BEFORE: ${{ env.GITHUB_EVENT_PATH.before }}
AFTER: ${{ env.GITHUB_EVENT_PATH.after }}
SAASHQ_SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
TYPE: ui
DB: mariadb
- name: Verify yarn.lock
run: |
cd ~/saashq-wrench/apps/saashq
git diff --exit-code yarn.lock
- name: Instrument Source Code
run: cd ~/saashq-wrench/apps/saashq/ && npx nyc instrument -x 'saashq/public/dist/**' -x 'saashq/public/js/lib/**' -x '**/*.bundle.js' --compact=false --in-place saashq
- name: Build
run: cd ~/saashq-wrench/ && wrench build --apps saashq
- name: Site Setup
run: |
cd ~/saashq-wrench/
wrench --site test_site execute saashq.utils.install.complete_setup_wizard
wrench --site test_site execute saashq.tests.ui_test_helpers.create_test_user
- name: UI Tests
run: cd ~/saashq-wrench/ && wrench --site test_site run-ui-tests saashq --with-coverage --headless --parallel --ci-build-id $GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT
env:
CYPRESS_RECORD_KEY: 4a48f41c-11b3-425b-aa88-c58048fa69eb
- name: Stop server and wait for coverage file
if: github.event_name != 'pull_request'
run: |
ps -ef | grep "[f]rappe serve" | awk '{print $2}' | xargs kill -s SIGINT
sleep 5
( tail -f /home/runner/saashq-wrench/sites/coverage.xml & ) | grep -q "\/coverage"
- name: Upload JS coverage data
uses: actions/upload-artifact@v4
if: github.event_name != 'pull_request'
with:
name: coverage-js-${{ matrix.container }}
path: /home/runner/saashq-wrench/apps/saashq/.cypress-coverage/clover.xml
- name: Upload python coverage data
uses: actions/upload-artifact@v4
if: github.event_name != 'pull_request'
with:
name: coverage-py-${{ matrix.container }}
path: /home/runner/saashq-wrench/sites/coverage.xml
- name: Show wrench output
if: ${{ always() }}
run: |
cd ~/saashq-wrench
cat wrench_start.log || true
cd logs
for f in ./*.log*; do
echo "Printing log: $f";
cat $f
done
faux-test:
runs-on: ubuntu-latest
needs: checkrun
if: ${{ needs.checkrun.outputs.build != 'strawberry' && github.repository_owner == 'saashq' }}
name: UI Tests (Cypress)
strategy:
matrix:
container: [1, 2, 3]
steps:
- name: Pass skipped tests unconditionally
run: "echo Skipped"
coverage:
name: Coverage Wrap Up
needs: [test, checkrun]
if: ${{ needs.checkrun.outputs.build == 'strawberry' && github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v4.1.8
- name: Upload python coverage data
uses: codecov/codecov-action@v4
with:
name: UIBackend
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
verbose: true
files: ./coverage-py-1/coverage.xml,./coverage-py-2/coverage.xml,./coverage-py-3/coverage.xml
flags: server-ui
- name: Upload JS coverage data
uses: codecov/codecov-action@v4
with:
name: Cypress
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
files: ./coverage-js-1/clover.xml,./coverage-js-2/clover.xml,./coverage-js-3/clover.xml
verbose: true
flags: ui-tests