mirror of
				https://gitea.com/actions/setup-node.git
				synced 2025-10-29 15:52:42 +08:00 
			
		
		
		
	Compare commits
	
		
			40 Commits
		
	
	
		
			start-v2
			...
			node-versi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e73ffbcdec | ||
|  | 2ae9264901 | ||
|  | 2a0fbec10d | ||
|  | 0a9e8b1d0f | ||
|  | a875da2574 | ||
|  | a80a170798 | ||
|  | 5e7b076d00 | ||
|  | 8e221092f3 | ||
|  | 6a1b66a606 | ||
|  | 9fcef3fcea | ||
|  | beb2155295 | ||
|  | 11f920585c | ||
|  | dd6f5ab66c | ||
|  | f7c5caf605 | ||
|  | a4145577de | ||
|  | 42746a4f3c | ||
|  | c8617ac6ae | ||
|  | 1b2d431484 | ||
|  | 5e5ef8fd55 | ||
|  | 2fb08c4f31 | ||
|  | e3ad114cc4 | ||
|  | 501fd29d66 | ||
|  | 2bdb2ab1c9 | ||
|  | a47b2f66c6 | ||
|  | 89ea387bde | ||
|  | ed3a918d25 | ||
|  | 44c9c18728 | ||
|  | e715d9a456 | ||
|  | b1f2e78536 | ||
|  | 55897e37f3 | ||
|  | 46903d1fb1 | ||
|  | 28505ad4d3 | ||
|  | 2d53d29868 | ||
|  | 1e163ded31 | ||
|  | ffde538781 | ||
|  | 0cc027b656 | ||
|  | e99a7e62b2 | ||
|  | 0dc69b3a71 | ||
|  | 52eb8a7524 | ||
|  | 6b7f6c9fa6 | 
							
								
								
									
										32
									
								
								.github/workflows/build-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/build-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| name: build-test | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - '**.md'     | ||||
|   push:     | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/* | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|        | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ${{ matrix.operating-system }} | ||||
|     strategy: | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup node 12 | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
|       - run: npm ci | ||||
|       - run: npm run build | ||||
|       - run: npm run format-check | ||||
|       - run: npm test | ||||
|       - name: Verify no unstaged changes | ||||
|         if: runner.os != 'windows' | ||||
|         run: __tests__/verify-no-unstaged-changes.sh | ||||
							
								
								
									
										56
									
								
								.github/workflows/proxy.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								.github/workflows/proxy.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| name: proxy | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - '**.md'     | ||||
|   push:     | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/* | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|        | ||||
| jobs: | ||||
|   test-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy:     | ||||
|       fail-fast: false     | ||||
|     container: | ||||
|       image: ubuntu:latest | ||||
|       options: --dns 127.0.0.1 | ||||
|     services: | ||||
|       squid-proxy: | ||||
|         image: datadog/squid:latest | ||||
|         ports: | ||||
|           - 3128:3128 | ||||
|     env: | ||||
|       https_proxy: http://squid-proxy:3128 | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: rm -rf $RUNNER_TOOL_CACHE/* | ||||
|       - name: Setup node 10 | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 10.x | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 10 | ||||
|  | ||||
|   test-bypass-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy:     | ||||
|       fail-fast: false | ||||
|     env: | ||||
|       https_proxy: http://no-such-proxy:3128 | ||||
|       no_proxy: api.github.com,github.com,nodejs.org,registry.npmjs.org,*.s3.amazonaws.com,s3.amazonaws.com | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: rm -rf $RUNNER_TOOL_CACHE/* | ||||
|       - name: Setup node 11 | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 11 | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 11 | ||||
							
								
								
									
										47
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| name: versions | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - '**.md'     | ||||
|   push:     | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/* | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|        | ||||
| jobs: | ||||
|   versions: | ||||
|     runs-on: ${{ matrix.operating-system }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest] | ||||
|     defaults: | ||||
|       run: | ||||
|         shell: bash | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       # test version that falls through to node dist | ||||
|       - name: Setup node 11 from dist | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 11           | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 11 | ||||
|       # test old versions which didn't have npm and layout different       | ||||
|       - name: Setup node 0.12.18 from dist | ||||
|         uses: ./                  | ||||
|         with: | ||||
|           node-version: 0.12.18 | ||||
|       - name: Verify node | ||||
|         shell: bash | ||||
|         run: __tests__/verify-node.sh 0.12.18 SKIP_NPM  | ||||
|       # test version from node manifest | ||||
|       - 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         | ||||
							
								
								
									
										94
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,94 +0,0 @@ | ||||
| name: Main workflow | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/* | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ${{ matrix.operating-system }} | ||||
|     strategy: | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup node 12 | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
|       - run: npm ci | ||||
|       - run: npm run build | ||||
|       - run: npm run format-check | ||||
|       - run: npm test | ||||
|       - name: Verify no unstaged changes | ||||
|         if: runner.os != 'windows' | ||||
|         run: __tests__/verify-no-unstaged-changes.sh | ||||
|  | ||||
|   test: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: rm -rf $RUNNER_TOOL_CACHE/* | ||||
|       - name: Setup node 10 | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 10.x | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 10 | ||||
|  | ||||
|   test-fallback: | ||||
|     runs-on: windows-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: mv "${{ runner.tool_cache }}" "${{ runner.tool_cache }}.old" | ||||
|       - name: Setup node 0.12.18 # For non LTS versions of Node, the zip is not always available | ||||
|         uses: ./                 # and falls back to downloading node.exe and node.lib | ||||
|         with: | ||||
|           node-version: 0.12.18 | ||||
|       - name: Verify node | ||||
|         shell: bash | ||||
|         run: __tests__/verify-node.sh 0.12.18 SKIP_NPM | ||||
|  | ||||
|   test-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     container: | ||||
|       image: ubuntu:latest | ||||
|       options: --dns 127.0.0.1 | ||||
|     services: | ||||
|       squid-proxy: | ||||
|         image: datadog/squid:latest | ||||
|         ports: | ||||
|           - 3128:3128 | ||||
|     env: | ||||
|       https_proxy: http://squid-proxy:3128 | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: rm -rf $RUNNER_TOOL_CACHE/* | ||||
|       - name: Setup node 10 | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 10.x | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 10 | ||||
|  | ||||
|   test-bypass-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     env: | ||||
|       https_proxy: http://no-such-proxy:3128 | ||||
|       no_proxy: github.com,nodejs.org,registry.npmjs.org | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Clear tool cache | ||||
|         run: rm -rf $RUNNER_TOOL_CACHE/* | ||||
|       - name: Setup node 10 | ||||
|         uses: ./ | ||||
|         with: | ||||
|           node-version: 10.x | ||||
|       - name: Verify node and npm | ||||
|         run: __tests__/verify-node.sh 10 | ||||
| @@ -31,7 +31,7 @@ jobs: | ||||
|     runs-on: ubuntu-16.04 | ||||
|     strategy: | ||||
|       matrix: | ||||
|         node: [ '10', '8' ] | ||||
|         node: [ '10', '12' ] | ||||
|     name: Node ${{ matrix.node }} sample | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|   | ||||
							
								
								
									
										505
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										505
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -563,13 +563,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const os = __webpack_require__(87); | ||||
| const events = __webpack_require__(614); | ||||
| const child = __webpack_require__(129); | ||||
| const path = __webpack_require__(622); | ||||
| const io = __webpack_require__(1); | ||||
| const ioUtil = __webpack_require__(672); | ||||
| const os = __importStar(__webpack_require__(87)); | ||||
| const events = __importStar(__webpack_require__(614)); | ||||
| const child = __importStar(__webpack_require__(129)); | ||||
| const path = __importStar(__webpack_require__(622)); | ||||
| const io = __importStar(__webpack_require__(1)); | ||||
| const ioUtil = __importStar(__webpack_require__(672)); | ||||
| /* eslint-disable @typescript-eslint/unbound-method */ | ||||
| const IS_WINDOWS = process.platform === 'win32'; | ||||
| /* | ||||
| @@ -1013,6 +1020,12 @@ class ToolRunner extends events.EventEmitter { | ||||
|                         resolve(exitCode); | ||||
|                     } | ||||
|                 }); | ||||
|                 if (this.options.input) { | ||||
|                     if (!cp.stdin) { | ||||
|                         throw new Error('child process missing stdin'); | ||||
|                     } | ||||
|                     cp.stdin.end(this.options.input); | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| @@ -1325,7 +1338,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const semver = __importStar(__webpack_require__(280)); | ||||
| const core_1 = __webpack_require__(470); | ||||
| const core_1 = __webpack_require__(902); | ||||
| // needs to be require for core node modules to be mocked | ||||
| /* eslint @typescript-eslint/no-require-imports: 0 */ | ||||
| const os = __webpack_require__(87); | ||||
| @@ -4618,6 +4631,7 @@ const core = __importStar(__webpack_require__(470)); | ||||
| const installer = __importStar(__webpack_require__(749)); | ||||
| const auth = __importStar(__webpack_require__(202)); | ||||
| const path = __importStar(__webpack_require__(622)); | ||||
| const url_1 = __webpack_require__(835); | ||||
| function run() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         try { | ||||
| @@ -4632,8 +4646,9 @@ function run() { | ||||
|             console.log(`version: ${version}`); | ||||
|             if (version) { | ||||
|                 let token = core.getInput('token'); | ||||
|                 let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||
|                 let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; | ||||
|                 yield installer.getNode(version, stable, token); | ||||
|                 yield installer.getNode(version, stable, auth); | ||||
|             } | ||||
|             const registryUrl = core.getInput('registry-url'); | ||||
|             const alwaysAuth = core.getInput('always-auth'); | ||||
| @@ -4651,6 +4666,10 @@ function run() { | ||||
|     }); | ||||
| } | ||||
| exports.run = run; | ||||
| function isGhes() { | ||||
|     const ghUrl = new url_1.URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); | ||||
|     return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; | ||||
| } | ||||
| //# sourceMappingURL=main.js.map | ||||
|  | ||||
| /***/ }), | ||||
| @@ -10870,7 +10889,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { | ||||
|     return (mod && mod.__esModule) ? mod : { "default": mod }; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const core = __importStar(__webpack_require__(470)); | ||||
| const core = __importStar(__webpack_require__(902)); | ||||
| const io = __importStar(__webpack_require__(1)); | ||||
| const fs = __importStar(__webpack_require__(747)); | ||||
| const mm = __importStar(__webpack_require__(31)); | ||||
| @@ -10899,9 +10918,10 @@ const userAgent = 'actions/tool-cache'; | ||||
|  * | ||||
|  * @param url       url of tool to download | ||||
|  * @param dest      path to download tool | ||||
|  * @param auth      authorization header | ||||
|  * @returns         path to downloaded tool | ||||
|  */ | ||||
| function downloadTool(url, dest, token) { | ||||
| function downloadTool(url, dest, auth) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         dest = dest || path.join(_getTempDirectory(), v4_1.default()); | ||||
|         yield io.mkdirP(path.dirname(dest)); | ||||
| @@ -10912,7 +10932,7 @@ function downloadTool(url, dest, token) { | ||||
|         const maxSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MAX_SECONDS', 20); | ||||
|         const retryHelper = new retry_helper_1.RetryHelper(maxAttempts, minSeconds, maxSeconds); | ||||
|         return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () { | ||||
|             return yield downloadToolAttempt(url, dest || '', token); | ||||
|             return yield downloadToolAttempt(url, dest || '', auth); | ||||
|         }), (err) => { | ||||
|             if (err instanceof HTTPError && err.httpStatusCode) { | ||||
|                 // Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests | ||||
| @@ -10928,7 +10948,7 @@ function downloadTool(url, dest, token) { | ||||
|     }); | ||||
| } | ||||
| exports.downloadTool = downloadTool; | ||||
| function downloadToolAttempt(url, dest, token) { | ||||
| function downloadToolAttempt(url, dest, auth) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         if (fs.existsSync(dest)) { | ||||
|             throw new Error(`Destination file path ${dest} already exists`); | ||||
| @@ -10938,9 +10958,10 @@ function downloadToolAttempt(url, dest, token) { | ||||
|             allowRetries: false | ||||
|         }); | ||||
|         let headers; | ||||
|         if (token) { | ||||
|         if (auth) { | ||||
|             core.debug('set auth'); | ||||
|             headers = { | ||||
|                 authorization: `token ${token}` | ||||
|                 authorization: auth | ||||
|             }; | ||||
|         } | ||||
|         const response = yield http.get(url, headers); | ||||
| @@ -10998,9 +11019,10 @@ function extract7z(file, dest, _7zPath) { | ||||
|         process.chdir(dest); | ||||
|         if (_7zPath) { | ||||
|             try { | ||||
|                 const logLevel = core.isDebug() ? '-bb1' : '-bb0'; | ||||
|                 const args = [ | ||||
|                     'x', | ||||
|                     '-bb1', | ||||
|                     logLevel, | ||||
|                     '-bd', | ||||
|                     '-sccUTF-8', | ||||
|                     file | ||||
| @@ -11076,7 +11098,16 @@ function extractTar(file, dest, flags = 'xz') { | ||||
|         core.debug(versionOutput.trim()); | ||||
|         const isGnuTar = versionOutput.toUpperCase().includes('GNU TAR'); | ||||
|         // Initialize args | ||||
|         const args = [flags]; | ||||
|         let args; | ||||
|         if (flags instanceof Array) { | ||||
|             args = flags; | ||||
|         } | ||||
|         else { | ||||
|             args = [flags]; | ||||
|         } | ||||
|         if (core.isDebug() && !flags.includes('v')) { | ||||
|             args.push('-v'); | ||||
|         } | ||||
|         let destArg = dest; | ||||
|         let fileArg = file; | ||||
|         if (IS_WINDOWS && isGnuTar) { | ||||
| @@ -11126,7 +11157,7 @@ function extractZipWin(file, dest) { | ||||
|         const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); | ||||
|         const command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`; | ||||
|         // run powershell | ||||
|         const powershellPath = yield io.which('powershell'); | ||||
|         const powershellPath = yield io.which('powershell', true); | ||||
|         const args = [ | ||||
|             '-NoLogo', | ||||
|             '-Sta', | ||||
| @@ -11142,8 +11173,12 @@ function extractZipWin(file, dest) { | ||||
| } | ||||
| function extractZipNix(file, dest) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const unzipPath = yield io.which('unzip'); | ||||
|         yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest }); | ||||
|         const unzipPath = yield io.which('unzip', true); | ||||
|         const args = [file]; | ||||
|         if (!core.isDebug()) { | ||||
|             args.unshift('-q'); | ||||
|         } | ||||
|         yield exec_1.exec(`"${unzipPath}"`, args, { cwd: dest }); | ||||
|     }); | ||||
| } | ||||
| /** | ||||
| @@ -11271,14 +11306,16 @@ function findAllVersions(toolName, arch) { | ||||
|     return versions; | ||||
| } | ||||
| exports.findAllVersions = findAllVersions; | ||||
| function getManifestFromRepo(owner, repo, token, branch = 'master') { | ||||
| function getManifestFromRepo(owner, repo, auth, branch = 'master') { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         let releases = []; | ||||
|         const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${branch}`; | ||||
|         const http = new httpm.HttpClient('tool-cache'); | ||||
|         const headers = { | ||||
|             authorization: `token ${token}` | ||||
|         }; | ||||
|         const headers = {}; | ||||
|         if (auth) { | ||||
|             core.debug('set auth'); | ||||
|             headers.authorization = auth; | ||||
|         } | ||||
|         const response = yield http.getJson(treeUrl, headers); | ||||
|         if (!response.result) { | ||||
|             return releases; | ||||
| @@ -12956,12 +12993,12 @@ const io = __importStar(__webpack_require__(1)); | ||||
| const tc = __importStar(__webpack_require__(533)); | ||||
| const path = __importStar(__webpack_require__(622)); | ||||
| const semver = __importStar(__webpack_require__(280)); | ||||
| function getNode(versionSpec, stable, token) { | ||||
| const fs = __webpack_require__(747); | ||||
| function getNode(versionSpec, stable, auth) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         let osPlat = os.platform(); | ||||
|         let osArch = translateArchToDistUrl(os.arch()); | ||||
|         // check cache | ||||
|         let info = null; | ||||
|         let toolPath; | ||||
|         toolPath = tc.find('node', versionSpec); | ||||
|         // If not found in cache, download | ||||
| @@ -12970,40 +13007,80 @@ function getNode(versionSpec, stable, token) { | ||||
|         } | ||||
|         else { | ||||
|             console.log(`Attempting to download ${versionSpec}...`); | ||||
|             let info = yield getInfoFromManifest(versionSpec, stable, token); | ||||
|             if (!info) { | ||||
|                 console.log('Not found in manifest.  Falling back to download directly from Node'); | ||||
|                 info = yield getInfoFromDist(versionSpec); | ||||
|             } | ||||
|             if (!info) { | ||||
|                 throw new Error(`Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`); | ||||
|             } | ||||
|             console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||
|             let downloadPath = ''; | ||||
|             let info = null; | ||||
|             // | ||||
|             // Try download from internal distribution (popular versions only) | ||||
|             // | ||||
|             try { | ||||
|                 downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, token); | ||||
|                 info = yield getInfoFromManifest(versionSpec, stable, auth); | ||||
|                 if (info) { | ||||
|                     console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||
|                     downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, auth); | ||||
|                 } | ||||
|                 else { | ||||
|                     console.log('Not found in manifest.  Falling back to download directly from Node'); | ||||
|                 } | ||||
|             } | ||||
|             catch (err) { | ||||
|                 if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { | ||||
|                     return yield acquireNodeFromFallbackLocation(info.resolvedVersion); | ||||
|                 // Rate limit? | ||||
|                 if (err instanceof tc.HTTPError && | ||||
|                     (err.httpStatusCode === 403 || err.httpStatusCode === 429)) { | ||||
|                     console.log(`Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded`); | ||||
|                 } | ||||
|                 else { | ||||
|                     console.log(err.message); | ||||
|                 } | ||||
|                 core.debug(err.stack); | ||||
|                 console.log('Falling back to download directly from Node'); | ||||
|             } | ||||
|             // | ||||
|             // Download from nodejs.org | ||||
|             // | ||||
|             if (!downloadPath) { | ||||
|                 info = yield getInfoFromDist(versionSpec); | ||||
|                 if (!info) { | ||||
|                     throw new Error(`Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`); | ||||
|                 } | ||||
|                 console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||
|                 try { | ||||
|                     downloadPath = yield tc.downloadTool(info.downloadUrl); | ||||
|                 } | ||||
|                 catch (err) { | ||||
|                     if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { | ||||
|                         return yield acquireNodeFromFallbackLocation(info.resolvedVersion); | ||||
|                     } | ||||
|                     throw err; | ||||
|                 } | ||||
|                 throw err; | ||||
|             } | ||||
|             // | ||||
|             // Extract | ||||
|             // | ||||
|             console.log('Extracting ...'); | ||||
|             let extPath; | ||||
|             info = info || {}; // satisfy compiler, never null when reaches here | ||||
|             if (osPlat == 'win32') { | ||||
|                 let _7zPath = path.join(__dirname, '..', 'externals', '7zr.exe'); | ||||
|                 extPath = yield tc.extract7z(downloadPath, undefined, _7zPath); | ||||
|                 // 7z extracts to folder matching file name | ||||
|                 let nestedPath = path.join(extPath, path.basename(info.fileName, '.7z')); | ||||
|                 if (fs.existsSync(nestedPath)) { | ||||
|                     extPath = nestedPath; | ||||
|                 } | ||||
|             } | ||||
|             else { | ||||
|                 extPath = yield tc.extractTar(downloadPath); | ||||
|                 extPath = yield tc.extractTar(downloadPath, undefined, [ | ||||
|                     'xz', | ||||
|                     '--strip', | ||||
|                     '1' | ||||
|                 ]); | ||||
|             } | ||||
|             // | ||||
|             // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded | ||||
|             // | ||||
|             console.log('Adding to the cache ...'); | ||||
|             toolPath = yield tc.cacheDir(extPath, 'node', info.resolvedVersion); | ||||
|             console.log('Done'); | ||||
|         } | ||||
|         // | ||||
|         // a tool installer initimately knows details about the layout of that tool | ||||
| @@ -13019,10 +13096,10 @@ function getNode(versionSpec, stable, token) { | ||||
|     }); | ||||
| } | ||||
| exports.getNode = getNode; | ||||
| function getInfoFromManifest(versionSpec, stable, token) { | ||||
| function getInfoFromManifest(versionSpec, stable, auth) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         let info = null; | ||||
|         const releases = yield tc.getManifestFromRepo('actions', 'node-versions', token); | ||||
|         const releases = yield tc.getManifestFromRepo('actions', 'node-versions', auth); | ||||
|         console.log(`matching ${versionSpec}...`); | ||||
|         const rel = yield tc.findFromManifest(versionSpec, stable, releases); | ||||
|         if (rel && rel.files.length > 0) { | ||||
| @@ -13030,7 +13107,6 @@ function getInfoFromManifest(versionSpec, stable, token) { | ||||
|             info.resolvedVersion = rel.version; | ||||
|             info.downloadUrl = rel.files[0].download_url; | ||||
|             info.fileName = rel.files[0].filename; | ||||
|             info.token = token; | ||||
|         } | ||||
|         return info; | ||||
|     }); | ||||
| @@ -13039,7 +13115,6 @@ function getInfoFromDist(versionSpec) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         let osPlat = os.platform(); | ||||
|         let osArch = translateArchToDistUrl(os.arch()); | ||||
|         let info = null; | ||||
|         let version; | ||||
|         version = yield queryDistForMatch(versionSpec); | ||||
|         if (!version) { | ||||
| @@ -13158,6 +13233,7 @@ function acquireNodeFromFallbackLocation(version) { | ||||
|         try { | ||||
|             exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; | ||||
|             libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; | ||||
|             console.log(`Downloading only node binary from ${exeUrl}`); | ||||
|             const exePath = yield tc.downloadTool(exeUrl); | ||||
|             yield io.cp(exePath, path.join(tempDir, 'node.exe')); | ||||
|             const libPath = yield tc.downloadTool(libUrl); | ||||
| @@ -13176,7 +13252,9 @@ function acquireNodeFromFallbackLocation(version) { | ||||
|                 throw err; | ||||
|             } | ||||
|         } | ||||
|         return yield tc.cacheDir(tempDir, 'node', version); | ||||
|         let toolPath = yield tc.cacheDir(tempDir, 'node', version); | ||||
|         core.addPath(toolPath); | ||||
|         return toolPath; | ||||
|     }); | ||||
| } | ||||
| // os.arch does not always match the relative download url, e.g. | ||||
| @@ -15920,6 +15998,105 @@ function set(object, path, value) { | ||||
| module.exports = set; | ||||
|  | ||||
|  | ||||
| /***/ }), | ||||
|  | ||||
| /***/ 888: | ||||
| /***/ (function(__unusedmodule, exports, __webpack_require__) { | ||||
|  | ||||
| "use strict"; | ||||
|  | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const os = __importStar(__webpack_require__(87)); | ||||
| /** | ||||
|  * Commands | ||||
|  * | ||||
|  * Command Format: | ||||
|  *   ::name key=value,key=value::message | ||||
|  * | ||||
|  * Examples: | ||||
|  *   ::warning::This is the message | ||||
|  *   ::set-env name=MY_VAR::some value | ||||
|  */ | ||||
| function issueCommand(command, properties, message) { | ||||
|     const cmd = new Command(command, properties, message); | ||||
|     process.stdout.write(cmd.toString() + os.EOL); | ||||
| } | ||||
| exports.issueCommand = issueCommand; | ||||
| function issue(name, message = '') { | ||||
|     issueCommand(name, {}, message); | ||||
| } | ||||
| exports.issue = issue; | ||||
| const CMD_STRING = '::'; | ||||
| class Command { | ||||
|     constructor(command, properties, message) { | ||||
|         if (!command) { | ||||
|             command = 'missing.command'; | ||||
|         } | ||||
|         this.command = command; | ||||
|         this.properties = properties; | ||||
|         this.message = message; | ||||
|     } | ||||
|     toString() { | ||||
|         let cmdStr = CMD_STRING + this.command; | ||||
|         if (this.properties && Object.keys(this.properties).length > 0) { | ||||
|             cmdStr += ' '; | ||||
|             let first = true; | ||||
|             for (const key in this.properties) { | ||||
|                 if (this.properties.hasOwnProperty(key)) { | ||||
|                     const val = this.properties[key]; | ||||
|                     if (val) { | ||||
|                         if (first) { | ||||
|                             first = false; | ||||
|                         } | ||||
|                         else { | ||||
|                             cmdStr += ','; | ||||
|                         } | ||||
|                         cmdStr += `${key}=${escapeProperty(val)}`; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         cmdStr += `${CMD_STRING}${escapeData(this.message)}`; | ||||
|         return cmdStr; | ||||
|     } | ||||
| } | ||||
| /** | ||||
|  * Sanitizes an input into a string so it can be passed into issueCommand safely | ||||
|  * @param input input to sanitize into a string | ||||
|  */ | ||||
| function toCommandValue(input) { | ||||
|     if (input === null || input === undefined) { | ||||
|         return ''; | ||||
|     } | ||||
|     else if (typeof input === 'string' || input instanceof String) { | ||||
|         return input; | ||||
|     } | ||||
|     return JSON.stringify(input); | ||||
| } | ||||
| exports.toCommandValue = toCommandValue; | ||||
| function escapeData(s) { | ||||
|     return toCommandValue(s) | ||||
|         .replace(/%/g, '%25') | ||||
|         .replace(/\r/g, '%0D') | ||||
|         .replace(/\n/g, '%0A'); | ||||
| } | ||||
| function escapeProperty(s) { | ||||
|     return toCommandValue(s) | ||||
|         .replace(/%/g, '%25') | ||||
|         .replace(/\r/g, '%0D') | ||||
|         .replace(/\n/g, '%0A') | ||||
|         .replace(/:/g, '%3A') | ||||
|         .replace(/,/g, '%2C'); | ||||
| } | ||||
| //# sourceMappingURL=command.js.map | ||||
|  | ||||
| /***/ }), | ||||
|  | ||||
| /***/ 899: | ||||
| @@ -16025,6 +16202,235 @@ function patchForDeprecation(octokit, apiOptions, method, methodName) { | ||||
| } | ||||
|  | ||||
|  | ||||
| /***/ }), | ||||
|  | ||||
| /***/ 902: | ||||
| /***/ (function(__unusedmodule, exports, __webpack_require__) { | ||||
|  | ||||
| "use strict"; | ||||
|  | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const command_1 = __webpack_require__(888); | ||||
| const os = __importStar(__webpack_require__(87)); | ||||
| const path = __importStar(__webpack_require__(622)); | ||||
| /** | ||||
|  * The code to exit an action | ||||
|  */ | ||||
| var ExitCode; | ||||
| (function (ExitCode) { | ||||
|     /** | ||||
|      * A code indicating that the action was successful | ||||
|      */ | ||||
|     ExitCode[ExitCode["Success"] = 0] = "Success"; | ||||
|     /** | ||||
|      * A code indicating that the action was a failure | ||||
|      */ | ||||
|     ExitCode[ExitCode["Failure"] = 1] = "Failure"; | ||||
| })(ExitCode = exports.ExitCode || (exports.ExitCode = {})); | ||||
| //----------------------------------------------------------------------- | ||||
| // Variables | ||||
| //----------------------------------------------------------------------- | ||||
| /** | ||||
|  * Sets env variable for this action and future actions in the job | ||||
|  * @param name the name of the variable to set | ||||
|  * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify | ||||
|  */ | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||||
| function exportVariable(name, val) { | ||||
|     const convertedVal = command_1.toCommandValue(val); | ||||
|     process.env[name] = convertedVal; | ||||
|     command_1.issueCommand('set-env', { name }, convertedVal); | ||||
| } | ||||
| exports.exportVariable = exportVariable; | ||||
| /** | ||||
|  * Registers a secret which will get masked from logs | ||||
|  * @param secret value of the secret | ||||
|  */ | ||||
| function setSecret(secret) { | ||||
|     command_1.issueCommand('add-mask', {}, secret); | ||||
| } | ||||
| exports.setSecret = setSecret; | ||||
| /** | ||||
|  * Prepends inputPath to the PATH (for this action and future actions) | ||||
|  * @param inputPath | ||||
|  */ | ||||
| function addPath(inputPath) { | ||||
|     command_1.issueCommand('add-path', {}, inputPath); | ||||
|     process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; | ||||
| } | ||||
| exports.addPath = addPath; | ||||
| /** | ||||
|  * Gets the value of an input.  The value is also trimmed. | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
|  * @returns   string | ||||
|  */ | ||||
| function getInput(name, options) { | ||||
|     const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; | ||||
|     if (options && options.required && !val) { | ||||
|         throw new Error(`Input required and not supplied: ${name}`); | ||||
|     } | ||||
|     return val.trim(); | ||||
| } | ||||
| exports.getInput = getInput; | ||||
| /** | ||||
|  * Sets the value of an output. | ||||
|  * | ||||
|  * @param     name     name of the output to set | ||||
|  * @param     value    value to store. Non-string values will be converted to a string via JSON.stringify | ||||
|  */ | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||||
| function setOutput(name, value) { | ||||
|     command_1.issueCommand('set-output', { name }, value); | ||||
| } | ||||
| exports.setOutput = setOutput; | ||||
| /** | ||||
|  * Enables or disables the echoing of commands into stdout for the rest of the step. | ||||
|  * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. | ||||
|  * | ||||
|  */ | ||||
| function setCommandEcho(enabled) { | ||||
|     command_1.issue('echo', enabled ? 'on' : 'off'); | ||||
| } | ||||
| exports.setCommandEcho = setCommandEcho; | ||||
| //----------------------------------------------------------------------- | ||||
| // Results | ||||
| //----------------------------------------------------------------------- | ||||
| /** | ||||
|  * Sets the action status to failed. | ||||
|  * When the action exits it will be with an exit code of 1 | ||||
|  * @param message add error issue message | ||||
|  */ | ||||
| function setFailed(message) { | ||||
|     process.exitCode = ExitCode.Failure; | ||||
|     error(message); | ||||
| } | ||||
| exports.setFailed = setFailed; | ||||
| //----------------------------------------------------------------------- | ||||
| // Logging Commands | ||||
| //----------------------------------------------------------------------- | ||||
| /** | ||||
|  * Gets whether Actions Step Debug is on or not | ||||
|  */ | ||||
| function isDebug() { | ||||
|     return process.env['RUNNER_DEBUG'] === '1'; | ||||
| } | ||||
| exports.isDebug = isDebug; | ||||
| /** | ||||
|  * Writes debug message to user log | ||||
|  * @param message debug message | ||||
|  */ | ||||
| function debug(message) { | ||||
|     command_1.issueCommand('debug', {}, message); | ||||
| } | ||||
| exports.debug = debug; | ||||
| /** | ||||
|  * Adds an error issue | ||||
|  * @param message error issue message. Errors will be converted to string via toString() | ||||
|  */ | ||||
| function error(message) { | ||||
|     command_1.issue('error', message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.error = error; | ||||
| /** | ||||
|  * Adds an warning issue | ||||
|  * @param message warning issue message. Errors will be converted to string via toString() | ||||
|  */ | ||||
| function warning(message) { | ||||
|     command_1.issue('warning', message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.warning = warning; | ||||
| /** | ||||
|  * Writes info to log with console.log. | ||||
|  * @param message info message | ||||
|  */ | ||||
| function info(message) { | ||||
|     process.stdout.write(message + os.EOL); | ||||
| } | ||||
| exports.info = info; | ||||
| /** | ||||
|  * Begin an output group. | ||||
|  * | ||||
|  * Output until the next `groupEnd` will be foldable in this group | ||||
|  * | ||||
|  * @param name The name of the output group | ||||
|  */ | ||||
| function startGroup(name) { | ||||
|     command_1.issue('group', name); | ||||
| } | ||||
| exports.startGroup = startGroup; | ||||
| /** | ||||
|  * End an output group. | ||||
|  */ | ||||
| function endGroup() { | ||||
|     command_1.issue('endgroup'); | ||||
| } | ||||
| exports.endGroup = endGroup; | ||||
| /** | ||||
|  * Wrap an asynchronous function call in a group. | ||||
|  * | ||||
|  * Returns the same type as the function itself. | ||||
|  * | ||||
|  * @param name The name of the group | ||||
|  * @param fn The function to wrap in the group | ||||
|  */ | ||||
| function group(name, fn) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         startGroup(name); | ||||
|         let result; | ||||
|         try { | ||||
|             result = yield fn(); | ||||
|         } | ||||
|         finally { | ||||
|             endGroup(); | ||||
|         } | ||||
|         return result; | ||||
|     }); | ||||
| } | ||||
| exports.group = group; | ||||
| //----------------------------------------------------------------------- | ||||
| // Wrapper action state | ||||
| //----------------------------------------------------------------------- | ||||
| /** | ||||
|  * Saves state for current action, the state can only be retrieved by this action's post job execution. | ||||
|  * | ||||
|  * @param     name     name of the state to store | ||||
|  * @param     value    value to store. Non-string values will be converted to a string via JSON.stringify | ||||
|  */ | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||||
| function saveState(name, value) { | ||||
|     command_1.issueCommand('save-state', { name }, value); | ||||
| } | ||||
| exports.saveState = saveState; | ||||
| /** | ||||
|  * Gets the value of an state set by this action's main execution. | ||||
|  * | ||||
|  * @param     name     name of the state to get | ||||
|  * @returns   string | ||||
|  */ | ||||
| function getState(name) { | ||||
|     return process.env[`STATE_${name}`] || ''; | ||||
| } | ||||
| exports.getState = getState; | ||||
| //# sourceMappingURL=core.js.map | ||||
|  | ||||
| /***/ }), | ||||
|  | ||||
| /***/ 929: | ||||
| @@ -16666,7 +17072,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const core = __importStar(__webpack_require__(470)); | ||||
| const core = __importStar(__webpack_require__(902)); | ||||
| /** | ||||
|  * Internal class for retries | ||||
|  */ | ||||
| @@ -16735,8 +17141,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const tr = __webpack_require__(9); | ||||
| const tr = __importStar(__webpack_require__(9)); | ||||
| /** | ||||
|  * Exec a command. | ||||
|  * Output will be streamed to the live console. | ||||
|   | ||||
							
								
								
									
										19
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										19
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -10,9 +10,9 @@ | ||||
|       "integrity": "sha512-IbCx7oefq+Gi6FWbSs2Fnw8VkEI6Y4gvjrYprY3RV//ksq/KPMlClOerJ4jRosyal6zkUIc8R9fS/cpRMlGClg==" | ||||
|     }, | ||||
|     "@actions/exec": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.3.tgz", | ||||
|       "integrity": "sha512-TogJGnueOmM7ntCi0ASTUj4LapRRtDfj57Ja4IhPmg2fls28uVOPbAn8N+JifaOumN2UG3oEO/Ixek2A4NcYSA==", | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.4.tgz", | ||||
|       "integrity": "sha512-4DPChWow9yc9W3WqEbUj8Nr86xkpyE29ZzWjXucHItclLbEW6jr80Zx4nqv18QL6KK65+cifiQZXvnqgTV6oHw==", | ||||
|       "requires": { | ||||
|         "@actions/io": "^1.0.1" | ||||
|       } | ||||
| @@ -40,11 +40,11 @@ | ||||
|       "integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg==" | ||||
|     }, | ||||
|     "@actions/tool-cache": { | ||||
|       "version": "1.5.2", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-1.5.2.tgz", | ||||
|       "integrity": "sha512-40A1St0GEo+QvHV1YRjStEoQcKKMaip+zNXPgGHcjYXCdZ7cl1LGlwOpsVVqwk+6ue/shFTS76KC1A02mVVCQA==", | ||||
|       "version": "1.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-1.5.4.tgz", | ||||
|       "integrity": "sha512-72ijIBM0s/dx2D0eYYxaxaeKWeVatOK8OHPNctJ5cyKjZp1j12egX+nW/N+tnQRNMVxTp9WjudZO5wizUBxC/w==", | ||||
|       "requires": { | ||||
|         "@actions/core": "^1.2.0", | ||||
|         "@actions/core": "^1.2.3", | ||||
|         "@actions/exec": "^1.0.0", | ||||
|         "@actions/http-client": "^1.0.8", | ||||
|         "@actions/io": "^1.0.1", | ||||
| @@ -52,6 +52,11 @@ | ||||
|         "uuid": "^3.3.2" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "@actions/core": { | ||||
|           "version": "1.2.4", | ||||
|           "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.4.tgz", | ||||
|           "integrity": "sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==" | ||||
|         }, | ||||
|         "@actions/http-client": { | ||||
|           "version": "1.0.8", | ||||
|           "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", | ||||
|   | ||||
| @@ -24,10 +24,11 @@ | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.2.2", | ||||
|     "@actions/exec": "^1.0.3", | ||||
|     "@actions/github": "^1.1.0", | ||||
|     "@actions/http-client": "^1.0.6", | ||||
|     "@actions/io": "^1.0.2", | ||||
|     "@actions/tool-cache": "^1.5.2", | ||||
|     "@actions/tool-cache": "^1.5.4", | ||||
|     "semver": "^6.1.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|   | ||||
							
								
								
									
										103
									
								
								src/installer.ts
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								src/installer.ts
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ import * as io from '@actions/io'; | ||||
| import * as tc from '@actions/tool-cache'; | ||||
| import * as path from 'path'; | ||||
| import * as semver from 'semver'; | ||||
| import {Url} from 'url'; | ||||
| import fs = require('fs'); | ||||
|  | ||||
| // | ||||
| // Node versions interface | ||||
| @@ -19,7 +19,6 @@ export interface INodeVersion { | ||||
|  | ||||
| interface INodeVersionInfo { | ||||
|   downloadUrl: string; | ||||
|   token: string | null; | ||||
|   resolvedVersion: string; | ||||
|   fileName: string; | ||||
| } | ||||
| @@ -27,13 +26,12 @@ interface INodeVersionInfo { | ||||
| export async function getNode( | ||||
|   versionSpec: string, | ||||
|   stable: boolean, | ||||
|   token: string | ||||
|   auth: string | undefined | ||||
| ) { | ||||
|   let osPlat: string = os.platform(); | ||||
|   let osArch: string = translateArchToDistUrl(os.arch()); | ||||
|  | ||||
|   // check cache | ||||
|   let info: INodeVersionInfo | null = null; | ||||
|   let toolPath: string; | ||||
|   toolPath = tc.find('node', versionSpec); | ||||
|  | ||||
| @@ -42,48 +40,91 @@ export async function getNode( | ||||
|     console.log(`Found in cache @ ${toolPath}`); | ||||
|   } else { | ||||
|     console.log(`Attempting to download ${versionSpec}...`); | ||||
|     let info = await getInfoFromManifest(versionSpec, stable, token); | ||||
|     if (!info) { | ||||
|       console.log( | ||||
|         'Not found in manifest.  Falling back to download directly from Node' | ||||
|       ); | ||||
|       info = await getInfoFromDist(versionSpec); | ||||
|     } | ||||
|  | ||||
|     if (!info) { | ||||
|       throw new Error( | ||||
|         `Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||
|  | ||||
|     let downloadPath = ''; | ||||
|     let info: INodeVersionInfo | null = null; | ||||
|  | ||||
|     // | ||||
|     // Try download from internal distribution (popular versions only) | ||||
|     // | ||||
|     try { | ||||
|       downloadPath = await tc.downloadTool(info.downloadUrl, undefined, token); | ||||
|       info = await getInfoFromManifest(versionSpec, stable, auth); | ||||
|       if (info) { | ||||
|         console.log( | ||||
|           `Acquiring ${info.resolvedVersion} from ${info.downloadUrl}` | ||||
|         ); | ||||
|         downloadPath = await tc.downloadTool(info.downloadUrl, undefined, auth); | ||||
|       } else { | ||||
|         console.log( | ||||
|           'Not found in manifest.  Falling back to download directly from Node' | ||||
|         ); | ||||
|       } | ||||
|     } catch (err) { | ||||
|       if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { | ||||
|         return await acquireNodeFromFallbackLocation(info.resolvedVersion); | ||||
|       // Rate limit? | ||||
|       if ( | ||||
|         err instanceof tc.HTTPError && | ||||
|         (err.httpStatusCode === 403 || err.httpStatusCode === 429) | ||||
|       ) { | ||||
|         console.log( | ||||
|           `Received HTTP status code ${err.httpStatusCode}.  This usually indicates the rate limit has been exceeded` | ||||
|         ); | ||||
|       } else { | ||||
|         console.log(err.message); | ||||
|       } | ||||
|       core.debug(err.stack); | ||||
|       console.log('Falling back to download directly from Node'); | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // Download from nodejs.org | ||||
|     // | ||||
|     if (!downloadPath) { | ||||
|       info = await getInfoFromDist(versionSpec); | ||||
|       if (!info) { | ||||
|         throw new Error( | ||||
|           `Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` | ||||
|         ); | ||||
|       } | ||||
|  | ||||
|       throw err; | ||||
|       console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); | ||||
|       try { | ||||
|         downloadPath = await tc.downloadTool(info.downloadUrl); | ||||
|       } catch (err) { | ||||
|         if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { | ||||
|           return await acquireNodeFromFallbackLocation(info.resolvedVersion); | ||||
|         } | ||||
|  | ||||
|         throw err; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // Extract | ||||
|     // | ||||
|     console.log('Extracting ...'); | ||||
|     let extPath: string; | ||||
|     info = info || ({} as INodeVersionInfo); // satisfy compiler, never null when reaches here | ||||
|     if (osPlat == 'win32') { | ||||
|       let _7zPath = path.join(__dirname, '..', 'externals', '7zr.exe'); | ||||
|       extPath = await tc.extract7z(downloadPath, undefined, _7zPath); | ||||
|       // 7z extracts to folder matching file name | ||||
|       let nestedPath = path.join(extPath, path.basename(info.fileName, '.7z')); | ||||
|       if (fs.existsSync(nestedPath)) { | ||||
|         extPath = nestedPath; | ||||
|       } | ||||
|     } else { | ||||
|       extPath = await tc.extractTar(downloadPath); | ||||
|       extPath = await tc.extractTar(downloadPath, undefined, [ | ||||
|         'xz', | ||||
|         '--strip', | ||||
|         '1' | ||||
|       ]); | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded | ||||
|     // | ||||
|     console.log('Adding to the cache ...'); | ||||
|     toolPath = await tc.cacheDir(extPath, 'node', info.resolvedVersion); | ||||
|     console.log('Done'); | ||||
|   } | ||||
|  | ||||
|   // | ||||
| @@ -103,13 +144,13 @@ export async function getNode( | ||||
| async function getInfoFromManifest( | ||||
|   versionSpec: string, | ||||
|   stable: boolean, | ||||
|   token: string | ||||
|   auth: string | undefined | ||||
| ): Promise<INodeVersionInfo | null> { | ||||
|   let info: INodeVersionInfo | null = null; | ||||
|   const releases = await tc.getManifestFromRepo( | ||||
|     'actions', | ||||
|     'node-versions', | ||||
|     token | ||||
|     auth | ||||
|   ); | ||||
|   console.log(`matching ${versionSpec}...`); | ||||
|   const rel = await tc.findFromManifest(versionSpec, stable, releases); | ||||
| @@ -119,7 +160,6 @@ async function getInfoFromManifest( | ||||
|     info.resolvedVersion = rel.version; | ||||
|     info.downloadUrl = rel.files[0].download_url; | ||||
|     info.fileName = rel.files[0].filename; | ||||
|     info.token = token; | ||||
|   } | ||||
|  | ||||
|   return info; | ||||
| @@ -131,7 +171,6 @@ async function getInfoFromDist( | ||||
|   let osPlat: string = os.platform(); | ||||
|   let osArch: string = translateArchToDistUrl(os.arch()); | ||||
|  | ||||
|   let info: INodeVersionInfo | null = null; | ||||
|   let version: string; | ||||
|  | ||||
|   version = await queryDistForMatch(versionSpec); | ||||
| @@ -262,6 +301,8 @@ async function acquireNodeFromFallbackLocation( | ||||
|     exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; | ||||
|     libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; | ||||
|  | ||||
|     console.log(`Downloading only node binary from ${exeUrl}`); | ||||
|  | ||||
|     const exePath = await tc.downloadTool(exeUrl); | ||||
|     await io.cp(exePath, path.join(tempDir, 'node.exe')); | ||||
|     const libPath = await tc.downloadTool(libUrl); | ||||
| @@ -279,7 +320,9 @@ async function acquireNodeFromFallbackLocation( | ||||
|       throw err; | ||||
|     } | ||||
|   } | ||||
|   return await tc.cacheDir(tempDir, 'node', version); | ||||
|   let toolPath = await tc.cacheDir(tempDir, 'node', version); | ||||
|   core.addPath(toolPath); | ||||
|   return toolPath; | ||||
| } | ||||
|  | ||||
| // os.arch does not always match the relative download url, e.g. | ||||
|   | ||||
							
								
								
									
										11
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -2,6 +2,7 @@ import * as core from '@actions/core'; | ||||
| import * as installer from './installer'; | ||||
| import * as auth from './authutil'; | ||||
| import * as path from 'path'; | ||||
| import {URL} from 'url'; | ||||
|  | ||||
| export async function run() { | ||||
|   try { | ||||
| @@ -17,8 +18,9 @@ export async function run() { | ||||
|     console.log(`version: ${version}`); | ||||
|     if (version) { | ||||
|       let token = core.getInput('token'); | ||||
|       let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||
|       let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; | ||||
|       await installer.getNode(version, stable, token); | ||||
|       await installer.getNode(version, stable, auth); | ||||
|     } | ||||
|  | ||||
|     const registryUrl: string = core.getInput('registry-url'); | ||||
| @@ -39,3 +41,10 @@ export async function run() { | ||||
|     core.setFailed(error.message); | ||||
|   } | ||||
| } | ||||
|  | ||||
| function isGhes(): boolean { | ||||
|   const ghUrl = new URL( | ||||
|     process.env['GITHUB_SERVER_URL'] || 'https://github.com' | ||||
|   ); | ||||
|   return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; | ||||
| } | ||||
|   | ||||
| @@ -13,7 +13,7 @@ rm -rf ./node | ||||
| export RUNNER_TOOL_CACHE=$(pwd) | ||||
| export RUNNER_TEMP="${RUNNER_TOOL_CACHE}/temp" | ||||
| export INPUT_STABLE=true | ||||
| export INPUT_VERSION="12.x" | ||||
| export INPUT_VERSION="12"   #"0.12.7"  #"12" #"11.15.0" | ||||
| # export your PAT with repo scope before running | ||||
| export INPUT_TOKEN=$GITHUB_TOKEN | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user