Compare commits

..

2 Commits

Author SHA1 Message Date
MaksimZhukov
e40f16e1e0 fix typo 2020-08-12 11:11:14 +03:00
MaksimZhukov
5c820ab88b Add logs 2020-08-12 11:08:17 +03:00
10 changed files with 192 additions and 482 deletions

View File

@@ -1,165 +0,0 @@
name: Generate Node.js package
on:
workflow_dispatch:
inputs:
VERSION:
description: 'Node.js version to build and upload'
required: true
default: '14.2.0'
PUBLISH_RELEASES:
description: 'Whether to publish releases'
required: true
default: 'false'
env:
VERSION: ${{ github.event.inputs.VERSION }}
defaults:
run:
shell: pwsh
jobs:
build_node:
name: Build Node.js ${{ github.event.inputs.VERSION }} [${{ matrix.platform }}]
runs-on: ubuntu-latest
env:
ARTIFACT_NAME: node-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-x64
strategy:
fail-fast: false
matrix:
platform: [linux, darwin, win32]
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Build Node.js ${{ env.VERSION }}
run: |
./builders/build-node.ps1 -Version $env:VERSION `
-Platform ${{ matrix.platform }}
- name: Publish artifact
uses: actions/upload-artifact@v2
with:
name: ${{ env.ARTIFACT_NAME }}
path: ${{ runner.temp }}/artifact
test_node:
name: Test Node.js ${{ github.event.inputs.VERSION }} [${{ matrix.platform }}]
needs: build_node
runs-on: ${{ matrix.os }}
env:
ARTIFACT_NAME: node-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-x64
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
platform: linux
- os: macos-latest
platform: darwin
- os: windows-latest
platform: win32
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Fully cleanup the toolcache directory before testing
run: ./helpers/clean-toolcache.ps1 -ToolName "node"
- name: Download artifact
uses: actions/download-artifact@v2
with:
path: ${{ runner.temp }}
- name: Extract files
run: |
if ('${{ matrix.platform }}' -eq 'win32') {
$artifactName = "${{ env.ARTIFACT_NAME }}.7z"
7z.exe x "$artifactName" -y | Out-Null
} else {
$artifactName = "${{ env.ARTIFACT_NAME }}.tar.gz"
tar -xzf $artifactName
}
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
- name: Apply build artifact to the local machine
run: |
if ('${{ matrix.platform }}' -eq 'win32') { powershell ./setup.ps1 } else { sh ./setup.sh }
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
- name: Setup Node.js ${{ env.VERSION }}
uses: actions/setup-node@v2.1.1
with:
node-version: ${{ env.VERSION }}
- name: Wait for the logs
run: |
Write-Host "Fake step that do nothing"
Write-Host "We need it because log of previous step 'Setup Node' is not available here yet."
Write-Host "In testing step (Node.Tests.ps1) we analyze build log of 'Setup Node' task"
Write-Host "to determine if Node.js version was consumed from cache and was downloaded"
for ($i = 0; $i -lt 200; $i++) { Get-Random }
- name: Run tests
run: |
Install-Module Pester -Force -Scope CurrentUser
Import-Module Pester
Invoke-Pester -Script ./Node.Tests.ps1 -EnableExit
working-directory: ./tests
publish_release:
name: Publish release
if: github.event.inputs.PUBLISH_RELEASES == 'true'
needs: test_node
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v2
- name: Publish Release ${{ env.VERSION }}
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.VERSION }}-${{ github.run_id }}
release_name: ${{ env.VERSION }}
body: |
Node.js ${{ env.VERSION }}
- name: Upload release assets
uses: actions/github-script@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs');
for (let artifactDir of fs.readdirSync('.')) {
let artifactName = fs.readdirSync(`${artifactDir}`)[0];
console.log(`Upload ${artifactName} asset`);
github.repos.uploadReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: ${{ steps.create_release.outputs.id }},
name: artifactName,
data: fs.readFileSync(`./${artifactDir}/${artifactName}`)
});
}
trigger_pr:
name: Trigger "Create Pull Request" workflow
needs: publish_release
runs-on: ubuntu-latest
steps:
- name: Trigger "Create Pull Request" workflow
uses: actions/github-script@v3
with:
github-token: ${{ secrets.PERSONAL_TOKEN }}
script: |
github.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'create-pr.yml',
ref: 'main'
});

View File

@@ -1,33 +0,0 @@
name: Create Pull Request
on:
workflow_dispatch:
defaults:
run:
shell: pwsh
jobs:
create_pr:
name: Create Pull Request
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Create versions-manifest.json
run: |
./helpers/packages-generation/manifest-generator.ps1 -RepositoryFullName "$env:GITHUB_REPOSITORY" `
-GitHubAccessToken "${{secrets.GITHUB_TOKEN}}" `
-OutputFile "./versions-manifest.json" `
-ConfigurationFile "./config/node-manifest-config.json"
- name: Create GitHub PR
run: |
$formattedDate = Get-Date -Format "MM/dd/yyyy"
./helpers/github/create-pull-request.ps1 `
-RepositoryFullName "$env:GITHUB_REPOSITORY" `
-AccessToken "${{secrets.GITHUB_TOKEN}}" `
-BranchName "update-versions-manifest-file" `
-CommitMessage "Update versions-manifest" `
-PullRequestTitle "[versions-manifest] Update for release from ${formattedDate}" `
-PullRequestBody "Update versions-manifest.json for release from ${formattedDate}"

View File

@@ -29,20 +29,22 @@ Here are a few things you can do that will increase the likelihood of your pull
### Directory structure
```
├── .github/
| └──workflows/
├── azure-pipelines/
| └──templates/
├── builders/
├── helpers/
├── installers/
└── tests/
└──sources/
```
- `.github/workflows` - contains repository workflow files.
- `azure-pipelines*` - contains global YAML definitions for build pipelines. Reusable templates for specific jobs are located in `templates` subfolder.
- `builders` - contains Node.js builder classes and functions.
- `helpers` - contains global helper classes and functions.
- `helpers` - contains global helper functions and functions.
- `installers` - contains installation script templates.
- `tests` - contains test scripts. Required tests sources are located in `sources` subfolder.
\* _We use Azure Pipelines because there are a few features that Actions is still missing, we'll move to Actions as soon as possible_.
## Resources
- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)

View File

@@ -0,0 +1,65 @@
name: $(date:yyyyMMdd)$(rev:.r)-Node.js-$(VERSION)
trigger: none
pr:
autoCancel: true
branches:
include:
- main
paths:
exclude:
- versions-manifest.json
stages:
- stage: Build_Node_Darwin
dependsOn: []
variables:
Platform: darwin
Architecture: x64
jobs:
- template: /azure-pipelines/templates/build-job.yml
- stage: Test_Node_Darwin
condition: succeeded()
dependsOn: Build_Node_Darwin
variables:
VmImage: macOS-latest
Platform: darwin
Architecture: x64
jobs:
- template: /azure-pipelines/templates/test-job.yml
- stage: Build_Node_Linux
dependsOn: []
variables:
Platform: linux
Architecture: x64
jobs:
- template: /azure-pipelines/templates/build-job.yml
- stage: Test_Node_Linux
condition: succeeded()
dependsOn: Build_Node_Linux
variables:
VmImage: ubuntu-latest
Platform: linux
Architecture: x64
jobs:
- template: /azure-pipelines/templates/test-job.yml
- stage: Build_Node_Windows
dependsOn: []
variables:
Platform: win32
Architecture: x64
jobs:
- template: /azure-pipelines/templates/build-job.yml
- stage: Test_Node_Windows
condition: succeeded()
dependsOn: Build_Node_Windows
variables:
VmImage: windows-latest
Platform: win32
Architecture: x64
jobs:
- template: /azure-pipelines/templates/test-job.yml

View File

@@ -0,0 +1,21 @@
jobs:
- job: Build_Node
timeoutInMinutes: 90
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
steps:
- checkout: self
- task: PowerShell@2
displayName: 'Build Node $(Version)'
inputs:
targetType: filePath
filePath: './builders/build-node.ps1'
arguments: '-Version $(Version) -Platform $(Platform) -Architecture $(Architecture)'
- task: PublishPipelineArtifact@1
displayName: 'Publish Artifact: Node.js $(Version)'
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: 'node-$(Version)-$(Platform)-$(Architecture)'

View File

@@ -0,0 +1,78 @@
jobs:
- job: Test_Node
pool:
name: Azure Pipelines
vmImage: $(VmImage)
steps:
- checkout: self
submodules: true
- task: PowerShell@2
displayName: Fully cleanup the toolcache directory before testing
inputs:
targetType: filePath
filePath: helpers/clean-toolcache.ps1
arguments: -ToolName "node"
- task: DownloadPipelineArtifact@2
inputs:
source: 'current'
artifact: 'node-$(Version)-$(Platform)-$(Architecture)'
path: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/node-$(Version)-$(Platform)-$(Architecture).*'
destinationFolder: $(Build.BinariesDirectory)
cleanDestinationFolder: false
- task: PowerShell@2
displayName: 'Apply build artifact to the local machines'
inputs:
targetType: inline
script: |
if ("$(Platform)" -match 'win32') { powershell ./setup.ps1 } else { sh ./setup.sh }
workingDirectory: '$(Build.BinariesDirectory)'
- task: NodeTool@0
displayName: 'Use Node $(Version)'
inputs:
versionSpec: $(Version)
- task: PowerShell@2
displayName: 'Wait for the logs'
inputs:
targetType: inline
script: |
Write-Host "Fake step that do nothing"
Write-Host "We need it because log of previous step 'Use Node' is not available here yet."
Write-Host "In testing step (Node.Tests.ps1) we analyze build log of 'Use Node' task"
Write-Host "to determine if Node.js version was consumed from cache and was downloaded"
foreach ($process in Get-Process) {
Write-Host "Active process name: $($process.ProcessName)"
}
- task: PowerShell@2
displayName: 'Run tests'
inputs:
TargetType: inline
script: |
Install-Module Pester -Force -Scope CurrentUser -RequiredVersion 4.10.1
Import-Module Pester
$pesterParams = @{
Path="./Node.Tests.ps1";
Parameters=@{
Version="$(Version)";
}
}
Invoke-Pester -Script $pesterParams -OutputFile "test_results.xml" -OutputFormat NUnitXml
workingDirectory: '$(Build.SourcesDirectory)/tests'
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
testResultsFiles: '*.xml'
testResultsFormat: NUnit
searchFolder: 'tests'
failTaskOnFailedTests: true
testRunTitle: "Node.js $(Version)-$(Platform)"
condition: always()

View File

@@ -16,13 +16,10 @@ class NodeBuilder {
The architecture with which Node.js should be built.
.PARAMETER TempFolderLocation
The location of temporary files that will be used during Node.js package generation.
The location of temporary files that will be used during Node.js package generation. Using system BUILD_STAGINGDIRECTORY variable value.
.PARAMETER WorkFolderLocation
The location of installation files.
.PARAMETER ArtifactFolderLocation
The location of generated Node.js artifact.
.PARAMETER ArtifactLocation
The location of generated Node.js artifact. Using system environment BUILD_BINARIESDIRECTORY variable value.
.PARAMETER InstallationTemplatesLocation
The location of installation script template. Using "installers" folder from current repository.
@@ -43,8 +40,9 @@ class NodeBuilder {
$this.Architecture = $architecture
$this.TempFolderLocation = [IO.Path]::GetTempPath()
$this.WorkFolderLocation = Join-Path $env:RUNNER_TEMP "binaries"
$this.ArtifactFolderLocation = Join-Path $env:RUNNER_TEMP "artifact"
$this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY
$this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY
$this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers"
}
@@ -86,10 +84,6 @@ class NodeBuilder {
Generates Node.js artifact from downloaded binaries.
#>
Write-Host "Create WorkFolderLocation and ArtifactFolderLocation folders"
New-Item -Path $this.WorkFolderLocation -ItemType "directory"
New-Item -Path $this.ArtifactFolderLocation -ItemType "directory"
Write-Host "Download Node.js $($this.Version) [$($this.Architecture)] executable..."
$binariesArchivePath = $this.Download()

Submodule helpers updated: 3b38e3de4c...68072bedef

View File

@@ -1,17 +1,18 @@
param (
[Version] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()]
$Version
)
Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1")
BeforeAll {
function Get-UseNodeLogs {
# GitHub Windows images don't have `HOME` variable
$homeDir = $env:HOME ?? $env:HOMEDRIVE
$logsFolderPath = Join-Path -Path $homeDir -ChildPath "runners/*/_diag/pages" -Resolve
function Get-UseNodeLogs {
$logsFolderPath = Join-Path -Path $env:AGENT_HOMEDIRECTORY -ChildPath "_diag" | Join-Path -ChildPath "pages"
$useNodeLogFile = Get-ChildItem -Path $logsFolderPath | Where-Object {
$logContent = Get-Content $_.Fullname -Raw
return $logContent -match "setup-node@v"
} | Select-Object -First 1
return $useNodeLogFile.Fullname
}
$useNodeLogFile = Get-ChildItem -Path $logsFolderPath | Where-Object {
$logContent = Get-Content $_.Fullname -Raw
return $logContent -match "Use Node"
} | Select-Object -First 1
return $useNodeLogFile.Fullname
}
Describe "Node.js" {
@@ -21,16 +22,13 @@ Describe "Node.js" {
It "version is correct" {
$versionOutput = Invoke-Expression "node --version"
$versionOutput | Should -Match $env:VERSION
$versionOutput | Should -Match $Version
}
It "is used from tool-cache" {
$nodePath = (Get-Command "node").Path
$nodePath | Should -Not -BeNullOrEmpty
# GitHub Windows images don't have `AGENT_TOOLSDIRECTORY` variable
$toolcacheDir = $env:AGENT_TOOLSDIRECTORY ?? $env:RUNNER_TOOL_CACHE
$expectedPath = Join-Path -Path $toolcacheDir -ChildPath "node"
$expectedPath = Join-Path -Path $env:AGENT_TOOLSDIRECTORY -ChildPath "node"
$nodePath.startsWith($expectedPath) | Should -BeTrue -Because "'$nodePath' is not started with '$expectedPath'"
}
@@ -39,7 +37,7 @@ Describe "Node.js" {
$useNodeLogFile = Get-UseNodeLogs
$useNodeLogFile | Should -Exist
$useNodeLogContent = Get-Content $useNodeLogFile -Raw
$useNodeLogContent | Should -Match "Found in cache"
$useNodeLogContent | Should -Match "Found tool in cache"
}
It "Run simple code" {

View File

@@ -1,179 +1,4 @@
[
{
"version": "14.13.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.13.0-279958998",
"files": [
{
"filename": "node-14.13.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.13.0-279958998/node-14.13.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.13.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.13.0-279958998/node-14.13.0-linux-x64.tar.gz"
},
{
"filename": "node-14.13.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.13.0-279958998/node-14.13.0-win32-x64.7z"
}
]
},
{
"version": "14.12.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.12.0-268499334",
"files": [
{
"filename": "node-14.12.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.12.0-268499334/node-14.12.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.12.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.12.0-268499334/node-14.12.0-linux-x64.tar.gz"
},
{
"filename": "node-14.12.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.12.0-268499334/node-14.12.0-win32-x64.7z"
}
]
},
{
"version": "14.11.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.11.0-257117476",
"files": [
{
"filename": "node-14.11.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.11.0-257117476/node-14.11.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.11.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.11.0-257117476/node-14.11.0-linux-x64.tar.gz"
},
{
"filename": "node-14.11.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.11.0-257117476/node-14.11.0-win32-x64.7z"
}
]
},
{
"version": "14.10.1",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.10.1-248429513",
"files": [
{
"filename": "node-14.10.1-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.1-248429513/node-14.10.1-darwin-x64.tar.gz"
},
{
"filename": "node-14.10.1-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.1-248429513/node-14.10.1-linux-x64.tar.gz"
},
{
"filename": "node-14.10.1-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.1-248429513/node-14.10.1-win32-x64.7z"
}
]
},
{
"version": "14.10.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.10.0-245899283",
"files": [
{
"filename": "node-14.10.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.0-245899283/node-14.10.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.10.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.0-245899283/node-14.10.0-linux-x64.tar.gz"
},
{
"filename": "node-14.10.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.10.0-245899283/node-14.10.0-win32-x64.7z"
}
]
},
{
"version": "14.9.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.9.0-227321496",
"files": [
{
"filename": "node-14.9.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.9.0-227321496/node-14.9.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.9.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.9.0-227321496/node-14.9.0-linux-x64.tar.gz"
},
{
"filename": "node-14.9.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.9.0-227321496/node-14.9.0-win32-x64.7z"
}
]
},
{
"version": "14.8.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/14.8.0-20200812.4",
"files": [
{
"filename": "node-14.8.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.8.0-20200812.4/node-14.8.0-darwin-x64.tar.gz"
},
{
"filename": "node-14.8.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.8.0-20200812.4/node-14.8.0-linux-x64.tar.gz"
},
{
"filename": "node-14.8.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.8.0-20200812.4/node-14.8.0-win32-x64.7z"
}
]
},
{
"version": "14.7.0",
"stable": true,
@@ -424,56 +249,6 @@
}
]
},
{
"version": "12.19.0",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/12.19.0-292997882",
"files": [
{
"filename": "node-12.19.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/12.19.0-292997882/node-12.19.0-darwin-x64.tar.gz"
},
{
"filename": "node-12.19.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/12.19.0-292997882/node-12.19.0-linux-x64.tar.gz"
},
{
"filename": "node-12.19.0-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/12.19.0-292997882/node-12.19.0-win32-x64.7z"
}
]
},
{
"version": "12.18.4",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/12.18.4-257117621",
"files": [
{
"filename": "node-12.18.4-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/12.18.4-257117621/node-12.18.4-darwin-x64.tar.gz"
},
{
"filename": "node-12.18.4-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/12.18.4-257117621/node-12.18.4-linux-x64.tar.gz"
},
{
"filename": "node-12.18.4-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/12.18.4-257117621/node-12.18.4-win32-x64.7z"
}
]
},
{
"version": "12.18.3",
"stable": true,
@@ -1249,31 +1024,6 @@
}
]
},
{
"version": "10.22.1",
"stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/10.22.1-257117732",
"files": [
{
"filename": "node-10.22.1-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/10.22.1-257117732/node-10.22.1-darwin-x64.tar.gz"
},
{
"filename": "node-10.22.1-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/10.22.1-257117732/node-10.22.1-linux-x64.tar.gz"
},
{
"filename": "node-10.22.1-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/10.22.1-257117732/node-10.22.1-win32-x64.7z"
}
]
},
{
"version": "10.22.0",
"stable": true,