mirror of
				https://github.com/actions/setup-node.git
				synced 2025-10-26 07:16:44 +08:00 
			
		
		
		
	Implement "check-latest" flag to check if pre-cached version is latest one (#165)
This commit is contained in:
		
							parent
							
								
									0e2f9cde8b
								
							
						
					
					
						commit
						1ae8f4b1fd
					
				
							
								
								
									
										2
									
								
								.github/workflows/build-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-test.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,7 +16,7 @@ jobs: | |||||||
|     runs-on: ${{ matrix.operating-system }} |     runs-on: ${{ matrix.operating-system }} | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest] |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v2 | ||||||
|       - name: Setup node 12 |       - name: Setup node 12 | ||||||
|  | |||||||
							
								
								
									
										86
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										86
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							| @ -12,36 +12,88 @@ on: | |||||||
|       - '**.md' |       - '**.md' | ||||||
|        |        | ||||||
| jobs: | jobs: | ||||||
|   versions: |   local-cache: | ||||||
|     runs-on: ${{ matrix.operating-system }} |     runs-on: ${{ matrix.operating-system }} | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest] |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|     defaults: |         node-version: [10, 12, 14] | ||||||
|       run: |  | ||||||
|         shell: bash |  | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v2 | ||||||
|       # test version that falls through to node dist |       - name: Setup Node | ||||||
|       - name: Setup node 11 from dist |  | ||||||
|         uses: ./ |         uses: ./ | ||||||
|         with: |         with: | ||||||
|           node-version: 11           |           node-version: ${{ matrix.node-version }} | ||||||
|       - name: Verify node and npm |       - name: Verify node and npm | ||||||
|         run: __tests__/verify-node.sh 11 |         run: __tests__/verify-node.sh "${{ matrix.node-version }}" | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |   manifest: | ||||||
|  |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|  |         node-version: [10.15, 12.16.0, 14.2.0] | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v2 | ||||||
|  |       - name: Setup Node | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           node-version: ${{ matrix.node-version }} | ||||||
|  |       - name: Verify node and npm | ||||||
|  |         run: __tests__/verify-node.sh "${{ matrix.node-version }}" | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |   check-latest: | ||||||
|  |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|  |         node-version: [10, 11, 12, 14] | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v2 | ||||||
|  |       - name: Setup Node and check latest | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           node-version: ${{ matrix.node-version }} | ||||||
|  |           check-latest: true | ||||||
|  |       - name: Verify node and npm | ||||||
|  |         run: __tests__/verify-node.sh "${{ matrix.node-version }}" | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |   node-dist: | ||||||
|  |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|  |         node-version: [11, 13] | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v2 | ||||||
|  |       - name: Setup Node from dist | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           node-version: ${{ matrix.node-version }} | ||||||
|  |       - name: Verify node and npm | ||||||
|  |         run: __tests__/verify-node.sh "${{ matrix.node-version }}" | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |   old-versions: | ||||||
|  |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v2 | ||||||
|       # test old versions which didn't have npm and layout different |       # test old versions which didn't have npm and layout different | ||||||
|       - name: Setup node 0.12.18 from dist |       - name: Setup node 0.12.18 from dist | ||||||
|         uses: ./ |         uses: ./ | ||||||
|         with: |         with: | ||||||
|           node-version: 0.12.18 |           node-version: 0.12.18 | ||||||
|       - name: Verify node |       - name: Verify node | ||||||
|         shell: bash |  | ||||||
|         run: __tests__/verify-node.sh 0.12.18 SKIP_NPM |         run: __tests__/verify-node.sh 0.12.18 SKIP_NPM | ||||||
|       # test version from node manifest |         shell: bash | ||||||
|       - name: Setup node 12.16.2 from manifest |  | ||||||
|         uses: ./ |  | ||||||
|         with: |  | ||||||
|           node-version: 12.16.2 |  | ||||||
|       - name: Verify node and npm |  | ||||||
|         run: __tests__/verify-node.sh 12         |  | ||||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @ -41,6 +41,20 @@ steps: | |||||||
| - run: npm test | - run: npm test | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | Check latest version:   | ||||||
|  | > In basic example, without `check-latest` flag, the action tries to resolve version from local cache firstly and download only if it is not found. Local cache on image is updated with a couple of weeks latency.   | ||||||
|  | `check-latest` flag forces the action to check if the cached version is the latest one. It reduces latency significantly but it is much more likely to incur version downloading. | ||||||
|  | ```yaml | ||||||
|  | steps: | ||||||
|  | - uses: actions/checkout@v2 | ||||||
|  | - uses: actions/setup-node@v2 | ||||||
|  |   with: | ||||||
|  |     node-version: '12' | ||||||
|  |     check-latest: true | ||||||
|  | - run: npm install | ||||||
|  | - run: npm test | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
| Matrix Testing: | Matrix Testing: | ||||||
| ```yaml | ```yaml | ||||||
| jobs: | jobs: | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ import path from 'path'; | |||||||
| import * as main from '../src/main'; | import * as main from '../src/main'; | ||||||
| import * as im from '../src/installer'; | import * as im from '../src/installer'; | ||||||
| import * as auth from '../src/authutil'; | import * as auth from '../src/authutil'; | ||||||
|  | import {context} from '@actions/github'; | ||||||
| 
 | 
 | ||||||
| let nodeTestManifest = require('./data/versions-manifest.json'); | let nodeTestManifest = require('./data/versions-manifest.json'); | ||||||
| let nodeTestDist = require('./data/node-dist-index.json'); | let nodeTestDist = require('./data/node-dist-index.json'); | ||||||
| @ -24,6 +25,7 @@ describe('setup-node', () => { | |||||||
|   let findSpy: jest.SpyInstance; |   let findSpy: jest.SpyInstance; | ||||||
|   let cnSpy: jest.SpyInstance; |   let cnSpy: jest.SpyInstance; | ||||||
|   let logSpy: jest.SpyInstance; |   let logSpy: jest.SpyInstance; | ||||||
|  |   let warningSpy: jest.SpyInstance; | ||||||
|   let getManifestSpy: jest.SpyInstance; |   let getManifestSpy: jest.SpyInstance; | ||||||
|   let getDistSpy: jest.SpyInstance; |   let getDistSpy: jest.SpyInstance; | ||||||
|   let platSpy: jest.SpyInstance; |   let platSpy: jest.SpyInstance; | ||||||
| @ -77,8 +79,9 @@ describe('setup-node', () => { | |||||||
| 
 | 
 | ||||||
|     // writes
 |     // writes
 | ||||||
|     cnSpy = jest.spyOn(process.stdout, 'write'); |     cnSpy = jest.spyOn(process.stdout, 'write'); | ||||||
|     logSpy = jest.spyOn(console, 'log'); |     logSpy = jest.spyOn(core, 'info'); | ||||||
|     dbgSpy = jest.spyOn(core, 'debug'); |     dbgSpy = jest.spyOn(core, 'debug'); | ||||||
|  |     warningSpy = jest.spyOn(core, 'warning'); | ||||||
|     cnSpy.mockImplementation(line => { |     cnSpy.mockImplementation(line => { | ||||||
|       // uncomment to debug
 |       // uncomment to debug
 | ||||||
|       // process.stderr.write('write:' + line + '\n');
 |       // process.stderr.write('write:' + line + '\n');
 | ||||||
| @ -333,4 +336,154 @@ describe('setup-node', () => { | |||||||
| 
 | 
 | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::error::${errMsg}${osm.EOL}`); |     expect(cnSpy).toHaveBeenCalledWith(`::error::${errMsg}${osm.EOL}`); | ||||||
|   }); |   }); | ||||||
|  | 
 | ||||||
|  |   describe('check-latest flag', () => { | ||||||
|  |     it('use local version and dont check manifest if check-latest is not specified', async () => { | ||||||
|  |       os.platform = 'linux'; | ||||||
|  |       os.arch = 'x64'; | ||||||
|  | 
 | ||||||
|  |       inputs['node-version'] = '12'; | ||||||
|  |       inputs['check-latest'] = 'false'; | ||||||
|  | 
 | ||||||
|  |       const toolPath = path.normalize('/cache/node/12.16.1/x64'); | ||||||
|  |       findSpy.mockReturnValue(toolPath); | ||||||
|  |       await main.run(); | ||||||
|  | 
 | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); | ||||||
|  |       expect(logSpy).not.toHaveBeenCalledWith( | ||||||
|  |         'Attempt to resolve the latest version from manifest...' | ||||||
|  |       ); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it('check latest version and resolve it from local cache', async () => { | ||||||
|  |       os.platform = 'linux'; | ||||||
|  |       os.arch = 'x64'; | ||||||
|  | 
 | ||||||
|  |       inputs['node-version'] = '12'; | ||||||
|  |       inputs['check-latest'] = 'true'; | ||||||
|  | 
 | ||||||
|  |       const toolPath = path.normalize('/cache/node/12.16.2/x64'); | ||||||
|  |       findSpy.mockReturnValue(toolPath); | ||||||
|  |       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|  |       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|  |       cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  | 
 | ||||||
|  |       await main.run(); | ||||||
|  | 
 | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         'Attempt to resolve the latest version from manifest...' | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith("Resolved as '12.16.2'"); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it('check latest version and install it from manifest', async () => { | ||||||
|  |       os.platform = 'linux'; | ||||||
|  |       os.arch = 'x64'; | ||||||
|  | 
 | ||||||
|  |       inputs['node-version'] = '12'; | ||||||
|  |       inputs['check-latest'] = 'true'; | ||||||
|  | 
 | ||||||
|  |       findSpy.mockImplementation(() => ''); | ||||||
|  |       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|  |       const toolPath = path.normalize('/cache/node/12.16.2/x64'); | ||||||
|  |       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|  |       cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  |       const expectedUrl = | ||||||
|  |         'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; | ||||||
|  | 
 | ||||||
|  |       await main.run(); | ||||||
|  | 
 | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         'Attempt to resolve the latest version from manifest...' | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith("Resolved as '12.16.2'"); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         `Acquiring 12.16.2 from ${expectedUrl}` | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith('Extracting ...'); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it('fallback to dist if version if not found in manifest', async () => { | ||||||
|  |       os.platform = 'linux'; | ||||||
|  |       os.arch = 'x64'; | ||||||
|  | 
 | ||||||
|  |       // a version which is not in the manifest but is in node dist
 | ||||||
|  |       let versionSpec = '11'; | ||||||
|  | 
 | ||||||
|  |       inputs['node-version'] = versionSpec; | ||||||
|  |       inputs['check-latest'] = 'true'; | ||||||
|  |       inputs['always-auth'] = false; | ||||||
|  |       inputs['token'] = 'faketoken'; | ||||||
|  | 
 | ||||||
|  |       // ... but not in the local cache
 | ||||||
|  |       findSpy.mockImplementation(() => ''); | ||||||
|  | 
 | ||||||
|  |       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|  |       let toolPath = path.normalize('/cache/node/11.11.0/x64'); | ||||||
|  |       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|  |       cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  | 
 | ||||||
|  |       await main.run(); | ||||||
|  | 
 | ||||||
|  |       let expPath = path.join(toolPath, 'bin'); | ||||||
|  | 
 | ||||||
|  |       expect(dlSpy).toHaveBeenCalled(); | ||||||
|  |       expect(exSpy).toHaveBeenCalled(); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         'Attempt to resolve the latest version from manifest...' | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         `Failed to resolve version ${versionSpec} from manifest` | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         `Attempting to download ${versionSpec}...` | ||||||
|  |       ); | ||||||
|  |       expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it('fallback to dist if manifest is not available', async () => { | ||||||
|  |       os.platform = 'linux'; | ||||||
|  |       os.arch = 'x64'; | ||||||
|  | 
 | ||||||
|  |       // a version which is not in the manifest but is in node dist
 | ||||||
|  |       let versionSpec = '12'; | ||||||
|  | 
 | ||||||
|  |       inputs['node-version'] = versionSpec; | ||||||
|  |       inputs['check-latest'] = 'true'; | ||||||
|  |       inputs['always-auth'] = false; | ||||||
|  |       inputs['token'] = 'faketoken'; | ||||||
|  | 
 | ||||||
|  |       // ... but not in the local cache
 | ||||||
|  |       findSpy.mockImplementation(() => ''); | ||||||
|  |       getManifestSpy.mockImplementation(() => { | ||||||
|  |         throw new Error('Unable to download manifest'); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|  |       let toolPath = path.normalize('/cache/node/12.11.0/x64'); | ||||||
|  |       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|  |       cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  | 
 | ||||||
|  |       await main.run(); | ||||||
|  | 
 | ||||||
|  |       let expPath = path.join(toolPath, 'bin'); | ||||||
|  | 
 | ||||||
|  |       expect(dlSpy).toHaveBeenCalled(); | ||||||
|  |       expect(exSpy).toHaveBeenCalled(); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         'Attempt to resolve the latest version from manifest...' | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         'Unable to resolve version from manifest...' | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         `Failed to resolve version ${versionSpec} from manifest` | ||||||
|  |       ); | ||||||
|  |       expect(logSpy).toHaveBeenCalledWith( | ||||||
|  |         `Attempting to download ${versionSpec}...` | ||||||
|  |       ); | ||||||
|  |       expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -7,6 +7,9 @@ inputs: | |||||||
|     default: 'false' |     default: 'false' | ||||||
|   node-version: |   node-version: | ||||||
|     description: 'Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0' |     description: 'Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0' | ||||||
|  |   check-latest: | ||||||
|  |     description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec' | ||||||
|  |     default: false | ||||||
|   registry-url: |   registry-url: | ||||||
|     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN' |     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN' | ||||||
|   scope: |   scope: | ||||||
|  | |||||||
							
								
								
									
										54
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -4643,12 +4643,12 @@ function run() { | |||||||
|             if (!version) { |             if (!version) { | ||||||
|                 version = core.getInput('version'); |                 version = core.getInput('version'); | ||||||
|             } |             } | ||||||
|             console.log(`version: ${version}`); |  | ||||||
|             if (version) { |             if (version) { | ||||||
|                 let token = core.getInput('token'); |                 let token = core.getInput('token'); | ||||||
|                 let auth = !token || isGhes() ? undefined : `token ${token}`; |                 let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||||
|                 let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; |                 let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; | ||||||
|                 yield installer.getNode(version, stable, auth); |                 const checkLatest = (core.getInput('check-latest') || 'false').toUpperCase() === 'TRUE'; | ||||||
|  |                 yield installer.getNode(version, stable, checkLatest, auth); | ||||||
|             } |             } | ||||||
|             const registryUrl = core.getInput('registry-url'); |             const registryUrl = core.getInput('registry-url'); | ||||||
|             const alwaysAuth = core.getInput('always-auth'); |             const alwaysAuth = core.getInput('always-auth'); | ||||||
| @ -12994,19 +12994,30 @@ const tc = __importStar(__webpack_require__(533)); | |||||||
| const path = __importStar(__webpack_require__(622)); | const path = __importStar(__webpack_require__(622)); | ||||||
| const semver = __importStar(__webpack_require__(280)); | const semver = __importStar(__webpack_require__(280)); | ||||||
| const fs = __webpack_require__(747); | const fs = __webpack_require__(747); | ||||||
| function getNode(versionSpec, stable, auth) { | function getNode(versionSpec, stable, checkLatest, auth) { | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |     return __awaiter(this, void 0, void 0, function* () { | ||||||
|         let osPlat = os.platform(); |         let osPlat = os.platform(); | ||||||
|         let osArch = translateArchToDistUrl(os.arch()); |         let osArch = translateArchToDistUrl(os.arch()); | ||||||
|  |         if (checkLatest) { | ||||||
|  |             core.info('Attempt to resolve the latest version from manifest...'); | ||||||
|  |             const resolvedVersion = yield resolveVersionFromManifest(versionSpec, stable, auth); | ||||||
|  |             if (resolvedVersion) { | ||||||
|  |                 versionSpec = resolvedVersion; | ||||||
|  |                 core.info(`Resolved as '${versionSpec}'`); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 core.info(`Failed to resolve version ${versionSpec} from manifest`); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|         // check cache
 |         // check cache
 | ||||||
|         let toolPath; |         let toolPath; | ||||||
|         toolPath = tc.find('node', versionSpec); |         toolPath = tc.find('node', versionSpec); | ||||||
|         // If not found in cache, download
 |         // If not found in cache, download
 | ||||||
|         if (toolPath) { |         if (toolPath) { | ||||||
|             console.log(`Found in cache @ ${toolPath}`); |             core.info(`Found in cache @ ${toolPath}`); | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
|             console.log(`Attempting to download ${versionSpec}...`); |             core.info(`Attempting to download ${versionSpec}...`); | ||||||
|             let downloadPath = ''; |             let downloadPath = ''; | ||||||
|             let info = null; |             let info = null; | ||||||
|             //
 |             //
 | ||||||
| @ -13015,24 +13026,24 @@ function getNode(versionSpec, stable, auth) { | |||||||
|             try { |             try { | ||||||
|                 info = yield getInfoFromManifest(versionSpec, stable, auth); |                 info = yield getInfoFromManifest(versionSpec, stable, auth); | ||||||
|                 if (info) { |                 if (info) { | ||||||
|                     console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); |                     core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||||
|                     downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, auth); |                     downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, auth); | ||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
|                     console.log('Not found in manifest.  Falling back to download directly from Node'); |                     core.info('Not found in manifest.  Falling back to download directly from Node'); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             catch (err) { |             catch (err) { | ||||||
|                 // Rate limit?
 |                 // Rate limit?
 | ||||||
|                 if (err instanceof tc.HTTPError && |                 if (err instanceof tc.HTTPError && | ||||||
|                     (err.httpStatusCode === 403 || err.httpStatusCode === 429)) { |                     (err.httpStatusCode === 403 || err.httpStatusCode === 429)) { | ||||||
|                     console.log(`Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded`); |                     core.info(`Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded`); | ||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
|                     console.log(err.message); |                     core.info(err.message); | ||||||
|                 } |                 } | ||||||
|                 core.debug(err.stack); |                 core.debug(err.stack); | ||||||
|                 console.log('Falling back to download directly from Node'); |                 core.info('Falling back to download directly from Node'); | ||||||
|             } |             } | ||||||
|             //
 |             //
 | ||||||
|             // Download from nodejs.org
 |             // Download from nodejs.org
 | ||||||
| @ -13042,7 +13053,7 @@ function getNode(versionSpec, stable, auth) { | |||||||
|                 if (!info) { |                 if (!info) { | ||||||
|                     throw new Error(`Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`); |                     throw new Error(`Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`); | ||||||
|                 } |                 } | ||||||
|                 console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); |                 core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||||
|                 try { |                 try { | ||||||
|                     downloadPath = yield tc.downloadTool(info.downloadUrl); |                     downloadPath = yield tc.downloadTool(info.downloadUrl); | ||||||
|                 } |                 } | ||||||
| @ -13056,7 +13067,7 @@ function getNode(versionSpec, stable, auth) { | |||||||
|             //
 |             //
 | ||||||
|             // Extract
 |             // Extract
 | ||||||
|             //
 |             //
 | ||||||
|             console.log('Extracting ...'); |             core.info('Extracting ...'); | ||||||
|             let extPath; |             let extPath; | ||||||
|             info = info || {}; // satisfy compiler, never null when reaches here
 |             info = info || {}; // satisfy compiler, never null when reaches here
 | ||||||
|             if (osPlat == 'win32') { |             if (osPlat == 'win32') { | ||||||
| @ -13078,9 +13089,9 @@ function getNode(versionSpec, stable, auth) { | |||||||
|             //
 |             //
 | ||||||
|             // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded
 |             // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded
 | ||||||
|             //
 |             //
 | ||||||
|             console.log('Adding to the cache ...'); |             core.info('Adding to the cache ...'); | ||||||
|             toolPath = yield tc.cacheDir(extPath, 'node', info.resolvedVersion); |             toolPath = yield tc.cacheDir(extPath, 'node', info.resolvedVersion); | ||||||
|             console.log('Done'); |             core.info('Done'); | ||||||
|         } |         } | ||||||
|         //
 |         //
 | ||||||
|         // a tool installer initimately knows details about the layout of that tool
 |         // a tool installer initimately knows details about the layout of that tool
 | ||||||
| @ -13100,7 +13111,6 @@ function getInfoFromManifest(versionSpec, stable, auth) { | |||||||
|     return __awaiter(this, void 0, void 0, function* () { |     return __awaiter(this, void 0, void 0, function* () { | ||||||
|         let info = null; |         let info = null; | ||||||
|         const releases = yield tc.getManifestFromRepo('actions', 'node-versions', auth); |         const releases = yield tc.getManifestFromRepo('actions', 'node-versions', auth); | ||||||
|         console.log(`matching ${versionSpec}...`); |  | ||||||
|         const rel = yield tc.findFromManifest(versionSpec, stable, releases); |         const rel = yield tc.findFromManifest(versionSpec, stable, releases); | ||||||
|         if (rel && rel.files.length > 0) { |         if (rel && rel.files.length > 0) { | ||||||
|             info = {}; |             info = {}; | ||||||
| @ -13136,6 +13146,18 @@ function getInfoFromDist(versionSpec) { | |||||||
|         }; |         }; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  | function resolveVersionFromManifest(versionSpec, stable, auth) { | ||||||
|  |     return __awaiter(this, void 0, void 0, function* () { | ||||||
|  |         try { | ||||||
|  |             const info = yield getInfoFromManifest(versionSpec, stable, auth); | ||||||
|  |             return info === null || info === void 0 ? void 0 : info.resolvedVersion; | ||||||
|  |         } | ||||||
|  |         catch (err) { | ||||||
|  |             core.info('Unable to resolve version from manifest...'); | ||||||
|  |             core.debug(err.message); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | } | ||||||
| // TODO - should we just export this from @actions/tool-cache? Lifted directly from there
 | // TODO - should we just export this from @actions/tool-cache? Lifted directly from there
 | ||||||
| function evaluateVersions(versions, versionSpec) { | function evaluateVersions(versions, versionSpec) { | ||||||
|     let version = ''; |     let version = ''; | ||||||
| @ -13233,7 +13255,7 @@ function acquireNodeFromFallbackLocation(version) { | |||||||
|         try { |         try { | ||||||
|             exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; |             exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; | ||||||
|             libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; |             libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; | ||||||
|             console.log(`Downloading only node binary from ${exeUrl}`); |             core.info(`Downloading only node binary from ${exeUrl}`); | ||||||
|             const exePath = yield tc.downloadTool(exeUrl); |             const exePath = yield tc.downloadTool(exeUrl); | ||||||
|             yield io.cp(exePath, path.join(tempDir, 'node.exe')); |             yield io.cp(exePath, path.join(tempDir, 'node.exe')); | ||||||
|             const libPath = yield tc.downloadTool(libUrl); |             const libPath = yield tc.downloadTool(libUrl); | ||||||
|  | |||||||
| @ -26,20 +26,36 @@ interface INodeVersionInfo { | |||||||
| export async function getNode( | export async function getNode( | ||||||
|   versionSpec: string, |   versionSpec: string, | ||||||
|   stable: boolean, |   stable: boolean, | ||||||
|  |   checkLatest: boolean, | ||||||
|   auth: string | undefined |   auth: string | undefined | ||||||
| ) { | ) { | ||||||
|   let osPlat: string = os.platform(); |   let osPlat: string = os.platform(); | ||||||
|   let osArch: string = translateArchToDistUrl(os.arch()); |   let osArch: string = translateArchToDistUrl(os.arch()); | ||||||
| 
 | 
 | ||||||
|  |   if (checkLatest) { | ||||||
|  |     core.info('Attempt to resolve the latest version from manifest...'); | ||||||
|  |     const resolvedVersion = await resolveVersionFromManifest( | ||||||
|  |       versionSpec, | ||||||
|  |       stable, | ||||||
|  |       auth | ||||||
|  |     ); | ||||||
|  |     if (resolvedVersion) { | ||||||
|  |       versionSpec = resolvedVersion; | ||||||
|  |       core.info(`Resolved as '${versionSpec}'`); | ||||||
|  |     } else { | ||||||
|  |       core.info(`Failed to resolve version ${versionSpec} from manifest`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   // check cache
 |   // check cache
 | ||||||
|   let toolPath: string; |   let toolPath: string; | ||||||
|   toolPath = tc.find('node', versionSpec); |   toolPath = tc.find('node', versionSpec); | ||||||
| 
 | 
 | ||||||
|   // If not found in cache, download
 |   // If not found in cache, download
 | ||||||
|   if (toolPath) { |   if (toolPath) { | ||||||
|     console.log(`Found in cache @ ${toolPath}`); |     core.info(`Found in cache @ ${toolPath}`); | ||||||
|   } else { |   } else { | ||||||
|     console.log(`Attempting to download ${versionSpec}...`); |     core.info(`Attempting to download ${versionSpec}...`); | ||||||
|     let downloadPath = ''; |     let downloadPath = ''; | ||||||
|     let info: INodeVersionInfo | null = null; |     let info: INodeVersionInfo | null = null; | ||||||
| 
 | 
 | ||||||
| @ -49,12 +65,10 @@ export async function getNode( | |||||||
|     try { |     try { | ||||||
|       info = await getInfoFromManifest(versionSpec, stable, auth); |       info = await getInfoFromManifest(versionSpec, stable, auth); | ||||||
|       if (info) { |       if (info) { | ||||||
|         console.log( |         core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||||
|           `Acquiring ${info.resolvedVersion} from ${info.downloadUrl}` |  | ||||||
|         ); |  | ||||||
|         downloadPath = await tc.downloadTool(info.downloadUrl, undefined, auth); |         downloadPath = await tc.downloadTool(info.downloadUrl, undefined, auth); | ||||||
|       } else { |       } else { | ||||||
|         console.log( |         core.info( | ||||||
|           'Not found in manifest.  Falling back to download directly from Node' |           'Not found in manifest.  Falling back to download directly from Node' | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
| @ -64,14 +78,14 @@ export async function getNode( | |||||||
|         err instanceof tc.HTTPError && |         err instanceof tc.HTTPError && | ||||||
|         (err.httpStatusCode === 403 || err.httpStatusCode === 429) |         (err.httpStatusCode === 403 || err.httpStatusCode === 429) | ||||||
|       ) { |       ) { | ||||||
|         console.log( |         core.info( | ||||||
|           `Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded` |           `Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded` | ||||||
|         ); |         ); | ||||||
|       } else { |       } else { | ||||||
|         console.log(err.message); |         core.info(err.message); | ||||||
|       } |       } | ||||||
|       core.debug(err.stack); |       core.debug(err.stack); | ||||||
|       console.log('Falling back to download directly from Node'); |       core.info('Falling back to download directly from Node'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     //
 |     //
 | ||||||
| @ -85,7 +99,7 @@ export async function getNode( | |||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); |       core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||||
|       try { |       try { | ||||||
|         downloadPath = await tc.downloadTool(info.downloadUrl); |         downloadPath = await tc.downloadTool(info.downloadUrl); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
| @ -100,7 +114,7 @@ export async function getNode( | |||||||
|     //
 |     //
 | ||||||
|     // Extract
 |     // Extract
 | ||||||
|     //
 |     //
 | ||||||
|     console.log('Extracting ...'); |     core.info('Extracting ...'); | ||||||
|     let extPath: string; |     let extPath: string; | ||||||
|     info = info || ({} as INodeVersionInfo); // satisfy compiler, never null when reaches here
 |     info = info || ({} as INodeVersionInfo); // satisfy compiler, never null when reaches here
 | ||||||
|     if (osPlat == 'win32') { |     if (osPlat == 'win32') { | ||||||
| @ -122,9 +136,9 @@ export async function getNode( | |||||||
|     //
 |     //
 | ||||||
|     // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded
 |     // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded
 | ||||||
|     //
 |     //
 | ||||||
|     console.log('Adding to the cache ...'); |     core.info('Adding to the cache ...'); | ||||||
|     toolPath = await tc.cacheDir(extPath, 'node', info.resolvedVersion); |     toolPath = await tc.cacheDir(extPath, 'node', info.resolvedVersion); | ||||||
|     console.log('Done'); |     core.info('Done'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   //
 |   //
 | ||||||
| @ -152,7 +166,6 @@ async function getInfoFromManifest( | |||||||
|     'node-versions', |     'node-versions', | ||||||
|     auth |     auth | ||||||
|   ); |   ); | ||||||
|   console.log(`matching ${versionSpec}...`); |  | ||||||
|   const rel = await tc.findFromManifest(versionSpec, stable, releases); |   const rel = await tc.findFromManifest(versionSpec, stable, releases); | ||||||
| 
 | 
 | ||||||
|   if (rel && rel.files.length > 0) { |   if (rel && rel.files.length > 0) { | ||||||
| @ -197,6 +210,20 @@ async function getInfoFromDist( | |||||||
|   }; |   }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | async function resolveVersionFromManifest( | ||||||
|  |   versionSpec: string, | ||||||
|  |   stable: boolean, | ||||||
|  |   auth: string | undefined | ||||||
|  | ): Promise<string | undefined> { | ||||||
|  |   try { | ||||||
|  |     const info = await getInfoFromManifest(versionSpec, stable, auth); | ||||||
|  |     return info?.resolvedVersion; | ||||||
|  |   } catch (err) { | ||||||
|  |     core.info('Unable to resolve version from manifest...'); | ||||||
|  |     core.debug(err.message); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // TODO - should we just export this from @actions/tool-cache? Lifted directly from there
 | // TODO - should we just export this from @actions/tool-cache? Lifted directly from there
 | ||||||
| function evaluateVersions(versions: string[], versionSpec: string): string { | function evaluateVersions(versions: string[], versionSpec: string): string { | ||||||
|   let version = ''; |   let version = ''; | ||||||
| @ -301,7 +328,7 @@ async function acquireNodeFromFallbackLocation( | |||||||
|     exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; |     exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; | ||||||
|     libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; |     libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; | ||||||
| 
 | 
 | ||||||
|     console.log(`Downloading only node binary from ${exeUrl}`); |     core.info(`Downloading only node binary from ${exeUrl}`); | ||||||
| 
 | 
 | ||||||
|     const exePath = await tc.downloadTool(exeUrl); |     const exePath = await tc.downloadTool(exeUrl); | ||||||
|     await io.cp(exePath, path.join(tempDir, 'node.exe')); |     await io.cp(exePath, path.join(tempDir, 'node.exe')); | ||||||
|  | |||||||
| @ -15,12 +15,13 @@ export async function run() { | |||||||
|       version = core.getInput('version'); |       version = core.getInput('version'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     console.log(`version: ${version}`); |  | ||||||
|     if (version) { |     if (version) { | ||||||
|       let token = core.getInput('token'); |       let token = core.getInput('token'); | ||||||
|       let auth = !token || isGhes() ? undefined : `token ${token}`; |       let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||||
|       let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; |       let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; | ||||||
|       await installer.getNode(version, stable, auth); |       const checkLatest = | ||||||
|  |         (core.getInput('check-latest') || 'false').toUpperCase() === 'TRUE'; | ||||||
|  |       await installer.getNode(version, stable, checkLatest, auth); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const registryUrl: string = core.getInput('registry-url'); |     const registryUrl: string = core.getInput('registry-url'); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user