Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support .nvmrc #338

Merged
merged 67 commits into from Nov 29, 2021
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
c3812bd
Implemented support for repository defined node version files such as…
TJMcCarthy95 Nov 1, 2020
a0d376d
Expand node version file support to include lts based codenames
TJMcCarthy95 Nov 19, 2020
75c8584
fixed missing brackets and merged main
hkaur008 Sep 30, 2021
820128a
test commit ignore
Xlient Sep 30, 2021
ac10981
Revert "test commit ignore"
hkaur008 Sep 30, 2021
bca2818
fixed merge conflicts
Xlient Oct 1, 2021
82441b3
Refactored code and removed redundant logic
Xlient Oct 1, 2021
052bc8b
created test workflow & nvmrc file
Xlient Oct 1, 2021
7f7335c
updated nvmrc & added ignore paths
Xlient Oct 4, 2021
1f26500
fixed error in workflow file
Xlient Oct 4, 2021
510ffc9
Update version-file-workflow.yml
Xlient Oct 4, 2021
2579409
fixed merge conflicts
Xlient Oct 4, 2021
1650600
Merge branch 'pull209' of https://github.com/hkaur008/setup-node into…
Xlient Oct 4, 2021
2fb803b
refactored installer.test.ts
hkaur008 Oct 4, 2021
42c8cd4
deleted node-version-file
hkaur008 Oct 4, 2021
e471f47
code syntax matched
hkaur008 Oct 4, 2021
b1ed0c3
moved node version section in README to advanced usage
Xlient Oct 5, 2021
c178bbb
removed test logic in ParseNodeVersionFile for lts and partial matching
Xlient Oct 5, 2021
eb7c472
removed extra tabs (versions.yml)
hkaur008 Oct 5, 2021
7fb46ef
removed extra tabs (versions.yml)
hkaur008 Oct 5, 2021
ec979d0
removed unnessary test
Xlient Oct 6, 2021
fe30936
Delete index.js
Xlient Oct 6, 2021
7d40f6c
added correct path to version file
Xlient Oct 6, 2021
6e5214f
build successful
hkaur008 Oct 6, 2021
5b7f417
build successful
hkaur008 Oct 6, 2021
ab0d6af
refactored test to seperate lts alias describe()
Xlient Oct 7, 2021
fa3de08
removed await from line 25 main.ts
hkaur008 Oct 7, 2021
b8f2a97
changed path of versionFilePath line 24 main.ts
hkaur008 Oct 7, 2021
a03cbe2
changed import from syntax instead require line 3 and line 8
hkaur008 Oct 7, 2021
b94f87b
parseNodeVersionFile changed from async function
hkaur008 Oct 7, 2021
10f97d5
removed extra line 15 installer.js
hkaur008 Oct 7, 2021
04a1a57
node-version-file: '../.nvmrc' changed to .nvmrc
hkaur008 Oct 7, 2021
aa06bd5
import * as hc from '@actions/http-client';
hkaur008 Oct 7, 2021
3f779ed
built done for changes
hkaur008 Oct 7, 2021
6f69e28
defined GITHUB_WORKSPACE env variable for node-version-file test
Xlient Oct 8, 2021
01342a8
- name: Setup node from node version file
hkaur008 Oct 25, 2021
fa4605f
.nvmrc
hkaur008 Oct 25, 2021
acc44a6
paragraph added in version.yml btw jobs
hkaur008 Oct 25, 2021
f606613
diff explanation for advanced-usage.md
hkaur008 Oct 25, 2021
9cdff02
link to supported section added
hkaur008 Oct 25, 2021
7ba3c8c
added paragraph in installer.test.ts line 11
hkaur008 Oct 25, 2021
96fa061
it blocks in lowercase
hkaur008 Oct 25, 2021
f927de6
separate function for resolving version file added
hkaur008 Oct 25, 2021
1b0aeb7
v14 .nvmrc
hkaur008 Oct 26, 2021
aab770a
set added to check the version of the file
hkaur008 Oct 26, 2021
36bb47b
return version otherwise action will fail
hkaur008 Oct 26, 2021
34ece93
syncing with main
hkaur008 Oct 26, 2021
edcb32f
Merge branch 'actions:main' into pull209
hkaur008 Nov 2, 2021
6382f41
checks implemented for node version file
hkaur008 Nov 2, 2021
ff9e2a3
Merge branch 'pull209' of https://github.com/hkaur008/setup-node into…
hkaur008 Nov 2, 2021
cc29140
build syncing
hkaur008 Nov 2, 2021
36c80a7
minor changes and error fix
hkaur008 Nov 2, 2021
7ff10b1
advanced.md changes
hkaur008 Nov 2, 2021
c1c4632
build success
hkaur008 Nov 2, 2021
243f7be
fixed unit tests
Xlient Nov 2, 2021
e313959
updated path to version file
Xlient Nov 2, 2021
8dfead4
fix error in unit test
Xlient Nov 8, 2021
d465795
add fix for installer tests
dmitry-shibanov Nov 8, 2021
12a17b4
Merge pull request #2 from dmitry-shibanov/v-dmshib/fix-installer-tests
Xlient Nov 8, 2021
caf9b24
removed redundant test
Xlient Nov 11, 2021
6ef0f8d
update dist
Xlient Nov 11, 2021
cc6b809
Update docs/advanced-usage.md
Xlient Nov 15, 2021
4e4d327
adds path to error output
Xlient Nov 16, 2021
a2b4d83
import os = require('os'); moved back
hkaur008 Nov 22, 2021
e75d7c1
Merge remote-tracking branch 'refs/remotes/origin/pull209' into pull209
hkaur008 Nov 22, 2021
0f9cdab
build
hkaur008 Nov 22, 2021
a7ed1ce
removed n-node-version file
hkaur008 Nov 25, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/version-file-workflow.yml
@@ -0,0 +1,33 @@


name: version-file-test


on:

push:
branches: [ add-node-version-file-support ]
paths-ignore:
- '**.md'
pull_request:
paths-ignore:
- '**.md'


workflow_dispatch:


jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v2
- name: Setup node test
uses: ./
with:
node-version-file: '.nvmrc'
- run: npm ci
- run: npm run build
1 change: 1 addition & 0 deletions .nvmrc
@@ -0,0 +1 @@
lts/*
hkaur008 marked this conversation as resolved.
Show resolved Hide resolved
16 changes: 15 additions & 1 deletion README.md
@@ -1,5 +1,4 @@
# setup-node

<p align="left">
<a href="https://github.com/actions/setup-node/actions?query=workflow%3Abuild-test"><img alt="build-test status" src="https://github.com/actions/setup-node/workflows/build-test/badge.svg"></a> <a href="https://github.com/actions/setup-node/actions?query=workflow%3Aversions"><img alt="versions status" src="https://github.com/actions/setup-node/workflows/versions/badge.svg"></a> <a href="https://github.com/actions/setup-node/actions?query=workflow%3Aproxy"><img alt="proxy status" src="https://github.com/actions/setup-node/workflows/proxy/badge.svg"></a>
</p>
Expand Down Expand Up @@ -72,6 +71,21 @@ steps:
- run: npm test
```

**Node version file:**

The `node-version-file` input allows you to use a file within your repository which contains the version of node your project uses for example `.nvmrc`. If both the `node-version` and the `node-version-file` inputs are provided the `node-version` input is used.
> The node version file is read from the project root

```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version-file: '.nvmrc'
- run: npm install
- run: npm test
```

hkaur008 marked this conversation as resolved.
Show resolved Hide resolved
## Matrix Testing:
```yaml
jobs:
Expand Down
146 changes: 141 additions & 5 deletions __tests__/installer.test.ts
Expand Up @@ -6,11 +6,12 @@ import cp from 'child_process';
import osm = require('os');
import path from 'path';
import * as main from '../src/main';
import * as im from '../src/installer';
import * as auth from '../src/authutil';

let nodeTestManifest = require('./data/versions-manifest.json');
hkaur008 marked this conversation as resolved.
Show resolved Hide resolved
let nodeTestDist = require('./data/node-dist-index.json');
import * as nv from '../src/installer';
hkaur008 marked this conversation as resolved.
Show resolved Hide resolved



describe('setup-node', () => {
let inputs = {} as any;
Expand All @@ -31,9 +32,11 @@ describe('setup-node', () => {
let dbgSpy: jest.SpyInstance;
let whichSpy: jest.SpyInstance;
let existsSpy: jest.SpyInstance;
let readFileSyncSpy: jest.SpyInstance;
let mkdirpSpy: jest.SpyInstance;
let execSpy: jest.SpyInstance;
let authSpy: jest.SpyInstance;
let parseNodeVersionSpy: jest.SpyInstance;

beforeEach(() => {
// @actions/core
Expand All @@ -57,11 +60,13 @@ describe('setup-node', () => {
exSpy = jest.spyOn(tc, 'extractTar');
cacheSpy = jest.spyOn(tc, 'cacheDir');
getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo');
getDistSpy = jest.spyOn(im, 'getVersionsFromDist');
getDistSpy = jest.spyOn(nv, 'getVersionsFromDist');
parseNodeVersionSpy = jest.spyOn(nv, 'parseNodeVersionFile');

// io
whichSpy = jest.spyOn(io, 'which');
existsSpy = jest.spyOn(fs, 'existsSync');
readFileSyncSpy = jest.spyOn(fs, 'readFileSync');
mkdirpSpy = jest.spyOn(io, 'mkdirP');

// disable authentication portion for installer tests
Expand All @@ -72,7 +77,7 @@ describe('setup-node', () => {
getManifestSpy.mockImplementation(
() => <tc.IToolRelease[]>nodeTestManifest
);
getDistSpy.mockImplementation(() => <im.INodeVersion>nodeTestDist);
getDistSpy.mockImplementation(() => <nv.INodeVersion>nodeTestDist);

// writes
cnSpy = jest.spyOn(process.stdout, 'write');
Expand Down Expand Up @@ -117,7 +122,7 @@ describe('setup-node', () => {
});

it('can mock dist versions', async () => {
let versions: im.INodeVersion[] = await im.getVersionsFromDist();
let versions: nv.INodeVersion[] = await nv.getVersionsFromDist();
expect(versions).toBeDefined();
expect(versions?.length).toBe(23);
});
Expand Down Expand Up @@ -549,12 +554,57 @@ describe('setup-node', () => {
});
});

describe('node-version-file flag', () => {
it('Not used if node-version is provided', async () => {
hkaur008 marked this conversation as resolved.
Show resolved Hide resolved
// Arrange
inputs['node-version'] = '12';

// Act
await main.run();

// Assert
expect(readFileSyncSpy).toHaveBeenCalledTimes(0);
});

it('Not used if node-version-file not provided', async () => {
// Act
await main.run();

// Assert
expect(readFileSyncSpy).toHaveBeenCalledTimes(0);
});

it('Reads node-version-file if provided', async () => {
// Arrange
const versionSpec = 'v12';
const versionFile = '.nvmrc';
const expectedVersionSpec = '12';

inputs['node-version-file'] = versionFile;

readFileSyncSpy.mockImplementation(() => versionSpec);
parseNodeVersionSpy.mockImplementation(() => expectedVersionSpec);

// Act
await main.run();

// Assert
expect(readFileSyncSpy).toHaveBeenCalledTimes(1);
expect(readFileSyncSpy).toHaveBeenCalledWith(
path.join(__dirname, '..', versionFile),
'utf8'
);
expect(parseNodeVersionSpy).toHaveBeenCalledWith(versionSpec);
expect(logSpy).toHaveBeenCalledWith(
`Resolved ${versionFile} as ${expectedVersionSpec}`);
});
describe('LTS version', () => {
beforeEach(() => {
os.platform = 'linux';
os.arch = 'x64';
inputs.stable = 'true';
});


it('find latest LTS version and resolve it from local cache (lts/erbium)', async () => {
// arrange
Expand Down Expand Up @@ -767,3 +817,89 @@ describe('setup-node', () => {
});
});
});

describe('node-version-file', () => {
let getVersionsFromDist: jest.SpyInstance;

beforeEach(() => {
// @actions/core
console.log('::stop-commands::stoptoken'); // Disable executing of runner commands when running tests in actions

getVersionsFromDist = jest.spyOn(nv, 'getVersionsFromDist');

// gets
getVersionsFromDist.mockImplementation(() => <nv.INodeVersion>nodeTestDist);
});

afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
//jest.restoreAllMocks();
});

afterAll(async () => {
console.log('::stoptoken::'); // Re-enable executing of runner commands when running tests in actions
}, 100000);

//--------------------------------------------------
// Manifest find tests
//--------------------------------------------------
describe('parseNodeVersionFile', () => {
it('without `v` prefix', async () => {
// Arrange
const versionSpec = '12';

// Act
const result = await nv.parseNodeVersionFile(versionSpec);

// Assert
expect(result).toBe(versionSpec);
});

it('lts/*', async () => {
// Arrange
const versionSpec = 'lts/*';

// Act
const result = await nv.parseNodeVersionFile(versionSpec);

// Assert
expect(result).toMatch(/^\d+\.\d+\.\d+$/);
});

it('lts/erbium', async () => {
// Arrange
const versionSpec = 'lts/*';

// Act
const result = await nv.parseNodeVersionFile(versionSpec);

// Assert
expect(result).toMatch(/\d\.\d\.\d/);
});

it('partial syntax like 12', async () => {
// Arrange
const versionSpec = '12';

// Act
const result = await nv.parseNodeVersionFile(versionSpec);

// Assert
expect(result).toBe(versionSpec);
});

it('partial syntax like 12.16', async () => {
// Arrange
const versionSpec = '12.16';

// Act
const result = await nv.parseNodeVersionFile(versionSpec);

// Assert
expect(result).toBe(versionSpec);
});
});
});

});
2 changes: 2 additions & 0 deletions action.yml
Expand Up @@ -7,6 +7,8 @@ inputs:
default: 'false'
node-version:
description: 'Version Spec of the version to use. Examples: 12.x, 10.15.1, >=10.15.0'
node-version-file:
description: 'File containing the version Spec of the version to use. Examples: .nvmrc'
hkaur008 marked this conversation as resolved.
Show resolved Hide resolved
architecture:
description: 'Target architecture for Node to use. Examples: x86, x64. Will use system architecture by default.'
check-latest:
Expand Down