@@ -39,105 +39,149 @@ env:
3939permissions :
4040 id-token : write # This is required for requesting the JWT
4141 contents : read # This is required for actions/checkout
42- packages : read # This is required to install packages from GitHub package registry
4342
4443jobs :
44+ discover-workspaces :
45+ runs-on : ubuntu-latest
46+ outputs :
47+ matrix : ${{ steps.get-workspaces.outputs.matrix }}
48+ steps :
49+ - name : " Checkout code"
50+ 51+ - name : " Get workspaces"
52+ id : " get-workspaces"
53+ run : |
54+ echo "matrix=$(jq -c '.workspaces' package.json)" >> "$GITHUB_OUTPUT"
55+
4556 check-generated-dependencies :
4657 name : " Check generated dependencies"
4758 runs-on : ubuntu-latest
4859 timeout-minutes : 5
4960 steps :
5061 - name : " Checkout code"
516252- - name : " Repo setup "
53- run : make dependencies
54- env :
55- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
63+ - name : " Restore node_modules from cache "
64+ uses : ./.github/actions/node-modules-cache
65+ with :
66+ node_version : " ${{ inputs.nodejs_version }}"
5667 - name : " Generate dependencies"
5768 run : |
5869 npm run generate-dependencies --workspaces --if-present
5970 git diff --exit-code
71+
6072 test-unit :
6173 name : " Unit tests"
6274 runs-on : ubuntu-latest
6375 timeout-minutes : 5
76+ needs : [discover-workspaces]
77+ strategy :
78+ fail-fast : false
79+ matrix :
80+ workspace : ${{ fromJSON(needs.discover-workspaces.outputs.matrix) }}
6481 steps :
6582 - name : " Checkout code"
668367- - name : " Repo setup "
68- run : make dependencies
69- env :
70- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
84+ - name : " Restore node_modules from cache "
85+ uses : ./.github/actions/node-modules-cache
86+ with :
87+ node_version : " ${{ inputs.nodejs_version }}"
7188 - name : " Generate dependencies"
7289 run : |
7390 npm run generate-dependencies --workspaces --if-present
7491 - name : " Run unit test suite"
7592 run : |
76- make test-unit
77- - name : " Save the result of fast test suite"
93+ WORKSPACE=${{ matrix.workspace }} make test-unit
94+ - name : Compute safe artifact names
95+ id : names
96+ shell : bash
97+ run : |
98+ echo "safe=$(echo '${{ matrix.workspace }}' | tr '/' '-_')" >> "$GITHUB_OUTPUT"
99+ - name : " Save the result of test suite"
78100 uses : actions/upload-artifact@v4
79101 with :
80- name : unit-tests
81- path : " ** /.reports/unit"
102+ name : unit-tests-${{ steps.names.outputs.safe }}
103+ path : " ${{ matrix.workspace }} /.reports/unit"
82104 include-hidden-files : true
105+ if-no-files-found : ignore
83106 if : always()
84107 - name : " Save the result of code coverage"
85108 uses : actions/upload-artifact@v4
86109 with :
87- name : code-coverage-report
88- path : " .reports/lcov.info"
110+ name : code-coverage-${{ steps.names.outputs.safe }}
111+ path : " ${{ matrix.workspace }}/.reports/unit/coverage/lcov.info"
112+ if-no-files-found : ignore
89113 if : always()
114+
90115 test-lint :
91116 name : " Linting"
92117 runs-on : ubuntu-latest
93118 timeout-minutes : 5
94119 steps :
95120 - name : " Checkout code"
9612197- - name : " Repo setup "
98- run : make dependencies
99- env :
100- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
122+ - name : " Restore node_modules from cache "
123+ uses : ./.github/actions/node-modules-cache
124+ with :
125+ node_version : " ${{ inputs.nodejs_version }}"
101126 - name : " Generate dependencies"
102127 run : |
103128 npm run generate-dependencies --workspaces --if-present
104129 - name : " Run linting"
105130 run : |
106131 make test-lint
132+
107133 test-typecheck :
108134 name : " Typecheck"
109135 runs-on : ubuntu-latest
110136 timeout-minutes : 5
111137 steps :
112138 - name : " Checkout code"
113139114- - name : " Repo setup "
115- run : make dependencies
116- env :
117- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
140+ - name : " Restore node_modules from cache "
141+ uses : ./.github/actions/node-modules-cache
142+ with :
143+ node_version : " ${{ inputs.nodejs_version }}"
118144 - name : " Generate dependencies"
119145 run : |
120146 npm run generate-dependencies --workspaces --if-present
121147 - name : " Run typecheck"
122148 run : |
123149 make test-typecheck
124- test-coverage :
125- name : " Test coverage"
126- needs : [test-unit]
150+
151+ merge- coverage:
152+ name : " Merge coverage "
127153 runs-on : ubuntu-latest
128- timeout-minutes : 5
154+ needs : [test-unit]
129155 steps :
130- - name : " Checkout code"
131- 132- - name : " Run test coverage check"
133- run : |
134- make test-coverage
135- - name : " Save the coverage check result"
156+ - uses : actions/checkout@v5
157+
158+ - name : Download coverage artifacts
159+ uses : actions/download-artifact@v4
160+ with :
161+ pattern : code-coverage-*
162+ merge-multiple : false
163+ path : ./_cov_parts
164+
165+ - name : Merge LCOV files
136166 run : |
137- echo "Nothing to save"
167+ set -euo pipefail
168+ mkdir -p .reports
169+ npx --yes lcov-result-merger \
170+ "./_cov_parts/**/lcov.info" \
171+ ".reports/lcov.info" \
172+ --ignore "node_modules" \
173+ --prepend-source-files \
174+ --prepend-path-fix "../../"
175+
176+ - name : Upload merged LCOV
177+ uses : actions/upload-artifact@v4
178+ with :
179+ name : code-coverage-report
180+ path : .reports/lcov.info
181+
138182 perform-static-analysis :
139183 name : " Perform static analysis"
140- needs : [test-unit]
184+ needs : [test-unit, merge-coverage ]
141185 runs-on : ubuntu-latest
142186 permissions :
143187 id-token : write
0 commit comments