From e3bec4476619c794d14f0c7787298306d45a87cb Mon Sep 17 00:00:00 2001 From: Yanbing Date: Fri, 27 Jan 2017 10:47:20 -0800 Subject: [PATCH] Improvements to CI build and validation output --- appveyor.yml | 21 +-- contrib/win32/openssh/appveyor.psm1 | 264 ++++++++++++++++++++-------- contrib/win32/openssh/build.psm1 | 20 +-- contrib/win32/openssh/sshd_config | 2 +- regress/pesterTests/SCP.Tests.ps1 | 78 ++++++-- regress/pesterTests/SSH.Tests.ps1 | 8 +- 6 files changed, 278 insertions(+), 115 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index b3303b4a9..46186a6a6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 0.0.6.0.{build} +version: 0.0.8.0.{build} image: Visual Studio 2015 branches: @@ -11,33 +11,34 @@ init: build_script: - ps: | - Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -WarningAction SilentlyContinue + Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -DisableNameChecking Invoke-AppVeyorBuild after_build: - ps: | - Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -WarningAction SilentlyContinue Install-OpenSSH - ps: Write-Verbose "Restart computer ..." - - ps: Restart-Computer -ComputerName localhost -Force + - ps: Restart-Computer -Force - ps: Start-Sleep -s 5 # Needs to be proceeded with -ps: as it's interpreted by AppVeyor - - ps: Write-Verbose "Restart computer completed" + - ps: Write-Verbose "Restart computer completed!" before_test: - ps: | - Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -WarningAction SilentlyContinue - Install-TestDependencies + Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -DisableNameChecking + Install-TestDependencies + Deploy-OpenSSHTests test_script: - cmd: | - "%ProgramFiles%\PowerShell\6.0.0.14\powershell.exe" -Command "Import-Module \"%APPVEYOR_BUILD_FOLDER%\contrib\win32\openssh\AppVeyor.psm1\" -WarningAction SilentlyContinue;Run-OpenSSHTests" + "%ProgramFiles%\PowerShell\6.0.0.14\powershell.exe" -Command "Import-Module \"%APPVEYOR_BUILD_FOLDER%\contrib\win32\openssh\AppVeyor.psm1\" -DisableNameChecking;Run-OpenSSHPesterTest" + - ps: | + Check-PesterTestResult + Run-OpenSSHUnitTest after_test: - ps: | - Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -WarningAction SilentlyContinue Upload-OpenSSHTestResults on_finish: - ps: | - Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppVeyor.psm1 -WarningAction SilentlyContinue Publish-Artifact diff --git a/contrib/win32/openssh/appveyor.psm1 b/contrib/win32/openssh/appveyor.psm1 index 828228d50..f248fa8c6 100644 --- a/contrib/win32/openssh/appveyor.psm1 +++ b/contrib/win32/openssh/appveyor.psm1 @@ -1,8 +1,9 @@ $ErrorActionPreference = 'Stop' -Import-Module $PSScriptRoot\build.psm1 +Import-Module $PSScriptRoot\build.psm1 -Force -DisableNameChecking $repoRoot = Get-RepositoryRoot -$script:logFile = join-path $repoRoot.FullName "appveyorlog.log" - +$script:logFile = join-path $repoRoot.FullName "appveyor.log" +$script:messageFile = join-path $repoRoot.FullName "BuildMessage.log" +$testfailed = $false <# Called by Write-BuildMsg to write to the build log, if it exists. @@ -22,6 +23,28 @@ function Write-Log } } +# Sets a build variable +Function Write-BuildMessage +{ + param( + [Parameter(Mandatory=$true)] + [ValidateNotNullOrEmpty()] + [string] $Message, + $Category, + [string] $Details) + + if($env:AppVeyor) + { + Add-AppveyorMessage @PSBoundParameters + } + + # write it to the log file, if present. + if (-not ([string]::IsNullOrEmpty($script:messageFile))) + { + Add-Content -Path $script:messageFile -Value "$Category--$Message" + } +} + # Sets a build variable Function Set-BuildVariable { @@ -35,13 +58,17 @@ Function Set-BuildVariable $Value ) - if($env:AppVeyor) + if($env:AppVeyor -and (Get-Command Set-AppveyorBuildVariable -ErrorAction Ignore) -ne $null) { Set-AppveyorBuildVariable @PSBoundParameters } - else + elseif($env:AppVeyor) { - Set-Item env:/$name -Value $Value + appveyor SetVariable -Name $Name -Value $Value + } + else + { + Set-Item env:$Name -Value $Value } } @@ -71,7 +98,6 @@ function Invoke-AppVeyorFull Invoke-AppVeyorBuild Install-OpenSSH Install-TestDependencies - & "$env:ProgramFiles\PowerShell\6.0.0.12\powershell.exe" -Command {Import-Module $($repoRoot.FullName)\contrib\win32\openssh\AppVeyor.psm1;Run-OpenSSHTests -uploadResults} Run-OpenSSHTests Publish-Artifact } @@ -85,9 +111,11 @@ function Invoke-AppVeyorFull # Implements the AppVeyor 'build_script' step function Invoke-AppVeyorBuild -{ +{ + Set-BuildVariable TestPassed True Start-SSHBuild -Configuration Release -NativeHostArch x64 Start-SSHBuild -Configuration Debug -NativeHostArch x86 + Write-BuildMessage -Message "OpenSSH binaries build success!" -Category Information } <# @@ -193,6 +221,7 @@ function Download-PSCoreMSI if ($v) { + Write-BuildMessage -Message "Failed to download PSCore MSI package from $url" -Category Error throw "Failed to download PSCore MSI package from $url" } else @@ -216,14 +245,37 @@ function Install-TestDependencies if (-not ($isModuleAvailable)) { Write-Log -Message "Installing Pester..." - choco install Pester -y --force --limitoutput + choco install Pester -y --force --limitoutput 2>&1 >> $script:logFile } if ( -not (Test-Path "$env:ProgramData\chocolatey\lib\sysinternals\tools" ) ) { Write-Log -Message "sysinternals not present. Installing sysinternals." - choco install sysinternals -y --force --limitoutput - } + choco install sysinternals -y --force --limitoutput 2>&1 >> $script:logFile + } + <#if ( (-not (Test-Path "${env:ProgramFiles(x86)}\Windows Kits\8.1\Debuggers\" )) -and (-not (Test-Path "${env:ProgramFiles(x86)}\Windows Kits\10\Debuggers\" ))) { + Write-Log -Message "debugger not present. Installing windbg." + choco install windbg --force --limitoutput -y 2>&1 >> $script:logFile + }#> Install-PSCoreFromGithub + $psCorePath = GetLocalPSCorePath + Set-BuildVariable -Name psPath -Value $psCorePath + Write-BuildMessage -Message "All testDependencies installed!" -Category Information +} + +<# + .Synopsis + Get the path to the installed powershell score +#> +function GetLocalPSCorePath { + $psPath = Get-ChildItem "$env:ProgramFiles\PowerShell\*\powershell.exe" -Recurse -ErrorAction SilentlyContinue + if($psPath.Count -eq 0) + { + "" + } + else + { + $psPath[-1].FullName + } } <# .Synopsis @@ -246,7 +298,7 @@ function Install-OpenSSH Build-Win32OpenSSHPackage @PSBoundParameters Push-Location $OpenSSHDir - &( "$OpenSSHDir\install-sshd.ps1") + & ( "$OpenSSHDir\install-sshd.ps1") .\ssh-keygen.exe -A Start-Service ssh-agent &( "$OpenSSHDir\install-sshlsa.ps1") @@ -256,6 +308,7 @@ function Install-OpenSSH Start-Service sshd Pop-Location + Write-BuildMessage -Message "OpenSSH installed!" -Category Information } <# @@ -337,20 +390,28 @@ function Build-Win32OpenSSHPackage { $RealConfiguration = $Configuration } - [System.IO.DirectoryInfo] $repositoryRoot = Get-RepositoryRoot $sourceDir = Join-Path $repositoryRoot.FullName -ChildPath "bin\$folderName\$RealConfiguration" Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHDir -Include *.exe,*.dll -Exclude *unittest*.* -Force -ErrorAction Stop $sourceDir = Join-Path $repositoryRoot.FullName -ChildPath "contrib\win32\openssh" - Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHDir -Include *.ps1,sshd_config -Exclude AnalyzeCodeDiff.ps1 -Force -ErrorAction Stop - + Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHDir -Include *.ps1,sshd_config -Exclude AnalyzeCodeDiff.ps1 -Force -ErrorAction Stop + $packageName = "rktools.2003" $rktoolsPath = "${env:ProgramFiles(x86)}\Windows Resource Kits\Tools\ntrights.exe" if (-not (Test-Path -Path $rktoolsPath)) { Write-Log -Message "$packageName not present. Installing $packageName." - choco install $packageName -y --force + choco install $packageName -y --force 2>&1 >> $script:logFile + if (-not (Test-Path -Path $rktoolsPath)) + { + choco install $packageName -y --force 2>&1 >> $script:logFile + if (-not (Test-Path -Path $rktoolsPath)) + { + Write-BuildMessage "Installation dependencies: failed to download $packageName. try again please." -Category Error + throw "failed to download $packageName" + } + } } Copy-Item -Path $rktoolsPath -Destination $OpenSSHDir -Force -ErrorAction Stop @@ -439,7 +500,37 @@ function Deploy-OpenSSHTests Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHTestDir -Include *.ps1,*.psm1 -Force -ErrorAction Stop $sourceDir = Join-Path $repositoryRoot.FullName -ChildPath "bin\$folderName\$RealConfiguration" - Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHTestDir -Exclude ssh-agent.exe, sshd.exe -Force -ErrorAction Stop + Copy-Item -Path "$sourceDir\*" -Destination $OpenSSHTestDir -Exclude ssh-agent.exe, sshd.exe -Force -ErrorAction Stop + + + $sshdConfigFile = "$OpenSSHTestDir\sshd_config" + if (-not (Test-Path -Path $sshdConfigFile -PathType Leaf)) + { + Write-BuildMessage "Installation dependencies: $OpenSSHTestDir\sshd_config is missing in the folder" -Category Error + throw "$OpenSSHTestDir\sshd_config is missing in the folder" + } + + if ($env:DebugMode) + { + $strToReplace = "#LogLevel INFO" + (Get-Content $sshdConfigFile).Replace($strToReplace,"LogLevel Debug3") | Set-Content $sshdConfigFile + } + if(-not ($env:psPath)) + { + $psCorePath = GetLocalPSCorePath + Set-BuildVariable -Name psPath -Value $psCorePath + } + + $strToReplace = "Subsystem sftp sftp-server.exe" + if($env:psPath) + { + $strNewsubSystem = @" +Subsystem sftp sftp-server.exe +Subsystem powershell $env:psPath +"@ + } + + (Get-Content $sshdConfigFile).Replace($strToReplace, $strNewsubSystem) | Set-Content $sshdConfigFile } @@ -491,7 +582,7 @@ function Add-Artifact ( [ValidateNotNull()] [System.Collections.ArrayList] $artifacts, - [string] $FileToAdd = "$env:SystemDrive\Win32OpenSSH*.zip" + [string] $FileToAdd ) $files = Get-ChildItem -Path $FileToAdd -ErrorAction Ignore @@ -499,11 +590,11 @@ function Add-Artifact { $files | % { $null = $artifacts.Add($_.FullName) - } + } } else { - Write-Warning "Skip publishing package artifacts. $FileToAdd does not exist" + Write-Log -Message "Skip publishing package artifacts. $FileToAdd does not exist" } } @@ -513,7 +604,7 @@ function Add-Artifact #> function Publish-Artifact { - Write-Output "Publishing project artifacts" + Write-Host -ForegroundColor Yellow "Publishing project artifacts" [System.Collections.ArrayList] $artifacts = [System.Collections.ArrayList]::new() $packageFolder = $env:SystemDrive @@ -524,14 +615,17 @@ function Publish-Artifact Add-Artifact -artifacts $artifacts -FileToAdd "$packageFolder\Win32OpenSSH*.zip" Add-Artifact -artifacts $artifacts -FileToAdd "$env:SystemDrive\OpenSSH\UnitTestResults.txt" - Add-Artifact -artifacts $artifacts -FileToAdd "$script:logFile" + Add-Artifact -artifacts $artifacts -FileToAdd "$env:SystemDrive\OpenSSH\TestError.txt" # Get the build.log file for each build configuration Add-BuildLog -artifacts $artifacts -buildLog (Get-BuildLogFile -root $repoRoot.FullName) + Add-Artifact -artifacts $artifacts -FileToAdd "$script:logFile" + Add-Artifact -artifacts $artifacts -FileToAdd "$script:messageFile" + foreach ($artifact in $artifacts) { - Write-Output "Publishing $artifact as Appveyor artifact" + Write-Log -Message "Publishing $artifact as Appveyor artifact" # NOTE: attempt to publish subsequent artifacts even if the current one fails Push-AppveyorArtifact $artifact -ErrorAction "Continue" } @@ -543,54 +637,82 @@ function Publish-Artifact #> function Run-OpenSSHPesterTest { - param($testRoot, $outputXml) + param($testRoot = "$env:SystemDrive\OpenSSH", + $outputXml = "$env:SystemDrive\OpenSSH\TestResults.xml") # Discover all CI tests and run them. Push-Location $testRoot Write-Log -Message "Running OpenSSH Pester tests..." - $testFolders = Get-ChildItem *.tests.ps1 -Recurse | ForEach-Object{ Split-Path $_.FullName} | Sort-Object -Unique - + $testFolders = Get-ChildItem *.tests.ps1 -Recurse | ForEach-Object{ Split-Path $_.FullName} | Sort-Object -Unique Invoke-Pester $testFolders -OutputFormat NUnitXml -OutputFile $outputXml -Tag 'CI' Pop-Location } +function Check-PesterTestResult +{ + param($outputXml = "$env:SystemDrive\OpenSSH\TestResults.xml") + if (-not (Test-Path $outputXml)) + { + Write-Warning "$($xml.'test-results'.failures) tests in regress\pesterTests failed" + Write-BuildMessage -Message "Test result file $outputXml not found after tests." -Category Error + Set-BuildVariable TestPassed False + } + $xml = [xml](Get-Content -raw $outputXml) + if ([int]$xml.'test-results'.failures -gt 0) + { + $errorMessage = "$($xml.'test-results'.failures) tests in regress\pesterTests failed. Detail test log is at TestResults.xml." + Write-Warning $errorMessage + Write-BuildMessage -Message $errorMessage -Category Error + Set-BuildVariable TestPassed False + } + + # Writing out warning when the $Error.Count is non-zero. Tests Should clean $Error after success. + if ($Error.Count -gt 0) + { + Write-BuildMessage -Message "Tests Should clean $Error after success." -Category Warning + $Error| Out-File "$testInstallFolder\TestError.txt" -Append + } +} + <# .Synopsis Run unit tests. #> function Run-OpenSSHUnitTest { - param($testRoot, $unitTestOutputFile) + param($testRoot = "$env:SystemDrive\OpenSSH", + $unitTestOutputFile = "$env:SystemDrive\OpenSSH\UnitTestResults.txt") # Discover all CI tests and run them. - Push-Location $testRoot + Push-Location $testRoot Write-Log -Message "Running OpenSSH unit tests..." if (Test-Path $unitTestOutputFile) { Remove-Item -Path $unitTestOutputFile -Force -ErrorAction SilentlyContinue } - $unitTestFiles = Get-ChildItem -Path "$testRoot\unittest*.exe" - $testFailed = $false + $unitTestFiles = Get-ChildItem -Path "$testRoot\unittest*.exe" -Exclude unittest-kex.exe + $testfailed = $false if ($unitTestFiles -ne $null) { $unitTestFiles | % { - Write-Log -Message "Running OpenSSH unit $($_.FullName)..." + Write-Output "Running OpenSSH unit $($_.FullName)..." & $_.FullName >> $unitTestOutputFile $errorCode = $LASTEXITCODE if ($errorCode -ne 0) { - $testFailed = $true - Write-Log -Message "$($_.FullName) test failed for OpenSSH.`nExitCode: $error" + $testfailed = $true + $errorMessage = "$($_.FullName) test failed for OpenSSH.`nExitCode: $errorCode. Detail test log is at UnitTestResults.txt." + Write-Warning $errorMessage + Write-BuildMessage -Message $errorMessage -Category Error + Set-BuildVariable TestPassed False } - } - - if($testFailed) + } + if(-not $testfailed) { - throw "SSH unit tests failed" + Write-BuildMessage -Message "All Unit tests passed!" -Category Information } } - Pop-Location } @@ -602,17 +724,9 @@ function Run-OpenSSHUnitTest The name of the xml file to write pester results. The default value is '.\testResults.xml' - .Parameter uploadResults - Uploads the tests results. - .Example .\RunTests.ps1 Runs the tests and creates the default 'testResults.xml' - - .Example - .\RunTests.ps1 -uploadResults - Runs the tests and creates teh default 'testResults.xml' and uploads it to appveyor. - #> function Run-OpenSSHTests { @@ -621,39 +735,47 @@ function Run-OpenSSHTests ( [string] $testResultsFile = "$env:SystemDrive\OpenSSH\TestResults.xml", [string] $unitTestResultsFile = "$env:SystemDrive\OpenSSH\UnitTestResults.txt", - [string] $testInstallFolder = "$env:SystemDrive\OpenSSH" + [string] $testInstallFolder = "$env:SystemDrive\OpenSSH" ) Deploy-OpenSSHTests -OpenSSHTestDir $testInstallFolder - + Run-OpenSSHUnitTest -testRoot $testInstallFolder -unitTestOutputFile $unitTestResultsFile # Run all pester tests. Run-OpenSSHPesterTest -testRoot $testInstallFolder -outputXml $testResultsFile - - $xml = [xml](Get-Content -raw $testResultsFile) - if ([int]$xml.'test-results'.failures -gt 0) - { - throw "$($xml.'test-results'.failures) tests in regress\pesterTests failed" - } - - # Writing out warning when the $Error.Count is non-zero. Tests Should clean $Error after success. - if ($Error.Count -gt 0) - { - $Error| Out-File "$env:SystemDrive\OpenSSH\TestError.txt" -Append - } - - Run-OpenSSHUnitTest -testRoot $testInstallFolder -unitTestOutputFile $unitTestResultsFile } function Upload-OpenSSHTestResults { - [CmdletBinding()] - param - ( - [string] $testResultsFile = "$env:SystemDrive\OpenSSH\TestResults.xml" - ) + [CmdletBinding()] + param + ( + [string] $testResultsFile = "$env:SystemDrive\OpenSSH\TestResults.xml" + ) - if ($env:APPVEYOR_JOB_ID) - { - (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path $testResultsFile)) - } + if ($env:APPVEYOR_JOB_ID) + { + $resultFile = Resolve-Path $testResultsFile -ErrorAction Ignore + if($resultFile) + { + (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", $resultFile) + Write-BuildMessage -Message "Test results uploaded!" -Category Information + } + } + + if ($env:DebugMode) + { + Remove-Item $env:DebugMode + } + + if($env:TestPassed -ieq 'True') + { + Write-BuildMessage -Message "The checkin validation success!" + } + else + { + Write-BuildMessage -Message "The checkin validation failed!" -Category Error + throw "The checkin validation failed!" + } } + +Export-ModuleMember -Function Set-BuildVariable, Invoke-AppVeyorBuild, Install-OpenSSH, Install-TestDependencies, GetLocalPSCorePath, Upload-OpenSSHTestResults, Run-OpenSSHTests, Publish-Artifact, Start-SSHBuild, Deploy-OpenSSHTests, Run-OpenSSHUnitTest,Run-OpenSSHPesterTest,Check-PesterTestResult diff --git a/contrib/win32/openssh/build.psm1 b/contrib/win32/openssh/build.psm1 index 722a32b2a..ba84d20d8 100644 --- a/contrib/win32/openssh/build.psm1 +++ b/contrib/win32/openssh/build.psm1 @@ -151,7 +151,7 @@ function Start-SSHBootstrap else { Write-BuildMsg -AsInfo -Message "Chocolatey not present. Installing chocolatey." -Silent:$silent - Invoke-Expression ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) + Invoke-Expression ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) 2>&1 >> $script:BuildLogFile if (-not ($machinePath.ToLower().Contains($chocolateyPath.ToLower()))) { @@ -207,7 +207,7 @@ function Start-SSHBootstrap if (-not (Test-Path -Path $nasmPath -PathType Container)) { Write-BuildMsg -AsInfo -Message "$packageName not present. Installing $packageName." -Silent:$silent - choco install $packageName -y --force --limitoutput --execution-timeout 10000 + choco install $packageName -y --force --limitoutput --execution-timeout 10000 2>&1 >> $script:BuildLogFile } else { @@ -220,9 +220,9 @@ function Start-SSHBootstrap if ($null -eq $VSPackageInstalled) { - Write-BuildMsg -AsInfo -Message "$packageName not present. Installing $packageName." -Silent:$silent + Write-BuildMsg -AsInfo -Message "$packageName not present. Installing $packageName." $adminFilePath = "$script:OpenSSHRoot\contrib\win32\openssh\VSWithBuildTools.xml" - choco install $packageName -packageParameters "--AdminFile $adminFilePath" -y --force --limitoutput --execution-timeout 10000 + choco install $packageName -packageParameters "--AdminFile $adminFilePath" -y --force --limitoutput --execution-timeout 10000 2>&1 >> $script:BuildLogFile } else { @@ -235,8 +235,8 @@ function Start-SSHBootstrap if (-not (Test-Path -Path $sdkPath)) { - Write-BuildMsg -AsInfo -Message "Windows 8.1 SDK not present. Installing $packageName." -Silent:$silent - choco install $packageName -y --limitoutput --force + Write-BuildMsg -AsInfo -Message "Windows 8.1 SDK not present. Installing $packageName." + choco install $packageName -y --limitoutput --force 2>&1 >> $script:BuildLogFile } else { @@ -330,7 +330,7 @@ function Start-SSHBuild $script:BuildLogFile = Get-BuildLogFile -root $repositoryRoot.FullName -Configuration $Configuration -NativeHostArch $NativeHostArch if (Test-Path -Path $script:BuildLogFile) { - Remove-Item -Path $script:BuildLogFile + Remove-Item -Path $script:BuildLogFile -force } Write-BuildMsg -AsInfo -Message "Starting Open SSH build; Build Log: $($script:BuildLogFile)" @@ -341,10 +341,8 @@ function Start-SSHBuild Copy-OpenSSLSDK $msbuildCmd = "msbuild.exe" $solutionFile = Get-SolutionFile -root $repositoryRoot.FullName - $cmdMsg = @("${solutionFile}", "/p:Platform=${NativeHostArch}", "/p:Configuration=${Configuration}", "/noconlog", "/nologo", "/fl", "/flp:LogFile=${script:BuildLogFile}`;Append`;Verbosity=diagnostic") - #$cmdMsg = @("${solutionFile}", "/p:Platform=${NativeHostArch}", "/p:Configuration=${Configuration}", "/nologo", "/fl", "/flp:LogFile=${script:BuildLogFile}`;Append`;Verbosity=diagnostic") + $cmdMsg = @("${solutionFile}", "/p:Platform=${NativeHostArch}", "/p:Configuration=${Configuration}", "/m", "/noconlog", "/nologo", "/fl", "/flp:LogFile=${script:BuildLogFile}`;Append`;Verbosity=diagnostic") - & $msbuildCmd $cmdMsg $errorCode = $LASTEXITCODE @@ -353,7 +351,7 @@ function Start-SSHBuild Write-BuildMsg -AsError -ErrorAction Stop -Message "Build failed for OpenSSH.`nExitCode: $error." } - Write-BuildMsg -AsInfo -Message "SSH build passed." + Write-BuildMsg -AsInfo -Message "SSH build passed." -Silent:$silent } function Get-BuildLogFile diff --git a/contrib/win32/openssh/sshd_config b/contrib/win32/openssh/sshd_config index 78ce20a7f..97cd8e831 100644 --- a/contrib/win32/openssh/sshd_config +++ b/contrib/win32/openssh/sshd_config @@ -112,7 +112,7 @@ AuthorizedKeysFile .ssh/authorized_keys #Banner none # override default of no subsystems -Subsystem sftp C:/Program Files/OpenSSH/sftp-server.exe +Subsystem sftp sftp-server.exe # Example of overriding settings on a per-user basis #Match User anoncvs diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 9e64e2b76..d16840b82 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -25,6 +25,7 @@ Describe "Tests for scp command" -Tags "CI" { [Machine] $server = [Machine]::new([MachineRole]::Server) $client.SetupClient($server) $server.SetupServer($client) + $script:logNum = 0 $testData = @( @{ @@ -35,7 +36,7 @@ Describe "Tests for scp command" -Tags "CI" { @{ Title = 'Simple copy local file to remote file' Source = $SourceFilePath - Destination = "$($server.localAdminUserName)@$($server.MachineName):$DestinationFilePath" + Destination = "$($server.localAdminUserName)@$($server.MachineName):$DestinationFilePath" }, @{ Title = 'Simple copy remote file to local file' @@ -76,6 +77,19 @@ Describe "Tests for scp command" -Tags "CI" { Destination = $DestinationDir } ) + + function CheckTarget { + param([string]$target) + if(-not (Test-path $target)) + { + Copy-Item .\logs\ssh-agent.log ".\logs\failedagent$script:logNum.log" -Force + Copy-Item .\logs\sshd.log ".\logs\failedsshd$script:logNum.log" -Force + $script:logNum++ + + return $false + } + return $true + } } AfterAll { @@ -87,7 +101,7 @@ Describe "Tests for scp command" -Tags "CI" { } BeforeAll { - $null = New-Item $DestinationDir -ItemType directory -Force + $null = New-Item $DestinationDir -ItemType directory -Force -ErrorAction SilentlyContinue } AfterEach { @@ -105,30 +119,44 @@ Describe "Tests for scp command" -Tags "CI" { $Server.SecureHostKeys($server.PrivateHostKeyPaths) $privateKeyFile = $client.clientPrivateKeyPaths[0] } + BeforeEach { + if ($env:DebugMode) + { + Stop-Service ssh-agent -Force + Start-Sleep 2 + Remove-Item .\logs\ssh-agent.log -Force -ErrorAction ignore + Remove-Item .\logs\sshd.log -Force -ErrorAction ignore + Start-Service sshd + } + } AfterAll { $Server.CleanupHostKeys() } It 'File copy with -i option and private key: ' -TestCases:$testData { - param([string]$Title, $Source, $Destination) + param([string]$Title, $Source, $Destination) .\scp -i $privateKeyFile $Source $Destination + $LASTEXITCODE | Should Be 0 + #validate file content. DestPath is the path to the file. + CheckTarget -target $DestinationFilePath | Should Be $true $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length).Length -eq 0 $equal | Should Be $true - } + } It 'Directory recursive copy with -i option and private key: <Title> ' -TestCases:$testData1 { - param([string]$Title, $Source, $Destination) + param([string]$Title, $Source, $Destination) .\scp -r -i $privateKeyFile $Source $Destination + $LASTEXITCODE | Should Be 0 + CheckTarget -target (join-path $DestinationDir $SourceDirName) | Should Be $true $equal = @(Compare-Object (Get-Item -path $SourceDir ) (Get-Item -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length).Length -eq 0 $equal | Should Be $true - $equal = @(Compare-Object (Get-ChildItem -Recurse -path $SourceDir) (Get-ChildItem -Recurse -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length).Length -eq 0 - $equal | Should Be $true + $equal | Should Be $true } } @@ -147,28 +175,34 @@ Describe "Tests for scp command" -Tags "CI" { .\ssh-add.exe -D } - It 'File copy with -S option (positive)' { - .\scp -S .\ssh.exe $SourceFilePath "$($server.localAdminUserName)@$($server.MachineName):$DestinationFilePath" + It 'File copy with -S -v option (positive)' { + .\scp -S .\ssh.exe -v $SourceFilePath "$($server.localAdminUserName)@$($server.MachineName):$DestinationFilePath" + $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. + CheckTarget -target $DestinationFilePath | Should Be $true $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length).Length -eq 0 $equal | Should Be $true } - It 'File copy with -p -c -v option: <Title> ' -TestCases:$testData { + It 'File copy with -p -c option: <Title> ' -TestCases:$testData { param([string]$Title, $Source, $Destination) - - .\scp -p -c aes128-ctr -v -C $Source $Destination + + .\scp -p -c aes128-ctr -C $Source $Destination + $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. + CheckTarget -target $DestinationFilePath | Should Be $true $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length, LastWriteTime.DateTime).Length -eq 0 $equal | Should Be $true } - It 'Directory recursive copy with -r -p -v option: <Title> ' -TestCases:$testData1 { - param([string]$Title, $Source, $Destination) - .\scp -r -p -c aes128-ctr -v $Source $Destination + It 'Directory recursive copy with -r -p -c option: <Title> ' -TestCases:$testData1 { + param([string]$Title, $Source, $Destination) + .\scp -r -p -c aes128-ctr $Source $Destination + $LASTEXITCODE | Should Be 0 + CheckTarget -target (join-path $DestinationDir $SourceDirName) | Should Be $true $equal = @(Compare-Object (Get-Item -path $SourceDir ) (Get-Item -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length, LastWriteTime.DateTime).Length -eq 0 - $equal | Should Be $true + $equal | Should Be $true $equal = @(Compare-Object (Get-ChildItem -Recurse -path $SourceDir) (Get-ChildItem -Recurse -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length, LastWriteTime.DateTime).Length -eq 0 $equal | Should Be $true @@ -184,7 +218,9 @@ Describe "Tests for scp command" -Tags "CI" { param([string]$Title, $Source, $Destination) .\scp -i $identifyFile -C -q $Source $Destination + $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. + CheckTarget -target $DestinationFilePath | Should Be $true $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length).Length -eq 0 $equal | Should Be $true } @@ -193,6 +229,8 @@ Describe "Tests for scp command" -Tags "CI" { param([string]$Title, $Source, $Destination) .\scp -i $identifyFile -C -r -q $Source $Destination + $LASTEXITCODE | Should Be 0 + CheckTarget -target (join-path $DestinationDir $SourceDirName) | Should Be $true $equal = @(Compare-Object (Get-Item -path $SourceDir ) (Get-Item -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length).Length -eq 0 $equal | Should Be $true @@ -213,8 +251,10 @@ Describe "Tests for scp command" -Tags "CI" { It 'File copy with -p options: <Title> ' -TestCases:$testData { param([string]$Title, $Source, $Destination) - .\scp -p $Source $Destination + .\scp -p $Source $Destination + $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. + CheckTarget -target $DestinationFilePath | Should Be $true $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length, LastWriteTime.DateTime).Length -eq 0 $equal | Should Be $true } @@ -222,7 +262,9 @@ Describe "Tests for scp command" -Tags "CI" { It 'Directory recursive copy with -p and -v options: <Title> ' -TestCases:$testData1 { param([string]$Title, $Source, $Destination) - .\scp -r -p $Source $Destination + .\scp -r -p $Source $Destination + $LASTEXITCODE | Should Be 0 + CheckTarget -target (join-path $DestinationDir $SourceDirName) | Should Be $true $equal = @(Compare-Object (Get-Item -path $SourceDir ) (Get-Item -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length, LastWriteTime.DateTime).Length -eq 0 $equal | Should Be $true diff --git a/regress/pesterTests/SSH.Tests.ps1 b/regress/pesterTests/SSH.Tests.ps1 index 01790d181..9c461b1db 100644 --- a/regress/pesterTests/SSH.Tests.ps1 +++ b/regress/pesterTests/SSH.Tests.ps1 @@ -14,9 +14,9 @@ Describe "Tests for ssh command" -Tags "CI" { $testData = @( @{ - Title = 'Simple logon -v option'; + Title = 'Simple logon no option'; LogonStr = "$($server.localAdminUserName)@$($server.MachineName)" - Options = "-v" + Options = "" }, @{ Title = 'Simple logon using -C -l option' @@ -32,9 +32,9 @@ Describe "Tests for ssh command" -Tags "CI" { Options = '-i $identifyFile -q' }, @{ - Title = "logon using -i -v option" + Title = "logon using -i option" LogonStr = "$($server.localAdminUserName)@$($server.MachineName)" - Options = '-i $identifyFile -v' + Options = '-i $identifyFile' }, @{ Title = "logon using -i -c option"