-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInstall-CiPowerShellModules.ps1
More file actions
127 lines (102 loc) · 3.45 KB
/
Copy pathInstall-CiPowerShellModules.ps1
File metadata and controls
127 lines (102 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
param(
[string[]]$ModuleName = @(
'Pester',
'NovaModuleTools',
'KeepAChangelog'
)
)
Set-StrictMode -Version Latest
function Get-CiModuleInstallOption {
param(
[Parameter(Mandatory)][string]$Name
)
if ($Name -eq 'Pester') {
return [pscustomobject]@{
RequiredVersion = '5.7.1'
MaximumVersion = '5.10.0'
AllowPrerelease = $false
}
}
return [pscustomobject]@{
RequiredVersion = $null
AllowPrerelease = $true
}
}
function Get-InstalledCiModule {
param(
[Parameter(Mandatory)][string]$Name
)
return Get-InstalledModule -Name $Name -ErrorAction SilentlyContinue |
Sort-Object Version -Descending |
Select-Object -First 1
}
function Write-CiInstalledModule {
param(
[Parameter(Mandatory)][string]$Name
)
$installedModule = Get-InstalledCiModule -Name $Name
if (-not $installedModule) {
throw "Expected PowerShell module '$Name' to be installed, but no installed module record was found."
}
Write-Host "Installed PowerShell module '$( $installedModule.Name )' version '$( $installedModule.Version )' from '$( $installedModule.Repository )'."
}
function Test-CiModuleInstallSkip {
param(
[Parameter(Mandatory)][pscustomobject]$InstallOptions,
$InstalledModule
)
if (-not $InstallOptions.RequiredVersion) {
return $false
}
if (-not $InstalledModule) {
return $false
}
return $InstalledModule.Version -eq [version]$InstallOptions.RequiredVersion
}
function Invoke-CiInstallModuleCommand {
param(
[Parameter(Mandatory)][hashtable]$InstallParams
)
Install-Module @InstallParams | Out-Null
}
function Install-CiModule {
param(
[Parameter(Mandatory)][string]$Name
)
$installOptions = Get-CiModuleInstallOption -Name $Name
$installedModule = Get-InstalledCiModule -Name $Name
if (Test-CiModuleInstallSkip -InstallOptions $installOptions -InstalledModule $installedModule) {
Write-Host "Skipping PowerShell module '$Name' because required version '$( $installOptions.RequiredVersion )' is already installed."
Write-CiInstalledModule -Name $Name
return
}
$installParams = @{Name = $Name; Repository = 'PSGallery'; Scope = 'CurrentUser'; Force = $true; ErrorAction = 'Stop'}
if ($installOptions.RequiredVersion) {
$installParams.RequiredVersion = $installOptions.RequiredVersion
Write-Host "Installing PowerShell module '$Name' version '$( $installOptions.RequiredVersion )'..."
} else {
$installParams.AllowPrerelease = $installOptions.AllowPrerelease
Write-Host "Installing PowerShell module '$Name' with AllowPrerelease=$( $installOptions.AllowPrerelease )..."
}
Invoke-CiInstallModuleCommand -InstallParams $installParams
Write-CiInstalledModule -Name $Name
}
function Set-CiRepositoryTrust {
[CmdletBinding(SupportsShouldProcess)]
param()
if ( $PSCmdlet.ShouldProcess('PSGallery', 'Set repository installation policy to Trusted')) {
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
}
}
function Invoke-CiPowerShellModuleInstall {
param(
[string[]]$ModuleName = @()
)
Set-CiRepositoryTrust
foreach ($name in $ModuleName) {
Install-CiModule -Name $name
}
}
if ($MyInvocation.InvocationName -ne '.') {
Invoke-CiPowerShellModuleInstall -ModuleName $ModuleName
}