Просмотр исходного кода

ci: parallelize aggregate lint

Tianyi Cui 1 месяц назад
Родитель
Сommit
03348aa382
2 измененных файлов с 20 добавлено и 0 удалено
  1. 1 0
      .github/workflows/ci.yml
  2. 19 0
      scripts/run-gates.ts

+ 1 - 0
.github/workflows/ci.yml

@@ -849,6 +849,7 @@ jobs:
         env:
           DSH_COVERAGE_MAX_WORKERS: ${{ matrix.workers }}
           DSH_ESLINT_CACHE: '1'
+          DSH_ESLINT_CONCURRENCY: ${{ matrix.workers }}
           DSH_GATE_CONCURRENCY: ${{ matrix.workers }}
           DSH_PUBLINT_CONCURRENCY: ${{ matrix.workers }}
           DSH_SNAPSHOT_MAX_CONCURRENCY: ${{ matrix.workers }}

+ 19 - 0
scripts/run-gates.ts

@@ -306,10 +306,12 @@ function ciWindowsObservationalGates(): Gate[] {
 }
 
 function lintGate(eslintTargets: readonly string[] = ['.']): Gate {
+  const concurrencyArgs = eslintConcurrencyArgs()
   if (process.env.DSH_ESLINT_CACHE === '1') {
     return pnpmExec('lint', [
       'eslint',
       ...eslintTargets,
+      ...concurrencyArgs,
       '--cache',
       '--cache-location',
       '.cache/eslint/',
@@ -320,11 +322,28 @@ function lintGate(eslintTargets: readonly string[] = ['.']): Gate {
       env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
     })
   }
+  if (concurrencyArgs.length > 0) {
+    return pnpmExec('lint', ['eslint', ...eslintTargets, ...concurrencyArgs], {
+      label: 'lint',
+      env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
+    })
+  }
   return pnpmScript('lint', 'lint', {
     env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
   })
 }
 
+function eslintConcurrencyArgs(): string[] {
+  const raw = process.env.DSH_ESLINT_CONCURRENCY
+  if (raw === undefined || raw === '') return []
+  if (raw === 'auto') return ['--concurrency=auto']
+  const parsed = Number.parseInt(raw, 10)
+  if (!Number.isSafeInteger(parsed) || parsed < 1 || String(parsed) !== raw) {
+    throw new Error(`run-gates: DSH_ESLINT_CONCURRENCY must be a positive integer or auto, got ${JSON.stringify(raw)}.`)
+  }
+  return [`--concurrency=${raw}`]
+}
+
 function coverageGate(): Gate {
   const shard = process.env.DSH_COVERAGE_SHARD
   return pnpmExec('coverage', [