@@ -41,98 +41,162 @@ permissions:
4141 contents : read # This is required for actions/checkout
4242
4343jobs :
44+ install-dependencies :
45+ name : " Install dependencies"
46+ runs-on : ubuntu-latest
47+ timeout-minutes : 5
48+ steps :
49+ - name : " Checkout code"
50+ 51+ - name : " Restore node_modules from cache"
52+ uses : ./.github/actions/node-modules-cache
53+ with :
54+ node_version : " ${{ inputs.nodejs_version }}"
55+ skip_restore : true
56+
57+ discover-workspaces :
58+ runs-on : ubuntu-latest
59+ outputs :
60+ matrix : ${{ steps.get-workspaces.outputs.matrix }}
61+ steps :
62+ - name : " Checkout code"
63+ 64+ - name : " Get workspaces"
65+ id : " get-workspaces"
66+ run : |
67+ echo "matrix=$(jq -c '.workspaces' package.json)" >> "$GITHUB_OUTPUT"
68+
4469 check-generated-dependencies :
4570 name : " Check generated dependencies"
4671 runs-on : ubuntu-latest
4772 timeout-minutes : 5
73+ needs : [install-dependencies]
4874 steps :
4975 - name : " Checkout code"
507651- - name : " Repo setup"
52- run : |
53- npm ci
77+ - name : " Restore node_modules from cache"
78+ uses : ./.github/actions/node-modules-cache
79+ with :
80+ node_version : " ${{ inputs.nodejs_version }}"
5481 - name : " Generate dependencies"
5582 run : |
5683 npm run generate-dependencies --workspaces --if-present
5784 git diff --exit-code
85+
5886 test-unit :
5987 name : " Unit tests"
6088 runs-on : ubuntu-latest
6189 timeout-minutes : 5
90+ needs : [install-dependencies, discover-workspaces]
91+ strategy :
92+ fail-fast : false
93+ matrix :
94+ workspace : ${{ fromJSON(needs.discover-workspaces.outputs.matrix) }}
6295 steps :
6396 - name : " Checkout code"
649765- - name : " Repo setup"
66- run : |
67- npm ci
98+ - name : " Restore node_modules from cache"
99+ uses : ./.github/actions/node-modules-cache
100+ with :
101+ node_version : " ${{ inputs.nodejs_version }}"
68102 - name : " Generate dependencies"
69103 run : |
70104 npm run generate-dependencies --workspaces --if-present
71105 - name : " Run unit test suite"
72106 run : |
73- make test-unit
74- - name : " Save the result of fast test suite"
107+ WORKSPACE=${{ matrix.workspace }} make test-unit
108+ - name : Compute safe artifact names
109+ id : names
110+ shell : bash
111+ run : |
112+ echo "safe=$(echo '${{ matrix.workspace }}' | tr '/' '-_')" >> "$GITHUB_OUTPUT"
113+ - name : " Save the result of test suite"
75114 uses : actions/upload-artifact@v4
76115 with :
77- name : unit-tests
78- path : " ** /.reports/unit"
116+ name : unit-tests-${{ steps.names.outputs.safe }}
117+ path : " ${{ matrix.workspace }} /.reports/unit"
79118 include-hidden-files : true
119+ if-no-files-found : ignore
80120 if : always()
81121 - name : " Save the result of code coverage"
82122 uses : actions/upload-artifact@v4
83123 with :
84- name : code-coverage-report
85- path : " .reports/lcov.info"
124+ name : code-coverage-${{ steps.names.outputs.safe }}
125+ path : " ${{ matrix.workspace }}/.reports/unit/coverage/lcov.info"
126+ if-no-files-found : ignore
86127 if : always()
128+
87129 test-lint :
88130 name : " Linting"
89131 runs-on : ubuntu-latest
90132 timeout-minutes : 5
133+ needs : [install-dependencies]
91134 steps :
92135 - name : " Checkout code"
9313694- - name : " Repo setup"
95- run : |
96- npm ci
137+ - name : " Restore node_modules from cache"
138+ uses : ./.github/actions/node-modules-cache
139+ with :
140+ node_version : " ${{ inputs.nodejs_version }}"
97141 - name : " Generate dependencies"
98142 run : |
99143 npm run generate-dependencies --workspaces --if-present
100144 - name : " Run linting"
101145 run : |
102146 make test-lint
147+
103148 test-typecheck :
104149 name : " Typecheck"
105150 runs-on : ubuntu-latest
106151 timeout-minutes : 5
152+ needs : [install-dependencies]
107153 steps :
108154 - name : " Checkout code"
109155110- - name : " Repo setup"
111- run : |
112- npm ci
156+ - name : " Restore node_modules from cache"
157+ uses : ./.github/actions/node-modules-cache
158+ with :
159+ node_version : " ${{ inputs.nodejs_version }}"
113160 - name : " Generate dependencies"
114161 run : |
115162 npm run generate-dependencies --workspaces --if-present
116163 - name : " Run typecheck"
117164 run : |
118165 make test-typecheck
119- test-coverage :
120- name : " Test coverage"
121- needs : [test-unit]
166+
167+ merge- coverage:
168+ name : " Merge coverage "
122169 runs-on : ubuntu-latest
123- timeout-minutes : 5
170+ needs : [test-unit]
124171 steps :
125- - name : " Checkout code"
126- 127- - name : " Run test coverage check"
128- run : |
129- make test-coverage
130- - name : " Save the coverage check result"
172+ - uses : actions/checkout@v5
173+
174+ - name : Download coverage artifacts
175+ uses : actions/download-artifact@v4
176+ with :
177+ pattern : code-coverage-*
178+ merge-multiple : false
179+ path : ./_cov_parts
180+
181+ - name : Merge LCOV files
131182 run : |
132- echo "Nothing to save"
183+ set -euo pipefail
184+ mkdir -p .reports
185+ npx --yes lcov-result-merger \
186+ "./_cov_parts/**/lcov.info" \
187+ ".reports/lcov.info" \
188+ --ignore "node_modules" \
189+ --prepend-source-files
190+
191+ - name : Upload merged LCOV
192+ uses : actions/upload-artifact@v4
193+ with :
194+ name : code-coverage-report
195+ path : .reports/lcov.info
196+
133197 perform-static-analysis :
134198 name : " Perform static analysis"
135- needs : [test-unit]
199+ needs : [test-unit, merge-coverage ]
136200 runs-on : ubuntu-latest
137201 permissions :
138202 id-token : write
0 commit comments