From 6b994dbb2d9100fa790fc2ef88b8ac21387f39d8 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Mon, 29 Aug 2016 13:12:01 -0700 Subject: [PATCH] Move the PowerShell code in appVeyor.yml to a module --- appveyor.yml | 116 ++----------------------------- tools/appveyor.psm1 | 161 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 111 deletions(-) create mode 100644 tools/appveyor.psm1 diff --git a/appveyor.yml b/appveyor.yml index 4738e844d..38a0403ce 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,120 +9,14 @@ nuget: install: - git submodule update --init - ps: $buildConfiguration = 'Release' - - ps: Import-Module .\build.psm1; Start-PSBootstrap -Force + - ps: Import-Module .\tools\Appveyor.psm1 + - ps: Invoke-AppveyorInstall build_script: - - ps: | - $ErrorActionPreference = 'Stop' - # check to be sure our test tags are correct - $result = Get-PesterTag - if ( $result.Result -ne "Pass" ) { - $result.Warnings - throw "Tags must be CI, Feature, Scenario, or Slow" - } - Start-PSBuild -CrossGen -Configuration $buildConfiguration - Start-PSBuild -FullCLR + - ps: Invoke-AppveyorBuild test_script: - - ps: | - # fail tests execution, if any PS error detected - $ErrorActionPreference = 'Stop' - # - # CoreCLR - $env:CoreOutput = Split-Path -Parent (Get-PSOutput -Options (New-PSOptions -Publish -Configuration $buildConfiguration)) - Write-Host -Foreground Green 'Run CoreCLR tests' - $testResultsFile = "$pwd\TestsResults.xml" - if(!(Test-Path "$env:CoreOutput\powershell.exe")) - { - throw "CoreCL PowerShell.exe was not built" - } - & ("$env:CoreOutput\powershell.exe") -noprofile -noninteractive -c "Set-ExecutionPolicy -Scope Process Unrestricted; Invoke-Pester test/powershell -Tag 'CI' -ExcludeTag 'Slow' -OutputFormat NUnitXml -OutputFile $testResultsFile" - - (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path $testResultsFile)) - # - # FullCLR - $env:FullOutput = Split-Path -Parent (Get-PSOutput -Options (New-PSOptions -FullCLR)) - Write-Host -Foreground Green 'Run FullCLR tests' - $testResultsFileFullCLR = "$pwd\TestsResults.FullCLR.xml" - Start-DevPowerShell -FullCLR -NoNewWindow -ArgumentList '-noprofile', '-noninteractive' -Command "Set-ExecutionPolicy -Scope Process Unrestricted; Invoke-Pester test/fullCLR -ExcludeTag 'Slow' -OutputFormat NUnitXml -OutputFile $testResultsFileFullCLR" - (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path $testResultsFileFullCLR)) - # - # Fail the build, if tests failed - Write-Host -Foreground Green 'Upload CoreCLR test results' - $x = [xml](cat -raw $testResultsFile) - if ([int]$x.'test-results'.failures -gt 0) - { - throw "$($x.'test-results'.failures) tests in test/powershell failed" - } - Write-Host -Foreground Green 'Upload FullCLR test results' - $x = [xml](cat -raw $testResultsFileFullCLR) - if ([int]$x.'test-results'.failures -gt 0) - { - throw "$($x.'test-results'.failures) tests in test/fullCLR failed" - } + - ps: Invoke-AppveyorTest on_finish: - - ps: | - $ErrorActionPreference = 'Stop' - try { - # Build packages - $packages = Start-PSPackage - - # Creating project artifact - $name = git describe - - # Remove 'v' from version, append 'PowerShell' - to be consistent with other package names - $name = $name -replace 'v','' - $name = 'PowerShell_' + $name - - $zipFilePath = Join-Path $pwd "$name.zip" - $zipFileFullPath = Join-Path $pwd "$name.FullCLR.zip" - Add-Type -assemblyname System.IO.Compression.FileSystem - Write-Verbose "Zipping ${env:CoreOutput} into $zipFilePath" -verbose - [System.IO.Compression.ZipFile]::CreateFromDirectory($env:CoreOutput, $zipFilePath) - Write-Verbose "Zipping ${env:FullOutput} into $zipFileFullPath" -verbose - [System.IO.Compression.ZipFile]::CreateFromDirectory($env:FullOutput, $zipFileFullPath) - - $artifacts = New-Object System.Collections.ArrayList - foreach ($package in $packages) { - $artifacts.Add($package) - } - - $artifacts.Add($zipFilePath) - $artifacts.Add($zipFileFullPath) - - if ($env:APPVEYOR_REPO_TAG_NAME) - { - # ignore the first part of semver, use the preview part - $preReleaseVersion = ($env:APPVEYOR_REPO_TAG_NAME).Split('-')[1] - } - else - { - $previewLabel = (git describe --abbrev=0).Split('-')[1] - $preReleaseVersion = "$previewLabel.$($env:APPVEYOR_BUILD_NUMBER)" - } - - Publish-NuGetFeed -OutputPath .\nuget-artifacts -VersionSuffix $preReleaseVersion - - $artifacts += (ls .\nuget-artifacts | % {$_.FullName}) - - $pushedAllArtifacts = $true - $artifacts | % { - Write-Host "Pushing $_ as Appveyor artifact" - if(Test-Path $_) - { - Push-AppveyorArtifact $_ - } - else - { - $pushedAllArtifacts = $false - Write-Warning "Artifact $_ does not exist." - } - } - if(!$pushedAllArtifacts) - { - throw "Some artifacts did not exist!" - } - } catch { - Write-Host -Foreground Red $_ - } + - ps: Invoke-AppveyorFinish diff --git a/tools/appveyor.psm1 b/tools/appveyor.psm1 new file mode 100644 index 000000000..02d6c219e --- /dev/null +++ b/tools/appveyor.psm1 @@ -0,0 +1,161 @@ +$ErrorActionPreference = 'Stop' +$repoRoot = Join-Path $PSScriptRoot '..' + +Import-Module (Join-Path $repoRoot 'build.psm1') + +function Invoke-AppVeyorFull +{ + Invoke-AppVeyorInstall + Invoke-AppVeyorBuild + Invoke-AppVeyorTest + Invoke-AppveyorFinish +} + +function Invoke-AppVeyorBuild +{ + # check to be sure our test tags are correct + $result = Get-PesterTag + if ( $result.Result -ne "Pass" ) { + $result.Warnings + throw "Tags must be CI, Feature, Scenario, or Slow" + } + Start-PSBuild -CrossGen -Configuration $buildConfiguration + Start-PSBuild -FullCLR +} + +function Invoke-AppVeyorInstall +{ + Start-PSBootstrap -Force +} + +function Update-AppVeyorTestResults +{ + param( + [string] $resultsFile + ) + + if($env:Appveyor) + { + $resolvedResultsPath = (Resolve-Path $resultsFile) + (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", $resolvedResultsPath) + } + else + { + Write-Warning "Not running in appveyor, skipping upload of test results: $resultsFile" + } +} + +function Invoke-AppVeyorTest +{ + # + # CoreCLR + $env:CoreOutput = Split-Path -Parent (Get-PSOutput -Options (New-PSOptions -Publish -Configuration $buildConfiguration)) + Write-Host -Foreground Green 'Run CoreCLR tests' + $testResultsFile = "$pwd\TestsResults.xml" + if(!(Test-Path "$env:CoreOutput\powershell.exe")) + { + throw "CoreCL PowerShell.exe was not built" + } + + & ("$env:CoreOutput\powershell.exe") -noprofile -noninteractive -c "Set-ExecutionPolicy -Scope Process Unrestricted; Invoke-Pester test/powershell -Tag 'CI' -ExcludeTag 'Slow' -OutputFormat NUnitXml -OutputFile $testResultsFile" + Update-AppVeyorTestResults -resultsFile $testResultsFile + + # + # FullCLR + $env:FullOutput = Split-Path -Parent (Get-PSOutput -Options (New-PSOptions -FullCLR)) + Write-Host -Foreground Green 'Run FullCLR tests' + $testResultsFileFullCLR = "$pwd\TestsResults.FullCLR.xml" + Start-DevPowerShell -FullCLR -NoNewWindow -ArgumentList '-noprofile', '-noninteractive' -Command "Set-ExecutionPolicy -Scope Process Unrestricted; Invoke-Pester test/fullCLR -ExcludeTag 'Slow' -OutputFormat NUnitXml -OutputFile $testResultsFileFullCLR" + Update-AppVeyorTestResults -resultsFile $testResultsFileFullCLR + + + # + # Fail the build, if tests failed + Write-Host -Foreground Green 'Upload CoreCLR test results' + $x = [xml](cat -raw $testResultsFile) + if ([int]$x.'test-results'.failures -gt 0) + { + throw "$($x.'test-results'.failures) tests in test/powershell failed" + } + + Write-Host -Foreground Green 'Upload FullCLR test results' + $x = [xml](cat -raw $testResultsFileFullCLR) + + if ([int]$x.'test-results'.failures -gt 0) + { + throw "$($x.'test-results'.failures) tests in test/fullCLR failed" + } +} + +function Invoke-AppveyorFinish +{ + try { + # Build packages + $packages = Start-PSPackage + + # Creating project artifact + $name = git describe + + # Remove 'v' from version, append 'PowerShell' - to be consistent with other package names + $name = $name -replace 'v','' + $name = 'PowerShell_' + $name + + $zipFilePath = Join-Path $pwd "$name.zip" + $zipFileFullPath = Join-Path $pwd "$name.FullCLR.zip" + Add-Type -assemblyname System.IO.Compression.FileSystem + Write-Verbose "Zipping ${env:CoreOutput} into $zipFilePath" -verbose + [System.IO.Compression.ZipFile]::CreateFromDirectory($env:CoreOutput, $zipFilePath) + Write-Verbose "Zipping ${env:FullOutput} into $zipFileFullPath" -verbose + [System.IO.Compression.ZipFile]::CreateFromDirectory($env:FullOutput, $zipFileFullPath) + + $artifacts = New-Object System.Collections.ArrayList + foreach ($package in $packages) { + $artifacts.Add($package) + } + + $artifacts.Add($zipFilePath) + $artifacts.Add($zipFileFullPath) + + if ($env:APPVEYOR_REPO_TAG_NAME) + { + # ignore the first part of semver, use the preview part + $preReleaseVersion = ($env:APPVEYOR_REPO_TAG_NAME).Split('-')[1] + } + else + { + $previewLabel = (git describe --abbrev=0).Split('-')[1] + $preReleaseVersion = "$previewLabel.$($env:APPVEYOR_BUILD_NUMBER)" + } + + # only publish to nuget feed if it is not a pull request + if(!$env:APPVEYOR_PULL_REQUEST_NUMBER) + { + Publish-NuGetFeed -OutputPath .\nuget-artifacts -VersionSuffix $preReleaseVersion + } + + $artifacts += (ls .\nuget-artifacts | % {$_.FullName}) + + $pushedAllArtifacts = $true + $artifacts | % { + Write-Host "Pushing $_ as Appveyor artifact" + if(Test-Path $_) + { + if($env:Appveyor) + { + Push-AppveyorArtifact $_ + } + } + else + { + $pushedAllArtifacts = $false + Write-Warning "Artifact $_ does not exist." + } + } + if(!$pushedAllArtifacts) + { + throw "Some artifacts did not exist!" + } + } catch { + Write-Host -Foreground Red $_ + } +} \ No newline at end of file