Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(GH-61) Fix choco install package result #103

Open
wants to merge 25 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
13dc62b
add Invoke-Chocolatey cmdlet which throws error on choco failure
bassedball Dec 4, 2017
c2e80c6
Merge branch 'development' into feature/chocoinstallResult
bassedball Dec 4, 2017
e3d87fb
removed typo
bassedball Dec 4, 2017
b5e589e
removed alias, ensured LASTEXITCODE powershell is set same as choco e…
esiebes Dec 13, 2017
f8ad82e
add lastexitcode after invoke-chocolatey, included valid exit codes
esiebes Dec 15, 2017
cfb4fad
some fixes
esiebes Dec 15, 2017
db65157
removed unused variable
esiebes Dec 15, 2017
edd29ac
invoke-chocolatey now returns object array (same as chocolatey
esiebes Dec 15, 2017
2285eed
inovke chocolatey now returning output
esiebes Dec 15, 2017
60b5c52
change to output
esiebes Dec 15, 2017
119a7e3
some minor symantic changes
esiebes Oct 7, 2019
1b84d8c
reverted some changes
esiebes Oct 14, 2019
5ce77a1
mergeconflicts
esiebes May 25, 2020
36cbc0f
typo
esiebes May 25, 2020
a31199b
missed some bracket
esiebes May 25, 2020
f918292
add missing function
esiebes May 25, 2020
a765b4a
else block added, gone after merge
esiebes May 25, 2020
c62705e
should process with test not used
esiebes May 25, 2020
6f99ed1
add shouldprocess to Invoke chocolatey
esiebes May 25, 2020
ff013ba
add verbose to scriptstest
esiebes May 25, 2020
8d1c67f
shouldprocess thing error
esiebes May 25, 2020
d6c73a3
no error local found with shouldprocess
esiebes May 25, 2020
7270d0a
mm
esiebes May 25, 2020
93afb73
Created function invoke-chocolatey to ensure powershell exitcode equals
esiebes May 25, 2020
7b4d50c
Merge branch 'feature/chocoinstallresult' of https://github.com/esieb…
esiebes Jul 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 99 additions & 44 deletions DSCResources/cChocoPackageInstall/cChocoPackageInstall.psm1
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# Copyright (c) 2017 Chocolatey Software, Inc.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you remove this change from the commit?

# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco
# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -90,23 +89,23 @@ function Set-TargetResource
$whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Remove Chocolatey package')
if ($whatIfShouldProcess) {
Write-Verbose -Message "Removing $Name as ensure is set to absent"
UninstallPackage -pName $Name -pParams $Params
UninstallPackage -pName $Name -arguments $Params
}
} else {
$whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Installing / upgrading package from Chocolatey')
if ($whatIfShouldProcess) {
if ($Version) {
Write-Verbose -Message "Uninstalling $Name due to version mis-match"
UninstallPackage -pName $Name -pParams $Params
UninstallPackage -pName $Name -arguments $Params
Write-Verbose -Message "Re-Installing $Name with correct version $version"
InstallPackage -pName $Name -pParams $Params -pVersion $Version -pSource $Source -cParams $chocoParams
InstallPackage -pName $Name -arguments $Params -pVersion $Version -pSource $Source -cParams $chocoParams
} elseif ($AutoUpgrade) {
Write-Verbose -Message "Upgrading $Name due to version mis-match"
Upgrade-Package -pName $Name -pParams $Params -pSource $Source -cParams $chocoParams
InstallPackage -pName $Name -arguments $Params -pVersion $Version -pSource $Source -cParams $chocoParams
}
}
}
} else {
}else{
$whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Install package from Chocolatey')
if ($whatIfShouldProcess) {
InstallPackage -pName $Name -pParams $Params -pVersion $Version -pSource $Source -cParams $chocoParams
Expand Down Expand Up @@ -179,6 +178,7 @@ function Test-TargetResource

Return $result
}

function Test-ChocoInstalled
{
Write-Verbose -Message 'Test-ChocoInstalled'
Expand All @@ -197,7 +197,7 @@ function Test-ChocoInstalled

Function Test-Command
{
[CmdletBinding()]
[CmdletBinding(SupportsShouldProcess)]
[OutputType([bool])]
Param (
[string]$command = 'choco'
Expand Down Expand Up @@ -247,19 +247,38 @@ function InstallPackage
if ((Get-ChocoVersion) -ge [System.Version]('0.10.4')){
$chocoParams += " --no-progress"
}

$cmd = "choco install $pName $chocoParams"
Write-Verbose -Message "Install command: '$cmd'"
$packageInstallOuput = Invoke-Expression -Command $cmd
Write-Verbose -Message "Package output $packageInstallOuput"

Write-Verbose -Message "Install command: 'choco install $pName $chocoParams'"
$packageInstallOuput = Invoke-Chocolatey "install $pName $chocoParams"
Write-Verbose -Message "Package output $packageInstallOuput "
# Clear Package Cache
Get-ChocoInstalledPackage -Purge
Get-ChocoInstalledPackage 'Purge'

#refresh path varaible in powershell, as choco doesn"t, to pull in git
$env:Path = [Environment]::GetEnvironmentVariable('Path','Machine')
}


##region - chocolately installer work arounds. Main issue is use of write-host
##attempting to work around the issues with Chocolatey calling Write-host in its scripts.
function global:Write-Host
{
[Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidGlobalFunctions','')]
Param(
[Parameter(Mandatory, Position = 0)]
[Object]
$Object,
[Switch]
$NoNewLine,
[ConsoleColor]
$ForegroundColor,
[ConsoleColor]
$BackgroundColor

)

#Override default Write-Host...
Write-Verbose -Message $Object
}
function UninstallPackage
{
[Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidUsingInvokeExpression','')]
Expand Down Expand Up @@ -343,10 +362,10 @@ Function Test-LatestVersionInstalled {
$chocoParams += " --source=`"$pSource`""
}

$cmd = "choco upgrade $pName $chocoParams"
Write-Verbose -Message "Testing if $pName can be upgraded: '$cmd'"
$cmd = "upgrade $pName $chocoParams"
Write-Verbose -Message "Testing if $pName can be upgraded: choco '$cmd'"

$packageUpgradeOuput = Invoke-Expression -Command $cmd
$packageUpgradeOuput = Invoke-ChocoLatey $cmd
$packageUpgradeOuput | ForEach-Object {Write-Verbose -Message $_}

if ($packageUpgradeOuput -match "$pName.*is the latest version available based on your source") {
Expand All @@ -355,26 +374,6 @@ Function Test-LatestVersionInstalled {
return $false
}

##region - chocolately installer work arounds. Main issue is use of write-host
##attempting to work around the issues with Chocolatey calling Write-host in its scripts.
function global:Write-Host
{
Param(
[Parameter(Mandatory, Position = 0)]
[Object]
$Object,
[Switch]
$NoNewLine,
[ConsoleColor]
$ForegroundColor,
[ConsoleColor]
$BackgroundColor

)

#Override default Write-Host...
Write-Verbose -Message $Object
}

Function Upgrade-Package {
[Diagnostics.CodeAnalysis.SuppressMessage('PSUseApprovedVerbs','')]
Expand Down Expand Up @@ -408,19 +407,17 @@ Function Upgrade-Package {
$chocoParams += " --no-progress"
}

$cmd = "choco upgrade $pName $chocoParams"
$cmd = "upgrade $pName $chocoParams"

Write-Verbose -Message "Upgrade command: '$cmd'"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to keep that Verbose message consistent from what it was previously - prepend it with 'choco'?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this change in the latest commit.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed the choco


if (-not (IsPackageInstalled -pName $pName))
{
throw "$pName is not installed, you cannot upgrade"
}

$packageUpgradeOuput = Invoke-Expression -Command $cmd
$packageUpgradeOuput = Invoke-Chocolatey $cmd
$packageUpgradeOuput | ForEach-Object { Write-Verbose -Message $_ }

# Clear Package Cache
Get-ChocoInstalledPackage -Purge
}

function Get-ChocoInstalledPackage {
Expand Down Expand Up @@ -450,10 +447,68 @@ function Get-ChocoInstalledPackage {
}
}
}

Return $res
}

<#
.Synopsis
Run chocolatey executable and throws error on failure
.DESCRIPTION
Run chocolatey executable and throws error on failure
.EXAMPLE
Invoke-Chocolatey "list -lo"
.EXAMPLE
Invoke-Chocolatey -arguments "list -lo"
#>
function Invoke-Chocolatey
{
[CmdletBinding()]
Param
(
# chocolatey arguments."
[Parameter(Position=0)]
[string]$arguments
)
[int[]]$validExitCodes = $(
0 #most widely used success exit code
#1605, #(MSI uninstall) - the product is not found, could have already been uninstalled
#1614, #(MSI uninstall) - the product is uninstalled
#1641, #(MSI) - restart initiated
#3010 #(MSI, InnoSetup can be passed to provide this) - restart required
)
Write-Verbose -Message "command: 'choco $arguments'"

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "choco"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "$arguments"

$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null

$output = $p.StandardOutput.ReadToEnd()
$p.WaitForExit()
pauby marked this conversation as resolved.
Show resolved Hide resolved
$exitcode = $p.ExitCode
$p.Dispose()

#Set $LASTEXITCODE variable.
powershell.exe -NoLogo -NoProfile -Noninteractive "exit $exitcode"

if($exitcode -in $validExitCodes )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if a non-MSI exits with one of the MSI exit codes? That could indicate an error but it's ignored?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

its ignore/ non error

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If an EXE exits with an error code that matches one of those we need that to come through. Ignoring it would indicate it installed it okay when in fact it didn't.

{
$output.Split("`n")
$outputdata
}
else
{
#when error, throw output as error, contains errormessage
throw "Error: chocolatey command failed with exit code $exitcode.`n$output"
}
}

function Get-ChocoVersion {
[CmdletBinding()]
param (
Expand Down
12 changes: 12 additions & 0 deletions Tests/cChocoPackageInstall_Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,18 @@ Describe -Name "Testing $ResourceName loaded from $ResourceFile" -Fixture {
Test-TargetResource @Scenario4 | Should Be $False
}
}

Context -Name "Package cannot be found" -Fixture {

$Scenario1 = @{
Name = 'NonExistendPackage'
Ensure = 'Present'
}
It -name "Set-TargeResource -ensure 'present' should throw" -test {
{ Set-TargetResource @Scenario1 } | Should throw
}

}
}

#Clean-up
Expand Down
1 change: 1 addition & 0 deletions Tests/cChoco_ScriptAnalyzerTests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ if ($Modules.count -gt 0) {
foreach ($module in $modules) {
Context “Testing Module '$($module.FullName)'” {
foreach ($rule in $rules) {
Invoke-ScriptAnalyzer -Path $module.FullName -IncludeRule $rule.RuleName | fl
It “passes the PSScriptAnalyzer Rule $rule“ {
(Invoke-ScriptAnalyzer -Path $module.FullName -IncludeRule $rule.RuleName ).Count | Should Be 0
}
Expand Down