CI: Switch jest unit tests to self-hosted runners (#109304)

* trigger a workflow run for baseline

* attempt to improve caching with upfront action

* CYPRESS_INSTALL_BINARY: 0

* PUPPETEER_SKIP_DOWNLOAD: true

* use ubuntu-x64-large runners

* increase to 16 shards 🚀

* fix incorrect shard total

* ubuntu-x64 runners

* Revert "ubuntu-x64 runners"

This reverts commit 3411c7c5e1039263b17a3065cd7d45fa4c3c8f69.

* try caching node_modules

* fix flakey scopes test

* try just ubuntu-x64-large for yarn-install job

* run again, last one had a dodgy trace

* try different runners for yarn instlal

* Move node_modules cache steps to composite action, use ubuntu-x64 runners for everything

* fix duplicate runs-on

* specify shell for composite action

* fix some flaky tests

* update codeowners

* dedupe yarn.lock

* align yarn action, switch tests back to ubuntu-x64-large

* align yarn action cache keys

* fix required-frontend-unit-tests not checking repo out

* try without the node_modules magic

* actually skip the node_modules caching magic

* skip hardened mode

* skip downloading cypress

* comment
This commit is contained in:
Josh Hunt
2025-08-08 14:31:14 +01:00
committed by GitHub
parent 463e544db9
commit f836ea2ada
20 changed files with 133 additions and 96 deletions
+1
View File
@@ -1133,6 +1133,7 @@ embed.go @grafana/grafana-as-code
/.github/actions/setup-grafana-bench/ @Proximyst
/.github/actions/build-package @grafana/grafana-developer-enablement-squad
/.github/actions/change-detection @grafana/grafana-developer-enablement-squad
/.github/actions/setup-node @grafana/grafana-frontend-platform
/.github/workflows/actionlint-format.txt @grafana/grafana-developer-enablement-squad
/.github/workflows/actionlint.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/add-to-whats-new.yml @grafana/docs-tooling
+20
View File
@@ -6,3 +6,23 @@ self-hosted-runner:
- github-hosted-ubuntu-x64-small
- github-hosted-ubuntu-x64-large
- github-hosted-windows-x64-large
- ubuntu-x64
- ubuntu-x64-io
- ubuntu-x64-small
- ubuntu-x64-small-io
- ubuntu-x64-large
- ubuntu-x64-large-io
- ubuntu-x64-xlarge
- ubuntu-x64-xlarge-io
- ubuntu-x64-2xlarge
- ubuntu-x64-2xlarge-io
- ubuntu-arm64
- ubuntu-arm64-io
- ubuntu-arm64-small
- ubuntu-arm64-small-io
- ubuntu-arm64-large
- ubuntu-arm64-large-io
- ubuntu-arm64-xlarge
- ubuntu-arm64-xlarge-io
- ubuntu-arm64-2xlarge
- ubuntu-arm64-2xlarge-io
+11
View File
@@ -0,0 +1,11 @@
name: Setup Node.js
description: Sets up a node.js environment with presets for the Grafana repository.
runs:
using: "composite"
steps:
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
+1 -13
View File
@@ -32,19 +32,7 @@ jobs:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Cache node_modules
uses: actions/cache@v4
with:
path: |
node_modules
key: node_modules-${{ hashFiles('yarn.lock') }}
restore-keys: |
node_modules-
uses: ./.github/actions/setup-node
- name: Install dependencies
env:
+68 -54
View File
@@ -11,7 +11,7 @@ permissions: {}
jobs:
detect-changes:
name: Detect whether code changed
runs-on: ubuntu-latest
runs-on: ubuntu-x64-small
permissions:
contents: read
outputs:
@@ -31,100 +31,115 @@ jobs:
permissions:
contents: read
id-token: write
needs:
- detect-changes
# Run this workflow only for PRs from forks; if it gets merged into `main` or `release-*`,
# the `frontend-unit-tests-enterprise` workflow will run instead
needs: detect-changes
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true && needs.detect-changes.outputs.changed == 'true'
runs-on: ubuntu-latest-8-cores
name: "Unit tests (${{ matrix.chunk }} / 8)"
runs-on: ubuntu-x64-large
name: "Unit tests (${{ matrix.shard }} / ${{ matrix.total }})"
strategy:
fail-fast: false
matrix:
chunk: [1, 2, 3, 4, 5, 6, 7, 8]
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
total: [16]
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Yarn install
run: yarn install --immutable
env:
PUPPETEER_SKIP_DOWNLOAD: true
CYPRESS_INSTALL_BINARY: 0
- run: yarn run test:ci
env:
TEST_MAX_WORKERS: 2
TEST_SHARD: ${{ matrix.chunk }}
TEST_SHARD_TOTAL: 8
TEST_MAX_WORKERS: 4
TEST_SHARD: ${{ matrix.shard }}
TEST_SHARD_TOTAL: ${{ matrix.total }}
frontend-unit-tests-enterprise:
permissions:
contents: read
id-token: write
needs:
- detect-changes
# Run this workflow for non-PR events (like pushes to `main` or `release-*`) OR for internal PRs (PRs not from forks)
needs: detect-changes
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false && needs.detect-changes.outputs.changed == 'true'
runs-on: ubuntu-latest-8-cores
name: "Unit tests (${{ matrix.chunk }} / 8)"
runs-on: ubuntu-x64-large
name: "Unit tests (${{ matrix.shard }} / ${{ matrix.total }})"
strategy:
fail-fast: false
matrix:
chunk: [1, 2, 3, 4, 5, 6, 7, 8]
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
total: [16]
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- name: Setup Enterprise
uses: ./.github/actions/setup-enterprise
with:
github-app-name: 'grafana-ci-bot'
- run: yarn install --immutable --check-cache
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Yarn install
run: yarn install --immutable
env:
# Switch from default hardened mode to faster mode for internal PRs
YARN_ENABLE_HARDENED_MODE: ${{ github.event.pull_request.head.repo.fork == false && '1' || '0' }}
PUPPETEER_SKIP_DOWNLOAD: true
CYPRESS_INSTALL_BINARY: 0
- run: yarn run test:ci
env:
TEST_MAX_WORKERS: 2
TEST_SHARD: ${{ matrix.chunk }}
TEST_SHARD_TOTAL: 8
TEST_MAX_WORKERS: 4
TEST_SHARD: ${{ matrix.shard }}
TEST_SHARD_TOTAL: ${{ matrix.total }}
frontend-decoupled-plugin-tests:
needs: detect-changes
needs:
- detect-changes
if: needs.detect-changes.outputs.changed == 'true'
runs-on: ubuntu-latest-8-cores
runs-on: ubuntu-x64-large
name: "Decoupled plugin tests"
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Yarn install
run: yarn install --immutable
env:
# Switch from default hardened mode to faster mode for internal PRs
YARN_ENABLE_HARDENED_MODE: ${{ github.event.pull_request.head.repo.fork == false && '1' || '0' }}
PUPPETEER_SKIP_DOWNLOAD: true
CYPRESS_INSTALL_BINARY: 0
- run: yarn run plugin:test:ci
frontend-packages-unit-tests:
needs: detect-changes
needs:
- detect-changes
if: needs.detect-changes.outputs.changed == 'true'
runs-on: ubuntu-latest-8-cores
runs-on: ubuntu-x64-large
name: "Packages unit tests"
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Yarn install
run: yarn install --immutable
env:
# Switch from default hardened mode to faster mode for internal PRs
YARN_ENABLE_HARDENED_MODE: ${{ github.event.pull_request.head.repo.fork == false && '1' || '0' }}
PUPPETEER_SKIP_DOWNLOAD: true
CYPRESS_INSTALL_BINARY: 0
- run: yarn run packages:test:ci
# This is the job that is actually required by rulesets.
# We need to require EITHER the OSS or the Enterprise job to pass.
# However, if one is skipped, GitHub won't flat-map the shards,
@@ -141,15 +156,14 @@ jobs:
if: always()
name: All frontend unit tests complete
runs-on: ubuntu-latest
runs-on: ubuntu-x64-small
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Check test suites
env:
NEEDS: ${{ toJson(needs) }}
run: |
FAILURES="$(echo "$NEEDS" | jq 'with_entries(select(.value.result == "failure")) | map_values(.result)')"
echo "$FAILURES"
if [ "$(echo "$FAILURES" | jq '. | length')" != "0" ]; then
exit 1
fi
echo "All OK!"
uses: ./.github/actions/check-jobs
with:
needs: ${{ toJson(needs) }}
failure-message: "One or more unit test jobs have failed"
success-message: "All unit tests completed successfully"