Repository navigation
121 lines (107 loc) · 5.19 KB
/
Copy path__test-action-setup-node.yml
File metadata and controls
121 lines (107 loc) · 5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
name: Internal - Tests for "setup-node" action
on:
workflow_call:
permissions: {}
jobs:
test:
name: Test "setup-node" (${{ matrix.working-directory }})
runs-on: ubuntu-latest
permissions:
contents: read
strategy:
matrix:
include:
- working-directory: tests/npm
run-script-command: npm run
- working-directory: tests/pnpm
run-script-command: pnpm
- working-directory: tests/pnpm-package-manager
run-script-command: pnpm
- working-directory: tests/yarn
run-script-command: yarn
steps:
# jscpd:ignore-start
- name: Arrange - Checkout sources
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Arrange - Configure Node.js version
run: cp "$GITHUB_WORKSPACE/.node-version" .nvmrc
working-directory: ${{ matrix.working-directory }}
- name: Act - Run "setup-node" action
id: act-setup-node
uses: $/actions/setup-node
with:
working-directory: ${{ matrix.working-directory }}
# jscpd:ignore-end
- name: Assert - Check "setup-node" outputs
env:
RUN_SCRIPT_COMMAND: ${{ steps.act-setup-node.outputs.run-script-command }}
EXPECTED_RUN_SCRIPT_COMMAND: ${{ matrix.run-script-command }}
run: |
if [ "$RUN_SCRIPT_COMMAND" != "$EXPECTED_RUN_SCRIPT_COMMAND" ]; then
echo "setup-node outputs run-script-command is not valid"
exit 1
fi
- name: Arrange - Local dependency and project with installation hooks
id: lifecycle-fixture
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env:
SOURCE_DIRECTORY: ${{ matrix.working-directory }}
RUN_SCRIPT_COMMAND: ${{ steps.act-setup-node.outputs.run-script-command }}
with:
script: |
const fs = require('node:fs');
const path = require('node:path');
const directory = fs.mkdtempSync(path.join(process.env.GITHUB_WORKSPACE, 'install-hooks-'));
const dependency = path.join(directory, 'dependency');
await io.mkdirP(dependency);
const hook = `node -e "require('node:fs').writeFileSync('install-hook-ran', '')"`;
fs.writeFileSync(path.join(dependency, 'package.json'), JSON.stringify({
name: 'lifecycle-dependency', version: '1.0.0', scripts: { postinstall: hook },
}));
await exec.exec('npm', ['pack', '--ignore-scripts', '--pack-destination', directory], { cwd: dependency });
const source = JSON.parse(fs.readFileSync(path.join(process.env.SOURCE_DIRECTORY, 'package.json'), 'utf8'));
fs.writeFileSync(path.join(directory, 'package.json'), JSON.stringify({
name: 'lifecycle-project', version: '1.0.0', private: true,
packageManager: source.packageManager,
dependencies: { 'lifecycle-dependency': 'file:./lifecycle-dependency-1.0.0.tgz' },
scripts: { postinstall: hook, build: `node -e "require('node:fs').writeFileSync('build-ran', '')"` },
}));
await io.cp('.node-version', path.join(directory, '.node-version'));
const manager = process.env.RUN_SCRIPT_COMMAND.split(' ')[0];
if (manager === 'pnpm') {
const { stdout } = await exec.getExecOutput('pnpm', ['--version']);
const approval = parseInt(stdout, 10) < 11 ? 'lifecycle-dependency' : 'lifecycle-dependency@file:lifecycle-dependency-1.0.0.tgz';
fs.writeFileSync(path.join(directory, 'pnpm-workspace.yaml'), `allowBuilds:\n ${approval}: true\n`);
}
const installArgs = ['install', '--ignore-scripts'];
if (manager === 'pnpm') installArgs.push('--no-frozen-lockfile');
await exec.exec(manager, installArgs, { cwd: directory });
await io.rmRF(path.join(directory, 'node_modules'));
core.setOutput('directory', directory);
- name: Act - Install with default script policy
id: default-install
uses: $/actions/setup-node
with:
working-directory: ${{ steps.lifecycle-fixture.outputs.directory }}
- name: Assert - Installation hooks are disabled and explicit builds still run
working-directory: ${{ steps.lifecycle-fixture.outputs.directory }}
env:
RUN_SCRIPT_COMMAND: ${{ steps.default-install.outputs.run-script-command }}
run: |
test ! -f install-hook-ran
test ! -f node_modules/lifecycle-dependency/install-hook-ran
$RUN_SCRIPT_COMMAND build
test -f build-ran
rm -rf node_modules
- name: Act - Opt in to installation hooks
uses: $/actions/setup-node
with:
working-directory: ${{ steps.lifecycle-fixture.outputs.directory }}
ignore-scripts: "false"
- name: Assert - Project and approved dependency hooks ran
working-directory: ${{ steps.lifecycle-fixture.outputs.directory }}
run: |
test -f install-hook-ran
test -f node_modules/lifecycle-dependency/install-hook-ran