|
|
@@ -55,11 +55,10 @@ describe('CI workflow', () => {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
- it('keeps required Wine and split native Windows jobs with failover, plus a master-only standby', () => {
|
|
|
+ it('keeps split native Windows PR jobs with failover, plus a master-only standby', () => {
|
|
|
const workflow = loadWorkflow('.github/workflows/ci.yml')
|
|
|
const masterWorkflow = loadWorkflow('.github/workflows/ci-master.yml')
|
|
|
if (!isRecord(workflow.jobs)
|
|
|
- || !isRecord(workflow.jobs.windows)
|
|
|
|| !isRecord(workflow.jobs['windows-build'])
|
|
|
|| !isRecord(workflow.jobs['windows-coverage'])
|
|
|
|| !isRecord(workflow.jobs['windows-native-tests'])
|
|
|
@@ -71,17 +70,14 @@ describe('CI workflow', () => {
|
|
|
|| !isRecord(workflow.jobs['node-compat'])
|
|
|
|| !isRecord(workflow.jobs['all-checks-passed'])
|
|
|
|| !isRecord(masterWorkflow.jobs)
|
|
|
- || !isRecord(masterWorkflow.jobs['wine-apt-cache'])
|
|
|
|| !isRecord(masterWorkflow.jobs['serial-windows'])) {
|
|
|
- throw new TypeError('CI workflow must define windows, windows-build, windows-coverage, windows-native-tests, windows-observational, node-24, node-24-coverage, node-24-bench, node-24-consumers, node-compat, and all-checks-passed; ci-master must define wine-apt-cache and serial-windows')
|
|
|
+ throw new TypeError('CI workflow must define windows-build, windows-coverage, windows-native-tests, windows-observational, node-24, node-24-coverage, node-24-bench, node-24-consumers, node-compat, and all-checks-passed; ci-master must define serial-windows')
|
|
|
}
|
|
|
|
|
|
- const windows = workflow.jobs.windows
|
|
|
const windowsBuild = workflow.jobs['windows-build']
|
|
|
const windowsCoverage = workflow.jobs['windows-coverage']
|
|
|
const windowsNativeTests = workflow.jobs['windows-native-tests']
|
|
|
const windowsObservational = workflow.jobs['windows-observational']
|
|
|
- const wineAptCache = masterWorkflow.jobs['wine-apt-cache']
|
|
|
const serialWindows = masterWorkflow.jobs['serial-windows']
|
|
|
const node24 = workflow.jobs['node-24']
|
|
|
const node24Coverage = workflow.jobs['node-24-coverage']
|
|
|
@@ -89,19 +85,9 @@ describe('CI workflow', () => {
|
|
|
const node24Consumers = workflow.jobs['node-24-consumers']
|
|
|
const nodeCompat = workflow.jobs['node-compat']
|
|
|
const aggregate = workflow.jobs['all-checks-passed']
|
|
|
- if (!Array.isArray(windows.steps) || !Array.isArray(aggregate.needs)) {
|
|
|
- throw new TypeError('Windows job must define steps and the aggregate must define needs')
|
|
|
+ if (!Array.isArray(aggregate.needs)) {
|
|
|
+ throw new TypeError('CI aggregate must define needs')
|
|
|
}
|
|
|
- const commandSteps = windows.steps.filter((step): step is Record<string, unknown> & { run: string } => (
|
|
|
- isRecord(step) && typeof step.run === 'string'
|
|
|
- ))
|
|
|
-
|
|
|
- // Required PR job: Wine on ubuntu-latest, runs wine-windows-gates.sh.
|
|
|
- expect(windows['runs-on']).toBe('ubuntu-latest')
|
|
|
- expect(windows.name).toBe('windows node 24 / wine blocking')
|
|
|
- expect(windows.if).toBe("github.event_name == 'pull_request'")
|
|
|
- expect(commandSteps.some(step => step.run.includes('wine-windows-gates.sh'))).toBe(true)
|
|
|
-
|
|
|
// The split native jobs all resolve their pool through the Windows switch.
|
|
|
for (const [jobName, job] of [['windows-build', windowsBuild], ['windows-coverage', windowsCoverage], ['windows-native-tests', windowsNativeTests], ['windows-observational', windowsObservational]] as const) {
|
|
|
expect(typeof job['runs-on']).toBe('string')
|
|
|
@@ -183,10 +169,6 @@ describe('CI workflow', () => {
|
|
|
expect(windowsObservational.name).toBe('windows node 24 / observational')
|
|
|
expect(windowsObservational['continue-on-error']).toBe(true)
|
|
|
|
|
|
- // wine-apt-cache: master-only, seeds the Wine apt cache, lives in ci-master.
|
|
|
- expect(wineAptCache.if).toBe("github.event_name == 'push' && github.ref == 'refs/heads/master'")
|
|
|
- expect(wineAptCache['runs-on']).toBe('ubuntu-latest')
|
|
|
-
|
|
|
// serial-windows: master-only standby, self-hosted, non-blocking, lives in ci-master.
|
|
|
expect(serialWindows.if).toBe("github.event_name == 'push' && github.ref == 'refs/heads/master'")
|
|
|
expect(serialWindows['runs-on']).toEqual(['self-hosted', 'dsh-win-ci', 'windows'])
|
|
|
@@ -223,7 +205,7 @@ describe('CI workflow', () => {
|
|
|
// Aggregate: Wine and the required split native jobs are needed;
|
|
|
// windows-coverage is temporarily non-blocking while Windows ACP
|
|
|
// half-close tests are stabilized; observational stays out too.
|
|
|
- expect(aggregate.needs).toContain('windows')
|
|
|
+ expect(aggregate.needs).not.toContain('windows')
|
|
|
expect(aggregate.needs).toContain('windows-build')
|
|
|
// The benchmark lane is a required verdict input and runs alone so its
|
|
|
// wall-clock budgets never share a runner with a concurrent aggregate.
|
|
|
@@ -362,9 +344,7 @@ describe('CI workflow', () => {
|
|
|
expect(job.if).toBe("github.event_name == 'push' && github.ref == 'refs/heads/master'")
|
|
|
}
|
|
|
|
|
|
- // What bounds the cost of exempting push: a master push may only carry the
|
|
|
- // cache seeder and the two drills. Any job reachable on push would start
|
|
|
- // accumulating uncancelled runs, so the set is pinned here.
|
|
|
+ // Pin the post-merge runtime, Wine, and standby inventory.
|
|
|
const NOT_PUSH_REACHABLE = new Set([
|
|
|
"github.event_name == 'workflow_dispatch' && inputs.suite == 'larger-runner-benchmark'",
|
|
|
"github.event_name == 'workflow_dispatch' && inputs.suite == 'consolidated-runner-benchmark'",
|
|
|
@@ -379,7 +359,7 @@ describe('CI workflow', () => {
|
|
|
})
|
|
|
.map(([name]) => name)
|
|
|
.sort()
|
|
|
- expect(pushReachable).toEqual(['serial-linux-selfhosted', 'serial-windows', 'wine-apt-cache'])
|
|
|
+ expect(pushReachable).toEqual(['python-runtime', 'serial-linux-selfhosted', 'serial-windows', 'windows'])
|
|
|
|
|
|
// Why workflow_dispatch must keep cancelling: each benchmark fans out to a
|
|
|
// dozen larger runners at once, in this same group on master. If it stopped
|
|
|
@@ -403,7 +383,7 @@ describe('CI workflow', () => {
|
|
|
expect(config).not.toContain('packages/lsp/lsp-stdio/src/instance.ts')
|
|
|
})
|
|
|
|
|
|
- it('requires release-shaped Python runtime validation on every published target', () => {
|
|
|
+ it('requires release-shaped Python runtime validation on Linux and Windows x64', () => {
|
|
|
const workflow = loadWorkflow('.github/workflows/ci.yml')
|
|
|
const pythonRuntime = workflowJob(workflow, 'python-runtime')
|
|
|
const aggregate = workflowJob(workflow, 'all-checks-passed')
|
|
|
@@ -416,7 +396,7 @@ describe('CI workflow', () => {
|
|
|
name: 'python runtime / release-shaped matrix',
|
|
|
uses: './.github/workflows/build-exe-for-python-sdk.yml',
|
|
|
with: {
|
|
|
- targets: 'node24-linux-x64,node24-linux-arm64,node24-macos-arm64,node24-macos-x64,node24-win-x64',
|
|
|
+ targets: 'node24-linux-x64,node24-win-x64',
|
|
|
ci: true,
|
|
|
},
|
|
|
secrets: {
|