You've already forked setup-node
							
							
				mirror of
				https://github.com/actions/setup-node.git
				synced 2025-10-31 23:26:22 +07:00 
			
		
		
		
	feat: support private mirrors (#1240)
* feat: support private mirrors * chore: change fallback message with mirrors
This commit is contained in:
		| @ -498,6 +498,70 @@ describe('setup-node', () => { | ||||
|         ); | ||||
|       } | ||||
|     ); | ||||
|  | ||||
|     it.each([ | ||||
|       [ | ||||
|         '20.0.0-v8-canary', | ||||
|         '20.0.0-v8-canary20221103f7e2421e91', | ||||
|         '20.0.0-v8-canary20221030fefe1c0879', | ||||
|         'https://my_mirror.org/download/v8-canary/v20.0.0-v8-canary20221103f7e2421e91/node-v20.0.0-v8-canary20221103f7e2421e91-linux-x64.tar.gz' | ||||
|       ], | ||||
|       [ | ||||
|         '20-v8-canary', | ||||
|         '20.0.0-v8-canary20221103f7e2421e91', | ||||
|         '20.0.0-v8-canary20221030fefe1c0879', | ||||
|         'https://my_mirror.org/download/v8-canary/v20.0.0-v8-canary20221103f7e2421e91/node-v20.0.0-v8-canary20221103f7e2421e91-linux-x64.tar.gz' | ||||
|       ], | ||||
|       [ | ||||
|         '19.0.0-v8-canary', | ||||
|         '19.0.0-v8-canary202210187d6960f23f', | ||||
|         '19.0.0-v8-canary202210172ec229fc56', | ||||
|         'https://my_mirror.org/download/v8-canary/v19.0.0-v8-canary202210187d6960f23f/node-v19.0.0-v8-canary202210187d6960f23f-linux-x64.tar.gz' | ||||
|       ], | ||||
|       [ | ||||
|         '19-v8-canary', | ||||
|         '19.0.0-v8-canary202210187d6960f23f', | ||||
|         '19.0.0-v8-canary202210172ec229fc56', | ||||
|         'https://my_mirror.org/download/v8-canary/v19.0.0-v8-canary202210187d6960f23f/node-v19.0.0-v8-canary202210187d6960f23f-linux-x64.tar.gz' | ||||
|       ] | ||||
|     ])( | ||||
|       'get %s version from dist if check-latest is true', | ||||
|       async (input, expectedVersion, foundVersion, expectedUrl) => { | ||||
|         const foundToolPath = path.normalize(`/cache/node/${foundVersion}/x64`); | ||||
|         const toolPath = path.normalize(`/cache/node/${expectedVersion}/x64`); | ||||
|  | ||||
|         inputs['node-version'] = input; | ||||
|         inputs['check-latest'] = 'true'; | ||||
|         os['arch'] = 'x64'; | ||||
|         os['platform'] = 'linux'; | ||||
|         inputs['mirror'] = 'https://my_mirror.org'; | ||||
|         inputs['mirror-token'] = 'faketoken'; | ||||
|  | ||||
|         findSpy.mockReturnValue(foundToolPath); | ||||
|         findAllVersionsSpy.mockReturnValue([ | ||||
|           '20.0.0-v8-canary20221030fefe1c0879', | ||||
|           '19.0.0-v8-canary202210172ec229fc56', | ||||
|           '20.0.0-v8-canary2022102310ff1e5a8d' | ||||
|         ]); | ||||
|         dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|         exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|         cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|         // act | ||||
|         await main.run(); | ||||
|  | ||||
|         // assert | ||||
|         expect(findAllVersionsSpy).toHaveBeenCalled(); | ||||
|         expect(logSpy).toHaveBeenCalledWith( | ||||
|           `Acquiring ${expectedVersion} - ${os.arch} from ${expectedUrl}` | ||||
|         ); | ||||
|         expect(logSpy).toHaveBeenCalledWith('Extracting ...'); | ||||
|         expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...'); | ||||
|         expect(cnSpy).toHaveBeenCalledWith( | ||||
|           `::add-path::${path.join(toolPath, 'bin')}${osm.EOL}` | ||||
|         ); | ||||
|       } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   describe('setup-node v8 canary tests', () => { | ||||
|  | ||||
| @ -315,7 +315,7 @@ describe('setup-node', () => { | ||||
|     await main.run(); | ||||
|  | ||||
|     workingUrls.forEach(url => { | ||||
|       expect(dlSpy).toHaveBeenCalledWith(url); | ||||
|       expect(dlSpy).toHaveBeenCalledWith(url, undefined, undefined); | ||||
|     }); | ||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${toolPath}${osm.EOL}`); | ||||
|   }); | ||||
| @ -449,6 +449,54 @@ describe('setup-node', () => { | ||||
|     } | ||||
|   }, 100000); | ||||
|  | ||||
|   it('acquires specified architecture of node from mirror', async () => { | ||||
|     for (const {arch, version, osSpec} of [ | ||||
|       { | ||||
|         arch: 'x86', | ||||
|         version: '18.0.0-nightly202110204cb3e06ed8', | ||||
|         osSpec: 'win32' | ||||
|       }, | ||||
|       { | ||||
|         arch: 'x86', | ||||
|         version: '20.0.0-nightly2022101987cdf7d412', | ||||
|         osSpec: 'win32' | ||||
|       } | ||||
|     ]) { | ||||
|       os.platform = osSpec; | ||||
|       os.arch = arch; | ||||
|       const fileExtension = os.platform === 'win32' ? '7z' : 'tar.gz'; | ||||
|       const platform = { | ||||
|         linux: 'linux', | ||||
|         darwin: 'darwin', | ||||
|         win32: 'win' | ||||
|       }[os.platform]; | ||||
|  | ||||
|       inputs['node-version'] = version; | ||||
|       inputs['architecture'] = arch; | ||||
|       inputs['always-auth'] = false; | ||||
|       inputs['token'] = 'faketoken'; | ||||
|       inputs['mirror'] = 'https://my-mirror.org'; | ||||
|       inputs['mirror-token'] = 'my-mirror-token'; | ||||
|  | ||||
|       const expectedUrl = `https://my-mirror.org/download/nightly/v${version}/node-v${version}-${platform}-${arch}.${fileExtension}`; | ||||
|  | ||||
|       // ... but not in the local cache | ||||
|       findSpy.mockImplementation(() => ''); | ||||
|       findAllVersionsSpy.mockImplementation(() => []); | ||||
|  | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       const toolPath = path.normalize(`/cache/node/${version}/${arch}`); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|       await main.run(); | ||||
|       expect(dlSpy).toHaveBeenCalled(); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         `Acquiring ${version} - ${arch} from ${expectedUrl}` | ||||
|       ); | ||||
|     } | ||||
|   }, 100000); | ||||
|  | ||||
|   describe('nightly versions', () => { | ||||
|     it.each([ | ||||
|       [ | ||||
|  | ||||
| @ -282,6 +282,43 @@ describe('setup-node', () => { | ||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||
|   }); | ||||
|  | ||||
|   it('falls back to a version from node dist from mirror', async () => { | ||||
|     os.platform = 'linux'; | ||||
|     os.arch = 'x64'; | ||||
|  | ||||
|     // a version which is not in the manifest but is in node dist | ||||
|     const versionSpec = '11.15.0'; | ||||
|     const mirror = 'https://my_mirror_url'; | ||||
|     inputs['node-version'] = versionSpec; | ||||
|     inputs['always-auth'] = false; | ||||
|     inputs['token'] = 'faketoken'; | ||||
|     inputs['mirror'] = mirror; | ||||
|     inputs['mirror-token'] = 'faketoken'; | ||||
|  | ||||
|     // ... but not in the local cache | ||||
|     findSpy.mockImplementation(() => ''); | ||||
|  | ||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|     const toolPath = path.normalize('/cache/node/11.15.0/x64'); | ||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|     await main.run(); | ||||
|  | ||||
|     const expPath = path.join(toolPath, 'bin'); | ||||
|  | ||||
|     expect(getManifestSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).toHaveBeenCalledWith( | ||||
|       `Attempting to download ${versionSpec}...` | ||||
|     ); | ||||
|     expect(logSpy).toHaveBeenCalledWith( | ||||
|       `Not found in manifest. Falling back to download directly from ${mirror}` | ||||
|     ); | ||||
|     expect(dlSpy).toHaveBeenCalled(); | ||||
|     expect(exSpy).toHaveBeenCalled(); | ||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||
|   }); | ||||
|  | ||||
|   it('falls back to a version from node dist', async () => { | ||||
|     os.platform = 'linux'; | ||||
|     os.arch = 'x64'; | ||||
| @ -828,4 +865,46 @@ describe('setup-node', () => { | ||||
|       } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('acquires specified architecture of node from mirror', async () => { | ||||
|     for (const {arch, version, osSpec} of [ | ||||
|       {arch: 'x86', version: '12.16.2', osSpec: 'win32'}, | ||||
|       {arch: 'x86', version: '14.0.0', osSpec: 'win32'} | ||||
|     ]) { | ||||
|       os.platform = osSpec; | ||||
|       os.arch = arch; | ||||
|       const fileExtension = os.platform === 'win32' ? '7z' : 'tar.gz'; | ||||
|       const platform = { | ||||
|         linux: 'linux', | ||||
|         darwin: 'darwin', | ||||
|         win32: 'win' | ||||
|       }[os.platform]; | ||||
|  | ||||
|       inputs['node-version'] = version; | ||||
|       inputs['architecture'] = arch; | ||||
|       inputs['always-auth'] = false; | ||||
|       inputs['token'] = 'faketoken'; | ||||
|       inputs['mirror'] = 'https://my_mirror_url'; | ||||
|       inputs['mirror-token'] = 'faketoken'; | ||||
|  | ||||
|       const expectedUrl = | ||||
|         arch === 'x64' | ||||
|           ? `https://github.com/actions/node-versions/releases/download/${version}/node-${version}-${platform}-${arch}.zip` | ||||
|           : `https://my_mirror_url/dist/v${version}/node-v${version}-${platform}-${arch}.${fileExtension}`; | ||||
|  | ||||
|       // ... but not in the local cache | ||||
|       findSpy.mockImplementation(() => ''); | ||||
|  | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       const toolPath = path.normalize(`/cache/node/${version}/${arch}`); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|       await main.run(); | ||||
|       expect(dlSpy).toHaveBeenCalled(); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         `Acquiring ${version} - ${arch} from ${expectedUrl}` | ||||
|       ); | ||||
|     } | ||||
|   }, 100000); | ||||
| }); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Marco Ippolito
					Marco Ippolito