diff --git a/azure-pipelines/templates/test-job.yml b/azure-pipelines/templates/test-job.yml index 02d2cee..4c88389 100644 --- a/azure-pipelines/templates/test-job.yml +++ b/azure-pipelines/templates/test-job.yml @@ -1,5 +1,5 @@ jobs: -- job: +- job: Test_Node pool: name: Azure Pipelines vmImage: $(VmImage) @@ -21,11 +21,11 @@ jobs: inputs: source: 'current' artifact: 'node-$(Version)-$(Platform)-$(Architecture)' - path: $(Build.BinariesDirectory) + path: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.BinariesDirectory)/node-$(Version)-$(Platform)-$(Architecture).zip' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/node-$(Version)-$(Platform)-$(Architecture).zip' destinationFolder: $(Build.BinariesDirectory) cleanDestinationFolder: false diff --git a/builders/build-node.ps1 b/builders/build-node.ps1 index 88d0f43..7213bd7 100644 --- a/builders/build-node.ps1 +++ b/builders/build-node.ps1 @@ -23,9 +23,11 @@ param( [Parameter (Mandatory=$true)][Version] $Version, [Parameter (Mandatory=$true)][string] $Platform, [string] $Architecture = "x64" - ) +Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "nix-helpers.psm1") -DisableNameChecking +Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "win-helpers.psm1") -DisableNameChecking + function Get-NodeBuilder { <# .SYNOPSIS diff --git a/builders/nix-node-builder.psm1 b/builders/nix-node-builder.psm1 index f6da58b..c56cd80 100644 --- a/builders/nix-node-builder.psm1 +++ b/builders/nix-node-builder.psm1 @@ -40,6 +40,10 @@ class NixNodeBuilder : NodeBuilder { return "${base}/v$($this.Version)/node-v$($this.Version)-$($this.Platform)-$($this.Architecture).tar.gz" } + [void] ExtractBinaries($archivePath) { + Extract-TarArchive -ArchivePath $archivePath -OutputDirectory $this.ArtifactLocation + } + [void] CreateInstallationScript() { <# .SYNOPSIS diff --git a/builders/node-builder.psm1 b/builders/node-builder.psm1 index 88b2f15..21ef28f 100644 --- a/builders/node-builder.psm1 +++ b/builders/node-builder.psm1 @@ -15,6 +15,9 @@ class NodeBuilder { .PARAMETER Architecture 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. Using system BUILD_STAGINGDIRECTORY variable value. + .PARAMETER ArtifactLocation The location of generated Node.js artifact. Using system environment BUILD_BINARIESDIRECTORY variable value. @@ -26,6 +29,7 @@ class NodeBuilder { [version] $Version [string] $Platform [string] $Architecture + [string] $TempFolderLocation [string] $ArtifactLocation [string] $InstallationTemplatesLocation @@ -35,6 +39,7 @@ class NodeBuilder { $this.Architecture = $architecture $this.ArtifactLocation = $env:BUILD_BINARIESDIRECTORY + $this.TempFolderLocation = $env:BUILD_STAGINGDIRECTORY $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" } @@ -56,7 +61,7 @@ class NodeBuilder { $binariesUri = $this.GetBinariesUri() $targetFilename = [IO.Path]::GetFileName($binariesUri) - $targetFilepath = Join-Path -Path $this.ArtifactLocation -ChildPath $targetFilename + $targetFilepath = Join-Path -Path $this.TempFolderLocation -ChildPath $targetFilename Write-Debug "Download binaries from $binariesUri to $targetFilepath" try { @@ -78,11 +83,9 @@ class NodeBuilder { Write-Host "Download Node.js $($this.Version) [$($this.Architecture)] executable..." $binariesArchivePath = $this.Download() - $binariesArchiveDirectory = [IO.Path]::GetDirectoryName($binariesArchivePath) - $toolArchivePath = Join-Path $binariesArchiveDirectory $this.OutputArtifactName - Write-Host "Rename '$binariesArchivePath' to '$toolArchivePath'" - Rename-Item -Path $binariesArchivePath -NewName $toolArchivePath + Write-Host "Unpack binaries to target directory" + $this.ExtractBinaries($binariesArchivePath) Write-Host "Create installation script..." $this.CreateInstallationScript() diff --git a/builders/win-node-builder.psm1 b/builders/win-node-builder.psm1 index 2a30752..0246b26 100644 --- a/builders/win-node-builder.psm1 +++ b/builders/win-node-builder.psm1 @@ -40,6 +40,13 @@ class WinNodeBuilder : NodeBuilder { return "${base}/v$($this.Version)/node-v$($this.Version)-win-$($this.Architecture).7z" } + [void] ExtractBinaries($archivePath) { + $extractTargetDirectory = Join-Path $this.TempFolderLocation "tempExtract" + Extract-7ZipArchive -ArchivePath $archivePath -OutputDirectory $extractTargetDirectory + $nodeOutputPath = Get-Item $extractTargetDirectory\* | Select-Object -First 1 -ExpandProperty Fullname + Move-Item -Path $nodeOutputPath\* -Destination $this.ArtifactLocation + } + [void] CreateInstallationScript() { <# .SYNOPSIS diff --git a/helpers/nix-helpers.psm1 b/helpers/nix-helpers.psm1 new file mode 100644 index 0000000..6c5bdb4 --- /dev/null +++ b/helpers/nix-helpers.psm1 @@ -0,0 +1,16 @@ +<# +.SYNOPSIS +Unpack *.tar file +#> +function Extract-TarArchive { + param( + [Parameter(Mandatory=$true)] + [String]$ArchivePath, + [Parameter(Mandatory=$true)] + [String]$OutputDirectory + ) + + Write-Debug "Extract $ArchivePath to $OutputDirectory" + tar -C $OutputDirectory -xzf $ArchivePath --strip 1 + +} \ No newline at end of file diff --git a/helpers/win-helpers.psm1 b/helpers/win-helpers.psm1 new file mode 100644 index 0000000..9520fbd --- /dev/null +++ b/helpers/win-helpers.psm1 @@ -0,0 +1,15 @@ +<# +.SYNOPSIS +Unpack *.7z file +#> +function Extract-7ZipArchive { + param( + [Parameter(Mandatory=$true)] + [String]$ArchivePath, + [Parameter(Mandatory=$true)] + [String]$OutputDirectory + ) + + Write-Debug "Extract $ArchivePath to $OutputDirectory" + 7z x $ArchivePath -o"$OutputDirectory" -y | Out-Null +} \ No newline at end of file diff --git a/installers/nix-setup-template.sh b/installers/nix-setup-template.sh index 00b813a..c24ff22 100644 --- a/installers/nix-setup-template.sh +++ b/installers/nix-setup-template.sh @@ -18,14 +18,8 @@ echo "Create Node.js $NODE_VERSION folder" mkdir -p $NODE_TOOLCACHE_VERSION_ARCH_PATH echo "Copy Node.js binaries to hostedtoolcache folder" -cp ./tool.tar.gz $NODE_TOOLCACHE_VERSION_ARCH_PATH - -cd $NODE_TOOLCACHE_VERSION_ARCH_PATH - -echo "Unzip Node.js to $NODE_TOOLCACHE_VERSION_ARCH_PATH" -tar -zxf tool.tar.gz -C . --strip 1 -echo "Node.js unzipped successfully" -rm tool.tar.gz +cp -R ./* $NODE_TOOLCACHE_VERSION_ARCH_PATH +rm $NODE_TOOLCACHE_VERSION_ARCH_PATH/setup.sh echo "Create complete file" touch $NODE_TOOLCACHE_VERSION_PATH/x64.complete diff --git a/installers/win-setup-template.ps1 b/installers/win-setup-template.ps1 index e9bb2fd..7bd3034 100644 --- a/installers/win-setup-template.ps1 +++ b/installers/win-setup-template.ps1 @@ -1,4 +1,5 @@ $ErrorActionPreference = "Stop" + [Version]$Version = "{{__VERSION__}}" [string]$Architecture = "{{__ARCHITECTURE__}}" $ArchiveFileName = "tool.7z" @@ -29,16 +30,8 @@ if (-not (Test-Path $NodeToolcacheArchitecturePath)) { } Write-Host "Copy Node.js binaries to hostedtoolcache folder" -Copy-Item -Path $ArchiveFileName -Destination $NodeToolcacheArchitecturePath - -Set-Location $NodeToolcacheArchitecturePath -Write-Host "Unzip Node.js to $NodeToolcacheArchitecturePath" -7z.exe x $ArchiveFileName -o"$TempDirectory" -y | Out-Null -$NodeInnerFolder = Get-Item -Path "$TempDirectory\node-*" | Select-Object -First 1 -Get-ChildItem $NodeInnerFolder | Move-Item -Destination $NodeToolcacheArchitecturePath -Write-Host "Node.js unzipped successfully" - -Remove-Item $ArchiveFileName -Force | Out-Null +Copy-Item -Path * -Destination $NodeToolcacheArchitecturePath +Remove-Item $NodeToolcacheArchitecturePath\setup.ps1 -Force | Out-Null Write-Host "Create complete file" New-Item -ItemType File -Path $NodeToolcacheVersionPath -Name "$Architecture.complete" | Out-Null \ No newline at end of file diff --git a/tests/Node.Tests.ps1 b/tests/Node.Tests.ps1 index 47f3927..8ff9cb7 100644 --- a/tests/Node.Tests.ps1 +++ b/tests/Node.Tests.ps1 @@ -20,6 +20,11 @@ Describe "Node.js" { "node --version" | Should -ReturnZeroExitCode } + It "version is correct" { + $versionOutput = Invoke-Expression "node --version" + $versionOutput | Should -Match $Version + } + It "is used from tool-cache" { $nodePath = (Get-Command "node").Path $nodePath | Should -Not -BeNullOrEmpty