From 87ced5482c04fda0cca4db8dec4c7414fed35947 Mon Sep 17 00:00:00 2001 From: Thomas Carmet <8408330+tcarmet@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:55:04 -0700 Subject: [PATCH 1/2] CLDSRV-955: Cache node_modules instead of yarn download cache Replace `cache: yarn` (which only caches the yarn download dir) with an actions/cache on node_modules keyed by the yarn.lock hash, and make the yarn install / typescript steps conditional on a cache miss. Because the git dependencies compile TypeScript at install time, a warm cache now skips the clone, tsc build and relink entirely. Applied to the setup-ci composite action (used by all functional jobs) and the lint, async-migration-report, unit-tests and cleanup-gcp-buckets jobs. --- .github/actions/setup-ci/action.yaml | 13 ++++++++++- .github/workflows/tests.yaml | 34 ++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/.github/actions/setup-ci/action.yaml b/.github/actions/setup-ci/action.yaml index 975bc3c483..0068fc860c 100644 --- a/.github/actions/setup-ci/action.yaml +++ b/.github/actions/setup-ci/action.yaml @@ -28,12 +28,23 @@ runs: - uses: actions/setup-node@v4 with: node-version: '22.23.1' - cache: 'yarn' + # Cache node_modules directly (not the yarn download cache) so the git + # dependencies' TypeScript compilation and relink are skipped on a hit. + # Key includes runner.os because node_modules can hold native addons; all + # CI runners are Linux/ubuntu, so the cache stays homogeneous. + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} - name: install typescript shell: bash + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn global add typescript@4.9.5 - name: install dependencies shell: bash + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn install --ignore-engines --frozen-lockfile --network-concurrency 1 - uses: actions/cache@v3 with: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index d775a2b8d1..de269449ef 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -86,11 +86,18 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '22.23.1' - cache: yarn + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} - name: install typescript shell: bash + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn global add typescript@4.9.5 - name: install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile --network-concurrency 1 - uses: actions/setup-python@v5 with: @@ -127,8 +134,14 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '22.23.1' - cache: yarn + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} - name: install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile --network-concurrency 1 - name: Count async/await migration progress run: yarn run count-async @@ -141,11 +154,18 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '22.23.1' - cache: yarn + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} - name: install typescript shell: bash + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn global add typescript@4.9.5 - name: install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile --network-concurrency 1 - name: Unit Coverage run: | @@ -1089,8 +1109,14 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '22.23.1' - cache: yarn + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile --network-concurrency 1 - name: Delete stale GCP CI buckets run: yarn run cleanup_gcp_buckets From 9351e6c99eac5e6c3115716febd493306cd6685b Mon Sep 17 00:00:00 2001 From: Thomas Carmet <8408330+tcarmet@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:51:03 -0700 Subject: [PATCH 2/2] CLDSRV-955: Satisfy prettier on setup-ci action.yaml The prettier check formats whole changed files; touching action.yaml brought its pre-existing double-quoted name/description into scope. Reformat them to single quotes to match the prettier style. --- .github/actions/setup-ci/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-ci/action.yaml b/.github/actions/setup-ci/action.yaml index 0068fc860c..f9b714e6ca 100644 --- a/.github/actions/setup-ci/action.yaml +++ b/.github/actions/setup-ci/action.yaml @@ -1,6 +1,6 @@ --- -name: "Setup CI environment" -description: "Setup Cloudserver CI environment" +name: 'Setup CI environment' +description: 'Setup Cloudserver CI environment' runs: using: composite