Skip to content

Commit 01c516d

Browse files
committed
Fix CI.
1 parent 0105977 commit 01c516d

8 files changed

Lines changed: 46 additions & 17 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,17 @@ jobs:
3434
node-version: '26'
3535
package-manager-cache: false
3636

37-
- name: Prepare repository tools
37+
# Node 25 and later no longer bundle Corepack. Runner images ship Yarn 1,
38+
# whose global launcher blocks Corepack's own (EEXIST on Windows).
39+
- name: Install and enable Corepack
40+
shell: bash
3841
run: |
42+
npm uninstall --global yarn
3943
npm install --global corepack@latest
4044
corepack enable
41-
yarn install --immutable
45+
46+
- name: Install dependencies
47+
run: yarn install --immutable
4248

4349
- name: Test package manager setup
4450
run: yarn vitest run packages/purestack/src/init/package-manager.test.ts
@@ -66,9 +72,12 @@ jobs:
6672
node-version: '26'
6773
package-manager-cache: false
6874

69-
# Node 25 and later no longer bundle Corepack.
75+
# Node 25 and later no longer bundle Corepack. Runner images ship Yarn 1,
76+
# whose global launcher blocks Corepack's own (EEXIST on Windows).
7077
- name: Install and enable Corepack
78+
shell: bash
7179
run: |
80+
npm uninstall --global yarn
7281
npm install --global corepack@latest
7382
corepack enable
7483

‎.yarnrc.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
nodeLinker: node-modules
2+
# Install fresh releases right away, including just-published PureStack packages.
3+
npmMinimalAgeGate: 0

‎packages/purestack/src/init/create-site.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,11 @@ export async function createSite(
108108
perform,
109109
options.signal,
110110
)
111+
// The first install writes the lockfile, even where CI makes Yarn immutable.
112+
const install =
113+
packageManager === 'yarn' ? ['install', '--no-immutable'] : ['install']
111114
await perform('Install dependencies', () =>
112-
runPackageManager(packageManager, ['install'], directory, {
115+
runPackageManager(packageManager, install, directory, {
113116
capture: true,
114117
signal: options.signal,
115118
}),

‎packages/purestack/src/init/init.test.ts‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,12 @@ describe('project generation', () => {
208208
expect(await readFile(path.join(destination, 'yarn.lock'), 'utf8')).toBe('')
209209
expect(project.packageManager).toBe('yarn@4.18.1')
210210
expect(project.devDependencies['@purestack/ts-minidom']).toBe(cliVersion)
211-
expect(
212-
await readFile(path.join(destination, '.yarnrc.yml'), 'utf8'),
213-
).toContain('nodeLinker: node-modules')
211+
const yarnConfig = await readFile(
212+
path.join(destination, '.yarnrc.yml'),
213+
'utf8',
214+
)
215+
expect(yarnConfig).toContain('nodeLinker: node-modules')
216+
expect(yarnConfig).toContain('npmMinimalAgeGate: 0')
214217
expect(Object.keys(project.dependencies)).toEqual(['purestack'])
215218
expect(
216219
JSON.parse(
@@ -482,10 +485,12 @@ describe('project generation', () => {
482485
repository,
483486
)
484487
expect(result.installed).toBe(false)
485-
expect(install).toHaveBeenCalledWith('yarn', ['install'], destination, {
486-
capture: true,
487-
signal: undefined,
488-
})
488+
expect(install).toHaveBeenCalledWith(
489+
'yarn',
490+
['install', '--no-immutable'],
491+
destination,
492+
{ capture: true, signal: undefined },
493+
)
489494
expect(result.failures).toEqual([
490495
expect.stringContaining('Retry yarn install'),
491496
])

‎packages/purestack/src/init/package-manager.test.ts‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { existsSync } from 'node:fs'
2-
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'
2+
import { mkdir, mkdtemp, realpath, rm, writeFile } from 'node:fs/promises'
33
import { tmpdir } from 'node:os'
44
import path from 'node:path'
55
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
@@ -15,7 +15,10 @@ vi.mock('node:fs', async (importOriginal) => {
1515
let temporary: string
1616

1717
beforeEach(async () => {
18-
temporary = await mkdtemp(path.join(tmpdir(), 'purestack-yarn-runner-'))
18+
// Child processes report resolved paths, e.g. /private/var on macOS.
19+
temporary = await realpath(
20+
await mkdtemp(path.join(tmpdir(), 'purestack-yarn-runner-')),
21+
)
1922
vi.stubEnv('COREPACK_ROOT', undefined)
2023
vi.stubEnv('npm_execpath', undefined)
2124
vi.stubEnv('PATH', '')

‎scripts/fixtures/toolchain-worker.ts‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,13 @@ async function main() {
5959
(await runYarn(['--version'], project, { capture: true, signal })).trim(),
6060
version,
6161
)
62-
await runPackageManager('yarn', ['install', '--mode=skip-build'], project, {
63-
signal,
64-
})
62+
// Like createSite: the first install writes the lockfile despite CI immutability.
63+
await runPackageManager(
64+
'yarn',
65+
['install', '--no-immutable', '--mode=skip-build'],
66+
project,
67+
{ signal },
68+
)
6569
assert.match(
6670
await readFile(path.join(project, 'yarn.lock'), 'utf8'),
6771
/__metadata/,

‎scripts/verify-templates.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ async function main() {
107107
}
108108
await runPackageManager(
109109
manager,
110+
// Like createSite: the first install writes the lockfile despite CI immutability.
110111
manager === 'yarn'
111-
? ['install']
112+
? ['install', '--no-immutable']
112113
: ['install', '--no-audit', '--no-fund'],
113114
directory,
114115
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
nodeLinker: node-modules
2+
# Install fresh releases right away, including just-published PureStack packages.
3+
npmMinimalAgeGate: 0

0 commit comments

Comments
 (0)