Jenkins DSC Get Dependancies
# Configure Environment
$ErrorActionPreference = 'Stop'
Set-Location -Path $env:WORKSPACE
# Initialize variables
[string[]]$detectedmodules = @()
[string[]]$stagedmodules = @()
[string[]]$ignoremodules = "PSDesiredStateConfiguration"
[string]$modulespath = 'C:\Program Files\WindowsPowerShell\DscService\Modules'
write-warning -Message "This script does not upgrade existing modules. Please test your scripts with modules already installed on the pull server."
Write-Output "Checking for Internal NuGet repository"
If (Get-PSRepository -Name mynuget -ErrorAction SilentlyContinue) {
write-output "Internal NuGet respository already registered."
}
else {
write-output "Registering Internal NuGet repository..."
Register-PSRepository -Name MyNuGet -SourceLocation http://nuget.Internal.com/nuget/ -PublishLocation http://nuget.internal.com/nuget/package/ -ScriptSourceLocation http://nuget.internal.com/nuget/items/psscript/ -ScriptPublishLocation http://nuget.internal.com/nuget/package/ -InstallationPolicy Trusted -PackageManagementProvider NuGet -ErrorAction Stop | Out-Null
}
write-output "Importing NuGet package provider..."
Import-PackageProvider -Name NuGet -Force -ForceBootstrap -ErrorAction Stop | Out-Null
write-output "Setting PSModulePath..."
$env:PSModulePath = 'C:\Program Files\WindowsPowerShell\Modules;C:\Program Files (x86)\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules'
Write-Output "Detecting required modules..."
Get-Content -Path ".\$($env:ConfigName).ps1" | Where-Object { $_ -match '(import-dscresource\s+)' } | ForEach-Object {
$detectedmodules += $_.ToString().Trim().Split(" ") | Select-Object -Last 1
}
$detectedmodules = $detectedmodules | Where-Object { $_ -notcontains $ignoremodules }
Write-Output "Getting currently staged modules..."
Get-ChildItem -Path $modulespath -Filter *.zip | ForEach-Object {
$stagedmodules += $_.Name.ToString().Trim().Split("_")[0]
}
Write-Output "Checking for modules in the Jenkins server's powershell library..."
foreach ($detectedmodule In $detectedmodules) {
write-output "Checking for $detectedmodule..."
$checkmod = Get-DscResource -Module $detectedmodule -ErrorAction Stop -WarningAction SilentlyContinue
If ($checkmod) {
write-output "$detectedmodule already installed."
}
else {
Write-Output "Installing $detectedmodule..."
Install-Module -Name $detectedmodule -Repository mynuget -ErrorAction Stop
}
}
Write-Output "Identifying modules missing from the pullserver repository..."
$missingmodules = $detectedmodules | Where-Object { $stagedmodules -NotContains $_ }
foreach ($missingmodule In $missingmodules) {
Write-Output "Downloading $missingmodule..."
Save-Module -Name $missingmodule -Path . -ErrorAction Stop
Write-Output "Unhiding files to enable compression..."
Get-ChildItem -path ".\$missingmodule\$version\*" -force -Recurse | Where-Object { $_.Attributes -match "hidden" } | ForEach-Object { $_.Attributes = "" }
Write-Output "Compressing module..."
$version = (Get-ChildItem -Path ".\$missingmodule").Name
$archive = '.\' + $missingmodule + '_' + $version + '.zip'
Compress-Archive -Path ".\$missingmodule\$version\*" -DestinationPath $archive -ErrorAction Stop
Write-Output "Creating checksum..."
New-DscChecksum -Path $archive -OutPath . -ErrorAction Stop
write-output "Copying modules to module share..."
Copy-Item -Path $archive -Destination $modulespath -ErrorAction Stop
write-output "Copying checksum to module share..."
Copy-Item -Path "$archive.checksum" -Destination $modulespath -ErrorAction Stop
}
Document Actions
