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 Tradeweb NuGet respository..."
If(Get-PSRepository -Name TwNuGet -ErrorAction SilentlyContinue){
write-output "Tradeweb NuGet respository already registered."
}else{
write-output "Registering Tradeweb NuGet repository..."
Register-PSRepository -Name TwNuGet -SourceLocation http://nuget.tradeweb.com/nuget/ -PublishLocation http://nuget.tradeweb.com/nuget/package/ -ScriptSourceLocation http://nuget.tradeweb.com/nuget/items/psscript/ -ScriptPublishLocation http://nuget.tradeweb.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 TwNuGet -ErrorAction Stop
}
}


Write-Output "Identifying modules missing from the pullserver repository..."
$missingmodules = $detectedmodules | Where {$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{$_.Attributes -match "hidden"} | foreach{$_.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