Compare commits

..

No commits in common. "main" and "10.22.0-20200722.2" have entirely different histories.

20 changed files with 210 additions and 6375 deletions

1
.github/CODEOWNERS vendored
View File

@ -1 +0,0 @@
* @actions/setup-actions-team

View File

@ -1,31 +0,0 @@
name: Generate Node.js packages
run-name: Generate Node.js ${{ inputs.VERSION || '18.12.0' }}
on:
workflow_dispatch:
inputs:
VERSION:
description: 'Node.js version to build and upload'
required: true
default: '18.12.0'
PUBLISH_RELEASES:
description: 'Whether to publish releases'
required: true
type: boolean
default: false
pull_request:
paths-ignore:
- 'versions-manifest.json'
- 'LICENSE'
- '**.md'
branches:
- 'main'
jobs:
node:
name: Node
uses: actions/versions-package-tools/.github/workflows/build-tool-packages.yml@main
with:
tool-name: "node"
tool-version: ${{ inputs.VERSION || '18.12.0' }}
publish-release: ${{ inputs.PUBLISH_RELEASES || false }}
secrets: inherit

View File

@ -1,14 +0,0 @@
name: CodeQL analysis
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 3 * * 0'
jobs:
call-codeQL-analysis:
name: CodeQL analysis
uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main

View File

@ -1,10 +0,0 @@
name: Create Pull Request
on:
workflow_dispatch:
jobs:
create-pr:
uses: actions/versions-package-tools/.github/workflows/create-pr-to-update-manifest.yml@main
with:
tool-name: "node"
secrets: inherit

View File

@ -1,13 +0,0 @@
name: Get Node versions
on:
schedule:
- cron: '0 3,15 * * *'
workflow_dispatch:
jobs:
get-new-node-versions:
uses: actions/versions-package-tools/.github/workflows/get-new-tool-versions.yml@main
with:
tool-name: "Node"
image-url: "https://nodejs.org/static/images/logo-hexagon-card.png"
secrets: inherit

View File

@ -1,21 +0,0 @@
name: Validate manifest
on:
# The GITHUB_TOKEN secret is used to create a PR
# The pull_request event will not be triggered by it
# That's one of the reasons we need the schedule to validate the versions-manifest.json file
schedule:
- cron: '0 8,20 * * *'
workflow_dispatch:
pull_request:
branches:
- main
paths:
- 'versions-manifest.json'
jobs:
manifest:
uses: actions/versions-package-tools/.github/workflows/validate-manifest.yml@main
with:
tool-name: "Node"
image-url: "https://nodejs.org/static/images/logo-hexagon-card.png"
secrets: inherit

View File

@ -29,20 +29,22 @@ Here are a few things you can do that will increase the likelihood of your pull
### Directory structure ### Directory structure
``` ```
├── .github/ ├── azure-pipelines/
| └──workflows/ | └──templates/
├── builders/ ├── builders/
├── helpers/ ├── helpers/
├── installers/ ├── installers/
└── tests/ └── tests/
└──sources/ └──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. - `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. - `installers` - contains installation script templates.
- `tests` - contains test scripts. Required tests sources are located in `sources` subfolder. - `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 ## Resources
- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)

View File

@ -1,18 +1,15 @@
# Node.js for Actions # Node.js for Actions
This repository contains the code and scripts that we use to prepare Node.js packages used in [runner-images](https://github.com/actions/runner-images) and accessible through the [setup-node](https://github.com/actions/setup-node) Action. This repository contains the code and scripts that we use to prepare Node.js packages used in [virtual-environments](https://github.com/actions/virtual-environments) and accessible through the [setup-node](https://github.com/actions/setup-node) Action.
The file [versions-manifest.json](./versions-manifest.json) contains the list of available and released versions. The file [versions-manifest.json](./versions-manifest.json) contains the list of available and released versions.
> Caution: this is prepared for and only permitted for use by actions `runner-images` and `setup-node` action. > Caution: this is prepared for and only permitted for use by actions `virtual-environments` and `setup-node` action.
**Status**: Currently under development and in use for beta and preview actions. This repo is undergoing rapid changes. **Status**: Currently under development and in use for beta and preview actions. This repo is undergoing rapid changes.
Latest of LTS versions will be installed on the [runner-images](https://github.com/actions/runner-images) images. Other versions will be pulled JIT using the [`setup-node`](https://github.com/actions/setup-node) action. Latest of LTS versions will be installed on the [virtual-environments](https://github.com/actions/virtual-environments) images. Other versions will be pulled JIT using the [`setup-node`](https://github.com/actions/setup-node) action.
## Adding new versions ## Adding new versions
We are trying to prepare packages for new versions of Node.js as soon as they are released. Please open an issue in [actions/runner-images](https://github.com/actions/runner-images) if any versions are missing. We are trying to prepare packages for new versions of Node.js as soon as they are released. Please open an issue in [actions/virtual-environments](https://github.com/actions/virtual-environments) if any versions are missing.
## Support Notification Policy
Beginning **approximately six months prior** to the removal of a Node.js version from the [versions-manifest.json](https://github.com/actions/node-versions/blob/main/versions-manifest.json) file, a pinned issue will be created in the [setup-node](https://github.com/actions/setup-node) repository. This pinned issue will provide important details about the upcoming end of support, including the specific date, as well as any other notes, relevant updates or alternatives. We encourage users to regularly check pinned issues for updates on tool versions they are using for maximum transparency, security, performance and overall compatibility with their projects.
## Contribution ## Contribution
Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure

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,75 @@
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"
- 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

@ -1,5 +1,5 @@
using module "./win-node-builder.psm1" using module "./builders/win-node-builder.psm1"
using module "./nix-node-builder.psm1" using module "./builders/nix-node-builder.psm1"
<# <#
.SYNOPSIS .SYNOPSIS

View File

@ -1,4 +1,4 @@
using module "./node-builder.psm1" using module "./builders/node-builder.psm1"
class NixNodeBuilder : NodeBuilder { class NixNodeBuilder : NodeBuilder {
<# <#
@ -54,7 +54,7 @@ class NixNodeBuilder : NodeBuilder {
$installationTemplateLocation = Join-Path -Path $this.InstallationTemplatesLocation -ChildPath $this.InstallationTemplateName $installationTemplateLocation = Join-Path -Path $this.InstallationTemplatesLocation -ChildPath $this.InstallationTemplateName
$installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw $installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw
$installationTemplateContent = $installationTemplateContent -f $this.Version.ToString(3), $this.Architecture $installationTemplateContent = $installationTemplateContent -f $this.Version.ToString(3)
$installationTemplateContent | Out-File -FilePath $installationScriptLocation $installationTemplateContent | Out-File -FilePath $installationScriptLocation
Write-Debug "Done; Installation script location: $installationScriptLocation)" Write-Debug "Done; Installation script location: $installationScriptLocation)"

View File

@ -16,13 +16,10 @@ class NodeBuilder {
The architecture with which Node.js should be built. The architecture with which Node.js should be built.
.PARAMETER TempFolderLocation .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 .PARAMETER ArtifactLocation
The location of installation files. The location of generated Node.js artifact. Using system environment BUILD_BINARIESDIRECTORY variable value.
.PARAMETER ArtifactFolderLocation
The location of generated Node.js artifact.
.PARAMETER InstallationTemplatesLocation .PARAMETER InstallationTemplatesLocation
The location of installation script template. Using "installers" folder from current repository. The location of installation script template. Using "installers" folder from current repository.
@ -43,8 +40,9 @@ class NodeBuilder {
$this.Architecture = $architecture $this.Architecture = $architecture
$this.TempFolderLocation = [IO.Path]::GetTempPath() $this.TempFolderLocation = [IO.Path]::GetTempPath()
$this.WorkFolderLocation = Join-Path $env:RUNNER_TEMP "binaries" $this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY
$this.ArtifactFolderLocation = Join-Path $env:RUNNER_TEMP "artifact" $this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY
$this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers"
} }
@ -86,10 +84,6 @@ class NodeBuilder {
Generates Node.js artifact from downloaded binaries. 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..." Write-Host "Download Node.js $($this.Version) [$($this.Architecture)] executable..."
$binariesArchivePath = $this.Download() $binariesArchivePath = $this.Download()

View File

@ -1,4 +1,4 @@
using module "./node-builder.psm1" using module "./builders/node-builder.psm1"
class WinNodeBuilder : NodeBuilder { class WinNodeBuilder : NodeBuilder {
<# <#

View File

@ -1,8 +1,7 @@
{ {
"regex": "node-\\d+\\.\\d+\\.\\d+-(\\w+)-((x|arm)\\d+)", "regex": "node-\\d+\\.\\d+\\.\\d+-(\\w+)-(x\\d+)",
"groups": { "groups": {
"arch": 2, "arch": 2,
"platform": 1 "platform": 1
}, }
"lts_rule_expression": "(Invoke-RestMethod 'https://raw.githubusercontent.com/nodejs/Release/main/schedule.json').PSObject.Properties | Where-Object { $_.Value.codename } | ForEach-Object { @{ Name = $_.Name.TrimStart('v'); Value = $_.Value.codename } }"
} }

@ -1 +1 @@
Subproject commit 6fbb1f0f2098254142702dba05fe75cd8e77c4ae Subproject commit 1069e7a4ece355bd321909454fc1f9f7244eb03b

View File

@ -1,11 +1,10 @@
set -e set -e
NODE_VERSION={0} NODE_VERSION={0}
ARCH={1}
NODE_TOOLCACHE_PATH=$AGENT_TOOLSDIRECTORY/node NODE_TOOLCACHE_PATH=$AGENT_TOOLSDIRECTORY/node
NODE_TOOLCACHE_VERSION_PATH=$NODE_TOOLCACHE_PATH/$NODE_VERSION NODE_TOOLCACHE_VERSION_PATH=$NODE_TOOLCACHE_PATH/$NODE_VERSION
NODE_TOOLCACHE_VERSION_ARCH_PATH=$NODE_TOOLCACHE_VERSION_PATH/$ARCH NODE_TOOLCACHE_VERSION_ARCH_PATH=$NODE_TOOLCACHE_VERSION_PATH/x64
echo "Check if Node.js hostedtoolcache folder exist..." echo "Check if Node.js hostedtoolcache folder exist..."
if [ ! -d $NODE_TOOLCACHE_PATH ]; then if [ ! -d $NODE_TOOLCACHE_PATH ]; then
@ -23,4 +22,4 @@ cp -R ./* $NODE_TOOLCACHE_VERSION_ARCH_PATH
rm $NODE_TOOLCACHE_VERSION_ARCH_PATH/setup.sh rm $NODE_TOOLCACHE_VERSION_ARCH_PATH/setup.sh
echo "Create complete file" echo "Create complete file"
touch $NODE_TOOLCACHE_VERSION_PATH/$ARCH.complete touch $NODE_TOOLCACHE_VERSION_PATH/x64.complete

View File

@ -1,61 +1,46 @@
param (
[Version] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()]
$Version
)
Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1") Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1")
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 "Use Node"
} | Select-Object -First 1
return $useNodeLogFile.Fullname
}
Describe "Node.js" { Describe "Node.js" {
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
$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
}
}
It "is available" { It "is available" {
"node --version" | Should -ReturnZeroExitCode "node --version" | Should -ReturnZeroExitCode
} }
It "version is correct" { It "version is correct" {
$versionOutput = Invoke-Expression "node --version" $versionOutput = Invoke-Expression "node --version"
$versionOutput | Should -Match $env:VERSION $versionOutput | Should -Match $Version
} }
It "is used from tool-cache" { It "is used from tool-cache" {
$nodePath = (Get-Command "node").Path $nodePath = (Get-Command "node").Path
$nodePath | Should -Not -BeNullOrEmpty $nodePath | Should -Not -BeNullOrEmpty
$expectedPath = Join-Path -Path $env:AGENT_TOOLSDIRECTORY -ChildPath "node"
# GitHub Windows images don't have `AGENT_TOOLSDIRECTORY` variable
$toolcacheDir = $env:AGENT_TOOLSDIRECTORY ?? $env:RUNNER_TOOL_CACHE
$expectedPath = Join-Path -Path $toolcacheDir -ChildPath "node"
$nodePath.startsWith($expectedPath) | Should -BeTrue -Because "'$nodePath' is not started with '$expectedPath'" $nodePath.startsWith($expectedPath) | Should -BeTrue -Because "'$nodePath' is not started with '$expectedPath'"
} }
It "cached version is used without downloading" { It "cached version is used without downloading" {
# Analyze output of previous steps to check if Node.js was consumed from cache or downloaded
if ($env:RUNNER_TYPE -eq "self-hosted") { $useNodeLogFile = Get-UseNodeLogs
# Get the installed version of Node.js $useNodeLogFile | Should -Exist
$nodeVersion = Invoke-Expression "node --version" $useNodeLogContent = Get-Content $useNodeLogFile -Raw
# Check if Node.js is installed $useNodeLogContent | Should -Match "Found tool in cache"
$nodeVersion | Should -Not -BeNullOrEmpty
# Check if the installed version of Node.js is the expected version
$nodeVersion | Should -Match $env:VERSION
}else {
# Analyze output of previous steps to check if Node.js was consumed from cache or downloaded
$useNodeLogFile = Get-UseNodeLogs
$useNodeLogFile | Should -Exist
$useNodeLogContent = Get-Content $useNodeLogFile -Raw
$useNodeLogContent | Should -Match "Found in cache"
}
} }
It "Run simple code" { It "Run simple code" {
"node ./simple-test.js" | Should -ReturnZeroExitCode "node ./simple-test.js" | Should -ReturnZeroExitCode
} }
} }

File diff suppressed because it is too large Load Diff