Skip to content

Commit 67ef2ed

Browse files
authored
CCM-10981: cache node_modules (#680)
1 parent b7ffba3 commit 67ef2ed

File tree

4 files changed

+320
-208
lines changed

4 files changed

+320
-208
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: 'Node modules cache + setup'
2+
description: 'Setup Node, restore node_modules cache, and optionally run npm ci on cache miss'
3+
4+
inputs:
5+
node_version:
6+
description: 'Node.js version'
7+
required: true
8+
cache_lock_path:
9+
description: 'Path(s) to package-lock.json for cache key'
10+
required: false
11+
default: '**/package-lock.json'
12+
skip_restore:
13+
description: 'Skips restoring node_modules'
14+
required: false
15+
default: false
16+
17+
runs:
18+
using: 'composite'
19+
steps:
20+
- name: 'Use Node.js'
21+
uses: actions/setup-node@v5
22+
with:
23+
cache: 'npm'
24+
cache-dependency-path: '${{ inputs.cache_lock_path }}'
25+
node-version: '${{ inputs.node_version }}'
26+
package-manager-cache: true
27+
28+
- name: 'Restore node_modules from cache'
29+
id: node-modules-cache
30+
uses: actions/cache@v4
31+
with:
32+
path: |
33+
node_modules
34+
**/node_modules
35+
key: ${{ runner.os }}-node-${{ inputs.node_version }}-${{ hashFiles(inputs.cache_lock_path) }}
36+
restore-keys: |
37+
${{ runner.os }}-node-${{ inputs.node_version }}-
38+
lookup-only: ${{ inputs.skip_restore }}
39+
40+
- name: 'Install dependencies (cache miss)'
41+
if: steps.node-modules-cache.outputs.cache-hit != 'true'
42+
shell: bash
43+
run: |
44+
npm ci

.github/workflows/stage-2-test.yaml

Lines changed: 94 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,98 +41,162 @@ permissions:
4141
contents: read # This is required for actions/checkout
4242

4343
jobs:
44+
install-dependencies:
45+
name: "Install dependencies"
46+
runs-on: ubuntu-latest
47+
timeout-minutes: 5
48+
steps:
49+
- name: "Checkout code"
50+
uses: actions/[email protected]
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+
uses: actions/[email protected]
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"
5076
uses: actions/[email protected]
51-
- 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"
6497
uses: actions/[email protected]
65-
- 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"
93136
uses: actions/[email protected]
94-
- 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"
109155
uses: actions/[email protected]
110-
- 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-
uses: actions/[email protected]
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

Comments
 (0)