From 14d5186346538295d7dbb0b2b7127c207f00d929 Mon Sep 17 00:00:00 2001 From: Jan Piotrowski Date: Tue, 28 Nov 2023 11:03:44 +0100 Subject: [PATCH] ci: Simplify `detect_jobs_to_run` output (and related `if`) (#4307) --- .github/workflows/detect-jobs-to-run.test.js | 253 ------------------ .github/workflows/optional-test.yaml | 4 +- .../{ => scripts}/detect-jobs-to-run.js | 28 +- .../scripts/detect-jobs-to-run.test.js | 195 ++++++++++++++ .github/workflows/test.yaml | 46 ++-- 5 files changed, 235 insertions(+), 291 deletions(-) delete mode 100644 .github/workflows/detect-jobs-to-run.test.js rename .github/workflows/{ => scripts}/detect-jobs-to-run.js (84%) create mode 100644 .github/workflows/scripts/detect-jobs-to-run.test.js diff --git a/.github/workflows/detect-jobs-to-run.test.js b/.github/workflows/detect-jobs-to-run.test.js deleted file mode 100644 index 9a606c7e43b1..000000000000 --- a/.github/workflows/detect-jobs-to-run.test.js +++ /dev/null @@ -1,253 +0,0 @@ -const { detectJobsTorun } = require('./detect-jobs-to-run') -// @ts-check - -// -// This is running automatically with the `test and lint test suite` job -// -// To run manually this file: -// `pnpm jest detect-jobs-to-run` -// `pnpm jest detect-jobs-to-run -u` to update snapshots -// - -describe('detect-jobs-to-run', () => { - it('no files changed', async () => { - const filesChanged = [] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": true, - "bundlers": true, - "community-generators": true, - "core-features": true, - "databases": true, - "databases-macos": true, - "dataproxy": true, - "docker": true, - "docker-unsupported": true, - "driver-adapters": true, - "engines": true, - "frameworks": true, - "libraries": true, - "migrate": true, - "node": true, - "os": true, - "packagers": true, - "platforms": true, - "platforms-serverless": true, - "platforms-serverless-vercel": true, - "process-managers": true, - "test-runners": true, -} -`) - }) - - it('files changed inside platform folder only', async () => { - const filesChanged = ['platforms/somefile.js'] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": false, - "bundlers": false, - "community-generators": false, - "core-features": false, - "databases": false, - "databases-macos": false, - "dataproxy": false, - "docker": false, - "docker-unsupported": false, - "driver-adapters": false, - "engines": false, - "frameworks": false, - "libraries": false, - "migrate": false, - "node": false, - "os": false, - "packagers": false, - "platforms": true, - "platforms-serverless": false, - "platforms-serverless-vercel": false, - "process-managers": false, - "test-runners": false, -} -`) - expect(jobsToRun.platforms).toBe(true) - expect(jobsToRun['platforms-serverless']).toBe(false) - }) - - it('files changed inside platform & databases directories only', async () => { - const filesChanged = ['platforms/somefile.js', 'databases/somefile.js'] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": false, - "bundlers": false, - "community-generators": false, - "core-features": false, - "databases": true, - "databases-macos": false, - "dataproxy": false, - "docker": false, - "docker-unsupported": false, - "driver-adapters": false, - "engines": false, - "frameworks": false, - "libraries": false, - "migrate": false, - "node": false, - "os": false, - "packagers": false, - "platforms": true, - "platforms-serverless": false, - "platforms-serverless-vercel": false, - "process-managers": false, - "test-runners": false, -} -`) - expect(jobsToRun.platforms).toBe(true) - expect(jobsToRun['platforms-serverless']).toBe(false) - expect(jobsToRun.databases).toBe(true) - expect(jobsToRun['databases-macos']).toBe(false) - }) - - it('files changed inside community-generators directory only', async () => { - const filesChanged = [ - 'community-generators/typegraphql-prisma/package.json', - 'community-generators/typegraphql-prisma/something.js', - ] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": false, - "bundlers": false, - "community-generators": true, - "core-features": false, - "databases": false, - "databases-macos": false, - "dataproxy": false, - "docker": false, - "docker-unsupported": false, - "driver-adapters": false, - "engines": false, - "frameworks": false, - "libraries": false, - "migrate": false, - "node": false, - "os": false, - "packagers": false, - "platforms": false, - "platforms-serverless": false, - "platforms-serverless-vercel": false, - "process-managers": false, - "test-runners": false, -} -`) - - expect(jobsToRun['community-generators']).toBe(true) - }) - - it('should fallback: no change', async () => { - const filesChanged = [] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": true, - "bundlers": true, - "community-generators": true, - "core-features": true, - "databases": true, - "databases-macos": true, - "dataproxy": true, - "docker": true, - "docker-unsupported": true, - "driver-adapters": true, - "engines": true, - "frameworks": true, - "libraries": true, - "migrate": true, - "node": true, - "os": true, - "packagers": true, - "platforms": true, - "platforms-serverless": true, - "platforms-serverless-vercel": true, - "process-managers": true, - "test-runners": true, -} -`) - expect(jobsToRun.platforms).toBe(true) - expect(jobsToRun.databases).toBe(true) - }) - - it('should fallback: files changed inside & outside directories', async () => { - const filesChanged = ['.github/workflows/detect-jobs-to-run.js', 'platforms/somefile.js', 'databases/somefile.js'] - const jobsToRun = await detectJobsTorun({ filesChanged }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": true, - "bundlers": true, - "community-generators": true, - "core-features": true, - "databases": true, - "databases-macos": true, - "dataproxy": true, - "docker": true, - "docker-unsupported": true, - "driver-adapters": true, - "engines": true, - "frameworks": true, - "libraries": true, - "migrate": true, - "node": true, - "os": true, - "packagers": true, - "platforms": true, - "platforms-serverless": true, - "platforms-serverless-vercel": true, - "process-managers": true, - "test-runners": true, -} -`) - expect(jobsToRun.platforms).toBe(true) - expect(jobsToRun.databases).toBe(true) - }) - - it('should fallback: branch is dev', async () => { - const filesChanged = [] - const jobsToRun = await detectJobsTorun({ filesChanged, GITHUB_REF: 'refs/heads/dev' }) - - expect(jobsToRun).toMatchInlineSnapshot(` -Object { - "binaries": true, - "bundlers": true, - "community-generators": true, - "core-features": true, - "databases": true, - "databases-macos": true, - "dataproxy": true, - "docker": true, - "docker-unsupported": true, - "driver-adapters": true, - "engines": true, - "frameworks": true, - "libraries": true, - "migrate": true, - "node": true, - "os": true, - "packagers": true, - "platforms": true, - "platforms-serverless": true, - "platforms-serverless-vercel": true, - "process-managers": true, - "test-runners": true, -} -`) - expect(jobsToRun.platforms).toBe(true) - expect(jobsToRun.databases).toBe(true) - }) -}) diff --git a/.github/workflows/optional-test.yaml b/.github/workflows/optional-test.yaml index fc095f19fd86..de47bab72466 100644 --- a/.github/workflows/optional-test.yaml +++ b/.github/workflows/optional-test.yaml @@ -63,7 +63,7 @@ jobs: - name: Install Dependencies run: pnpm install - id: detect - run: ./.github/workflows/detect-jobs-to-run.js <<<'${{ steps.files.outputs.all }}' + run: ./.github/workflows/scripts/detect-jobs-to-run.js <<<'${{ steps.files.outputs.all }}' report-to-slack-success: runs-on: ubuntu-22.04 @@ -105,7 +105,7 @@ jobs: community-generators: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['community-generators'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'community-generators') strategy: fail-fast: false diff --git a/.github/workflows/detect-jobs-to-run.js b/.github/workflows/scripts/detect-jobs-to-run.js similarity index 84% rename from .github/workflows/detect-jobs-to-run.js rename to .github/workflows/scripts/detect-jobs-to-run.js index 76c86c4db8d4..8ff04e6eb3b8 100755 --- a/.github/workflows/detect-jobs-to-run.js +++ b/.github/workflows/scripts/detect-jobs-to-run.js @@ -27,6 +27,7 @@ async function getStdin() { } async function detectJobsTorun({ filesChanged, GITHUB_REF }) { + console.debug("filesChanged", filesChanged) const testYamlString = fs.readFileSync(path.join(process.cwd(), '.github/workflows/test.yaml'), { encoding: 'utf8' }) const testYaml = yaml.parse(testYamlString) const optionalTestYamlString = fs.readFileSync(path.join(process.cwd(), '.github/workflows/optional-test.yaml'), { @@ -38,22 +39,22 @@ async function detectJobsTorun({ filesChanged, GITHUB_REF }) { // ['process-managers', 'docker', 'core-features', ...] const testDirectories = Object.keys(allJobs).filter((key) => { const jobsToIgnore = [ - 'node16dot13', - 'report-to-slack-success', // Not a test but a job that posts to slack - 'report-to-slack-failure', // Not a test but a job that posts to slack - 'detect_jobs_to_run', // Not a test but a job that decides which tests should run - 'cleanup-runs', // Not a test but a job that cancels previous runs - 'confirm_all_jobs_have_run', // Not a test but a job that confirms all tests have run (for Renovate) + 'detect_jobs_to_run', // Not a test but a job that decides which tests should run + 'report-to-slack-success', // Not a test but a job that posts to slack + 'report-to-slack-failure', // Not a test but a job that posts to slack + 'cleanup-runs', // Not a test but a job that cancels previous runs + 'confirm_all_jobs_have_run', // Not a test but a job that confirms all tests have run (for Renovate) + 'node16dot13', // TODO ] return !jobsToIgnore.includes(key) }) - console.debug(testDirectories) + console.debug("testDirectories", testDirectories) - // Object used as output - const jobsToRun = {} + // Array used as output + const jobsToRun = [] - // creates an object with all values set to true to be used a fallback to run all tests - const fallbackRunAllJobs = testDirectories.reduce((acc, curr) => ((acc[curr] = true), acc), {}) + // fallback is to test all testDirectories + const fallbackRunAllJobs = testDirectories // If we are in one of our special branches we always run all tests if (['refs/heads/dev', 'refs/heads/patch-dev', 'refs/heads/latest', 'refs/heads/integration'].includes(GITHUB_REF)) { @@ -88,10 +89,9 @@ async function detectJobsTorun({ filesChanged, GITHUB_REF }) { totalNumberOfFilesChangedInsideDirectories += filesChangedInsideDirectory.length // we need to run the test - jobsToRun[directoryName] = true + jobsToRun.push(directoryName) } else { // we don't need to run the test - jobsToRun[directoryName] = false } } @@ -135,6 +135,8 @@ async function main() { GITHUB_REF, }) + console.debug({ jobsToRun }) + if (typeof process.env.GITHUB_OUTPUT == 'string' && process.env.GITHUB_OUTPUT.length > 0) { fs.appendFileSync(process.env.GITHUB_OUTPUT, `jobs=${JSON.stringify(jobsToRun)}\n`) console.debug('jobsToRun added to GITHUB_OUTPUT') diff --git a/.github/workflows/scripts/detect-jobs-to-run.test.js b/.github/workflows/scripts/detect-jobs-to-run.test.js new file mode 100644 index 000000000000..6417a8e74dcb --- /dev/null +++ b/.github/workflows/scripts/detect-jobs-to-run.test.js @@ -0,0 +1,195 @@ +const { detectJobsTorun } = require('./detect-jobs-to-run') +// @ts-check + +// +// This is running automatically with the `test and lint test suite` job +// +// To run manually this file: +// `pnpm jest detect-jobs-to-run` +// `pnpm jest detect-jobs-to-run -u` to update snapshots +// + +describe('detect-jobs-to-run', () => { + it('no files changed', async () => { + const filesChanged = [] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "process-managers", + "docker", + "docker-unsupported", + "core-features", + "migrate", + "engines", + "os", + "node", + "binaries", + "packagers", + "frameworks", + "platforms", + "platforms-serverless", + "platforms-serverless-vercel", + "driver-adapters", + "dataproxy", + "bundlers", + "libraries", + "databases", + "databases-macos", + "test-runners", + "community-generators", +] +`) + }) + + it('files changed inside platform folder only', async () => { + const filesChanged = ['platforms/somefile.js'] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "platforms", +] +` +) + expect(jobsToRun.includes('platforms')).toBe(true) + expect(jobsToRun.includes('platforms-serverless')).toBe(false) + }) + + it('files changed inside platform & databases directories only', async () => { + const filesChanged = ['platforms/somefile.js', 'databases/somefile.js'] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "platforms", + "databases", +] +` +) + expect(jobsToRun.includes('platforms')).toBe(true) + expect(jobsToRun.includes('platforms-serverless-vercel')).toBe(false) + expect(jobsToRun.includes('platforms-serverless')).toBe(false) + expect(jobsToRun.includes('databases')).toBe(true) + expect(jobsToRun.includes('databases-macos')).toBe(false) + }) + + it('files changed inside community-generators directory only', async () => { + const filesChanged = [ + 'community-generators/typegraphql-prisma/package.json', + 'community-generators/typegraphql-prisma/something.js', + ] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "community-generators", +] +` +) + + expect(jobsToRun.includes('community-generators')).toBe(true) + }) + + it('should fallback: no change', async () => { + const filesChanged = [] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "process-managers", + "docker", + "docker-unsupported", + "core-features", + "migrate", + "engines", + "os", + "node", + "binaries", + "packagers", + "frameworks", + "platforms", + "platforms-serverless", + "platforms-serverless-vercel", + "driver-adapters", + "dataproxy", + "bundlers", + "libraries", + "databases", + "databases-macos", + "test-runners", + "community-generators", +] +`) + expect(jobsToRun.includes('platforms')).toBe(true) + expect(jobsToRun.includes('databases')).toBe(true) + }) + + it('should fallback: files changed inside & outside directories', async () => { + const filesChanged = ['.github/workflows/detect-jobs-to-run.js', 'platforms/somefile.js', 'databases/somefile.js'] + const jobsToRun = await detectJobsTorun({ filesChanged }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "process-managers", + "docker", + "docker-unsupported", + "core-features", + "migrate", + "engines", + "os", + "node", + "binaries", + "packagers", + "frameworks", + "platforms", + "platforms-serverless", + "platforms-serverless-vercel", + "driver-adapters", + "dataproxy", + "bundlers", + "libraries", + "databases", + "databases-macos", + "test-runners", + "community-generators", +] +`) + expect(jobsToRun.includes('platforms')).toBe(true) + expect(jobsToRun.includes('databases')).toBe(true) + }) + + it('should fallback: branch is dev', async () => { + const filesChanged = [] + const jobsToRun = await detectJobsTorun({ filesChanged, GITHUB_REF: 'refs/heads/dev' }) + + expect(jobsToRun).toMatchInlineSnapshot(` +Array [ + "process-managers", + "docker", + "docker-unsupported", + "core-features", + "migrate", + "engines", + "os", + "node", + "binaries", + "packagers", + "frameworks", + "platforms", + "platforms-serverless", + "platforms-serverless-vercel", + "driver-adapters", + "dataproxy", + "bundlers", + "libraries", + "databases", + "databases-macos", + "test-runners", + "community-generators", +] +`) + expect(jobsToRun.includes('platforms')).toBe(true) + expect(jobsToRun.includes('databases')).toBe(true) + }) +}) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1e415e4607a5..38eee7f36f28 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -74,7 +74,7 @@ jobs: - name: Install Dependencies run: pnpm install - id: detect - run: ./.github/workflows/detect-jobs-to-run.js <<<'${{ steps.files.outputs.all }}' + run: ./.github/workflows/scripts/detect-jobs-to-run.js <<<'${{ steps.files.outputs.all }}' confirm_all_jobs_have_run: name: Confirm all jobs have run @@ -195,7 +195,7 @@ jobs: process-managers: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['process-managers'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'process-managers') strategy: fail-fast: false @@ -246,7 +246,7 @@ jobs: docker: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['docker'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'docker') strategy: fail-fast: false @@ -343,7 +343,7 @@ jobs: # Meaning a successfull run actually shows a non zero exit code in the logs docker-unsupported: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['docker-unsupported'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'docker-unsupported') strategy: fail-fast: false @@ -397,7 +397,7 @@ jobs: core-features: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['core-features'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'core-features') strategy: fail-fast: false @@ -478,7 +478,7 @@ jobs: migrate: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['migrate'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'migrate') strategy: fail-fast: false @@ -529,7 +529,7 @@ jobs: engines: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['engines'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'engines') strategy: fail-fast: false @@ -576,7 +576,7 @@ jobs: os: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['os'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'os') strategy: fail-fast: false @@ -628,7 +628,7 @@ jobs: # so as a workaround we test this version with npm node16dot13: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['node'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'node16dot13') strategy: fail-fast: false @@ -680,7 +680,7 @@ jobs: node: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['node'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'node') strategy: fail-fast: false @@ -739,7 +739,7 @@ jobs: binaries: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['binaries'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'binaries') strategy: fail-fast: false @@ -793,7 +793,7 @@ jobs: packagers: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['packagers'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'packagers') strategy: fail-fast: false @@ -870,7 +870,7 @@ jobs: frameworks: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['frameworks'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'frameworks') strategy: fail-fast: false @@ -924,7 +924,7 @@ jobs: platforms: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['platforms'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'platforms') timeout-minutes: 60 strategy: @@ -999,7 +999,7 @@ jobs: platforms-serverless: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['platforms-serverless'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'platforms-serverless') timeout-minutes: 60 # can take longer if platforms are down, so better protect strategy: @@ -1096,7 +1096,7 @@ jobs: platforms-serverless-vercel: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['platforms-serverless-vercel'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'platforms-serverless-vercel') timeout-minutes: 60 # can take longer if platforms are down, so better protect strategy: @@ -1180,7 +1180,7 @@ jobs: driver-adapters: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['driver-adapters'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'driver-adapters') timeout-minutes: 30 strategy: @@ -1318,7 +1318,7 @@ jobs: # it would be great if we could run them in parallel by letting them use the db provided by E2E dataproxy: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['dataproxy'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'dataproxy') timeout-minutes: 60 # can take longer if platforms are down, so better protect strategy: @@ -1447,7 +1447,7 @@ jobs: bundlers: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['bundlers'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'bundlers') strategy: fail-fast: false @@ -1502,7 +1502,7 @@ jobs: libraries: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['libraries'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'libraries') strategy: fail-fast: false @@ -1556,7 +1556,7 @@ jobs: databases: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['databases'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'databases') strategy: fail-fast: false @@ -1644,7 +1644,7 @@ jobs: databases-macos: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['databases-macos'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'databases-macos') strategy: fail-fast: false @@ -1691,7 +1691,7 @@ jobs: test-runners: needs: [detect_jobs_to_run] - if: ${{ fromJson(needs.detect_jobs_to_run.outputs.jobs)['test-runners'] == true }} + if: contains(fromJSON(needs.detect_jobs_to_run.outputs.jobs), 'test-runners') strategy: fail-fast: false