diff --git a/images/linux/scripts/SoftwareReport/SoftwareReport.Common.psm1 b/images/linux/scripts/SoftwareReport/SoftwareReport.Common.psm1 index 87673c7e..ccff2b02 100644 --- a/images/linux/scripts/SoftwareReport/SoftwareReport.Common.psm1 +++ b/images/linux/scripts/SoftwareReport/SoftwareReport.Common.psm1 @@ -140,7 +140,7 @@ function Get-HomebrewVersion { } function Get-CpanVersion { - $result = Get-CommandResult "cpan --version" + $result = Get-CommandResult "cpan --version" -ExpectExitCode @(25, 255) $result.Output -match "version (?\d+\.\d+) " | Out-Null $cpanVersion = $Matches.version return "cpan $cpanVersion" diff --git a/images/linux/scripts/SoftwareReport/SoftwareReport.Generator.ps1 b/images/linux/scripts/SoftwareReport/SoftwareReport.Generator.ps1 index b15e53b0..38452bfc 100644 --- a/images/linux/scripts/SoftwareReport/SoftwareReport.Generator.ps1 +++ b/images/linux/scripts/SoftwareReport/SoftwareReport.Generator.ps1 @@ -3,7 +3,9 @@ param ( $OutputDirectory ) -$ErrorActionPreference = "Stop" +$global:ErrorActionPreference = "Stop" +$global:ErrorView = "NormalView" +Set-StrictMode -Version Latest Import-Module MarkdownPS Import-Module (Join-Path $PSScriptRoot "SoftwareReport.Android.psm1") -DisableNameChecking @@ -36,41 +38,41 @@ $markdown += New-MDHeader "Installed Software" -Level 2 $markdown += New-MDHeader "Language and Runtime" -Level 3 $runtimesList = @( - (Get-BashVersion), - (Get-CPPVersions), - (Get-FortranVersions), - (Get-ErlangVersion), - (Get-ErlangRebar3Version), - (Get-MonoVersion), - (Get-MsbuildVersion), - (Get-NodeVersion), - (Get-PerlVersion), - (Get-PythonVersion), - (Get-Python3Version), - (Get-RubyVersion), - (Get-SwiftVersion), - (Get-JuliaVersion), - (Get-KotlinVersion), - (Get-ClangVersions), - (Get-ClangFormatVersions) - ) + (Get-BashVersion), + (Get-CPPVersions), + (Get-FortranVersions), + (Get-ErlangVersion), + (Get-ErlangRebar3Version), + (Get-MonoVersion), + (Get-MsbuildVersion), + (Get-NodeVersion), + (Get-PerlVersion), + (Get-PythonVersion), + (Get-Python3Version), + (Get-RubyVersion), + (Get-SwiftVersion), + (Get-JuliaVersion), + (Get-KotlinVersion), + (Get-ClangVersions), + (Get-ClangFormatVersions) +) $markdown += New-MDList -Style Unordered -Lines ($runtimesList | Sort-Object) $markdown += New-MDHeader "Package Management" -Level 3 $packageManagementList = @( - (Get-HomebrewVersion), - (Get-CpanVersion), - (Get-GemVersion), - (Get-MinicondaVersion), - (Get-HelmVersion), - (Get-NpmVersion), - (Get-YarnVersion), - (Get-PipxVersion), - (Get-PipVersion), - (Get-Pip3Version), - (Get-VcpkgVersion) + (Get-HomebrewVersion), + (Get-CpanVersion), + (Get-GemVersion), + (Get-MinicondaVersion), + (Get-HelmVersion), + (Get-NpmVersion), + (Get-YarnVersion), + (Get-PipxVersion), + (Get-PipVersion), + (Get-Pip3Version), + (Get-VcpkgVersion) ) $markdown += New-MDList -Style Unordered -Lines ($packageManagementList | Sort-Object) @@ -273,4 +275,5 @@ $markdown += New-MDNewLine $markdown += New-MDHeader "Installed apt packages" -Level 3 $markdown += Get-AptPackages | New-MDTable +Test-BlankElement $markdown | Out-File -FilePath "${OutputDirectory}/Ubuntu-Readme.md" diff --git a/images/linux/scripts/SoftwareReport/SoftwareReport.Tools.psm1 b/images/linux/scripts/SoftwareReport/SoftwareReport.Tools.psm1 index 45eaa41f..fa6cea41 100644 --- a/images/linux/scripts/SoftwareReport/SoftwareReport.Tools.psm1 +++ b/images/linux/scripts/SoftwareReport/SoftwareReport.Tools.psm1 @@ -182,7 +182,7 @@ function Get-NvmVersion { function Get-PackerVersion { # Packer 1.7.1 has a bug and outputs version to stderr instead of stdout https://github.com/hashicorp/packer/issues/10855 - $result = (Get-CommandResult -Command "packer --version").Output + $result = (Get-CommandResult "packer --version").Output $packerVersion = [regex]::matches($result, "(\d+.){2}\d+").Value return "Packer $packerVersion" } diff --git a/images/linux/scripts/helpers/Common.Helpers.psm1 b/images/linux/scripts/helpers/Common.Helpers.psm1 index 0c609aea..eab83e20 100644 --- a/images/linux/scripts/helpers/Common.Helpers.psm1 +++ b/images/linux/scripts/helpers/Common.Helpers.psm1 @@ -2,11 +2,27 @@ function Get-CommandResult { param ( [Parameter(Mandatory=$true)] [string] $Command, - [switch] $Multiline + [int[]] $ExpectExitCode = 0, + [switch] $Multiline, + [bool] $ValidateExitCode = $true ) + # Bash trick to suppress and show error output because some commands write to stderr (for example, "python --version") $stdout = & bash -c "$Command 2>&1" $exitCode = $LASTEXITCODE + + if ($ValidateExitCode) { + if ($ExpectExitCode -notcontains $exitCode) { + try { + throw "StdOut: '$stdout' ExitCode: '$exitCode'" + } catch { + Write-Host $_.Exception.Message + Write-Host $_.ScriptStackTrace + exit $LASTEXITCODE + } + } + } + return @{ Output = If ($Multiline -eq $true) { $stdout } else { [string]$stdout } ExitCode = $exitCode diff --git a/images/linux/scripts/helpers/SoftwareReport.Helpers.psm1 b/images/linux/scripts/helpers/SoftwareReport.Helpers.psm1 index b645c670..a9c4c3a3 100644 --- a/images/linux/scripts/helpers/SoftwareReport.Helpers.psm1 +++ b/images/linux/scripts/helpers/SoftwareReport.Helpers.psm1 @@ -110,3 +110,49 @@ function Get-AptSourceRepository { return $sourceUrl } +function Test-BlankElement { + param( + [string] $Markdown + ) + + $splitByLines = $Markdown.Split("`n") + # Validate entry without version + $blankVersions = $splitByLines -match "^-" -notmatch "Image Version|MySQL Server|Vcpkg|\d\." | Out-String + + # Validate tables with blank rows + $blankRows = "" + for($i = 0; $i -lt $splitByLines.Length; $i++) { + $addRows= $false + $table = @() + if ($splitByLines[$i].StartsWith("#") -and $splitByLines[$i+1].StartsWith("|")) { + $table += $splitByLines[$i,($i+1),($i+2)] + $i += 3 + $current = $splitByLines[$i] + while ($current.StartsWith("|")) { + $isBlankRow = $current.Substring(1, $current.LastIndexOf("|") - 2).Split("|").Trim() -contains "" + if ($isBlankRow) { + $table += $current + $addRows = $true + } + $current = $splitByLines[++$i] + } + if ($addRows) { + $blankRows += $table | Out-String + } + } + } + + # Display report + $isReport = $false + if ($blankVersions) { + Write-Host "Software list with blank version:`n${blankVersions}" + $isReport = $true + } + if ($blankRows) { + Write-Host "Tables with blank rows:`n${blankRows}" + $isReport = $true + } + if ($isReport) { + exit 1 + } +} diff --git a/images/linux/scripts/helpers/Tests.Helpers.psm1 b/images/linux/scripts/helpers/Tests.Helpers.psm1 index 085aaa07..5689d9e5 100644 --- a/images/linux/scripts/helpers/Tests.Helpers.psm1 +++ b/images/linux/scripts/helpers/Tests.Helpers.psm1 @@ -44,12 +44,12 @@ function Invoke-PesterTests { function ShouldReturnZeroExitCode { Param( - [String] $ActualValue, + [string] $ActualValue, [switch] $Negate, [string] $Because # This parameter is unused but we need it to match Pester asserts signature ) - $result = Get-CommandResult $ActualValue + $result = Get-CommandResult $ActualValue -ValidateExitCode $false [bool]$succeeded = $result.ExitCode -eq 0 if ($Negate) { $succeeded = -not $succeeded } @@ -69,12 +69,12 @@ function ShouldReturnZeroExitCode { function ShouldMatchCommandOutput { Param( - [String] $ActualValue, - [String] $RegularExpression, + [string] $ActualValue, + [string] $RegularExpression, [switch] $Negate ) - $output = (Get-CommandResult $ActualValue).Output | Out-String + $output = (Get-CommandResult $ActualValue -ValidateExitCode $false).Output | Out-String [bool] $succeeded = $output -cmatch $RegularExpression if ($Negate) { diff --git a/images/linux/scripts/tests/Databases.Tests.ps1 b/images/linux/scripts/tests/Databases.Tests.ps1 index 79e6cb99..4b004963 100644 --- a/images/linux/scripts/tests/Databases.Tests.ps1 +++ b/images/linux/scripts/tests/Databases.Tests.ps1 @@ -11,7 +11,7 @@ Describe "MongoDB" { Describe "PostgreSQL" { It "PostgreSQL Service" { "sudo systemctl start postgresql" | Should -ReturnZeroExitCode - (Get-CommandResult "pg_isready").Output | Should -Be "/var/run/postgresql:5432 - accepting connections" + "pg_isready" | Should -MatchCommandOutput "/var/run/postgresql:5432 - accepting connections" "sudo systemctl stop postgresql" | Should -ReturnZeroExitCode } diff --git a/images/linux/scripts/tests/Java.Tests.ps1 b/images/linux/scripts/tests/Java.Tests.ps1 index 68caf17c..1a593274 100644 --- a/images/linux/scripts/tests/Java.Tests.ps1 +++ b/images/linux/scripts/tests/Java.Tests.ps1 @@ -29,8 +29,7 @@ Describe "Java" { $gradleVariableValue | Should -BeLike "/usr/share/gradle-*" $gradlePath = Join-Path $env:GRADLE_HOME "bin/gradle" - $result = Get-CommandResult "`"$GradlePath`" -version" - $result.ExitCode | Should -Be 0 + "`"$GradlePath`" -version" | Should -ReturnZeroExitCode } It "Java " -TestCases $jdkVersions { @@ -38,12 +37,11 @@ Describe "Java" { $javaVariableValue | Should -Not -BeNullOrEmpty $javaPath = Join-Path $javaVariableValue "bin/java" - $result = Get-CommandResult "`"$javaPath`" -version" - $result.ExitCode | Should -Be 0 + "`"$javaPath`" -version" | Should -ReturnZeroExitCode if ($Version -eq 8) { $Version = "1.${Version}" } - $result.Output | Should -Match ([regex]::Escape("openjdk version `"${Version}.")) + "`"$javaPath`" -version" | Should -MatchCommandOutput ([regex]::Escape("openjdk version `"${Version}.")) } } \ No newline at end of file