Public/Import-OriAzBopPsd.ps1

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<#
.SYNOPSIS
    Install PowerShell module from online gallery based on psd1 file
    It returns dependency tree
 
.DESCRIPTION
    Install PowerShell module from online gallery based on psd1 file
    It returns dependency tree
 
.PARAMETER DevOpsAccount
    The name of the dev ops account. Default value is 'oriflame'
 
.PARAMETER RegisterPsRepoFeedList
    Powershell Repository feed to register if needed
     
.PARAMETER RegisterNugetRepoFeedList
    Nuget Repository feed to register if needed
 
.PARAMETER Repository
    Repository feed to register if needed for getting powershell modules.
 
.PARAMETER Path
    Path to psd1 file
     
.PARAMETER Credential
    Repository Credential if needed
 
.PARAMETER SkipImport
    When is set Import-Module will be skipped
 
.PARAMETER SleepInSec
    Sleep time in sec between test if the module is ready to import.
 
.PARAMETER MaxRetry
    Max retry while waiting to import module
 
.EXAMPLE
$password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force
$RepositoryCredential = New-Object System.Management.Automation.PSCredential 'feafeafae@mydomain.net',$password
 
Import-OriAzBopPsd `
-Path $(Build.SourcesDirectory)\src\$(Build.Repository.Name).psd1 `
-Credential $RepositoryCredential
#>

function Import-OriAzBopPsd {
    [CmdLetBinding()]
    [OutputType([PSCustomObject])]
    param (
        [Parameter(Mandatory = $false, HelpMessage = "The name of the dev ops account")]
        [String] $DevOpsAccount = $Script:VstsAccount,

        [Parameter(Mandatory = $false, HelpMessage = "Powershell Repository feed to register if needed")]
        [String[]] $RegisterPsRepoFeedList = @('PackageManagementFeed'),

        [Parameter(Mandatory = $false, HelpMessage = "Nuget Repository feed to register if needed")]
        [String[]] $RegisterNugetRepoFeedList = @('DeploymentPackages'),

        [Parameter(Mandatory = $false, HelpMessage = "Repository feed to register if needed for getting powershell modules")]
        [String] $Repository = 'PackageManagementFeed',

        [Parameter(Mandatory = $true, HelpMessage = "Path to psd1 file")]
        [ValidateScript( { Test-Path $_ })]
        [string] $Path,

        [Parameter(Mandatory = $false, HelpMessage = "Repository Credential if needed")]
        [PSCredential] $Credential = $null,

        [Parameter(Mandatory = $false, HelpMessage = "When is set import-module will be skipped.")]
        [switch] $SkipImport,

        [Parameter(Mandatory = $False, HelpMessage = "Sleep time in sec between test if the module is ready to import.")]
        [int] $SleepInSec = 10,

        [Parameter(Mandatory = $False, HelpMessage = "Max retry")]
        [int] $MaxRetry = 20

    )
    $ErrorActionPreference = 'Stop'
    Write-Verbose "-- Import-OriAzBopPsd --"
    Write-Verbose "Name: $Name"
    Write-Verbose "Path: $Path"
    Write-Verbose "Credential: $(ConvertTo-Json $Credential)"
    Write-Verbose "SkipImport: $($SkipImport.IsPresent)"
    Write-Verbose "SleepInSec: $SleepInSec"
    Write-Verbose "MaxRetry: $MaxRetry"


    # Swich Default protol security to TLS12
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    # Fix credential provider
    Invoke-OriAzExrExceptionRetry `
        -ListedExceptions @('*') `
        -MaxRetry 60 `
        -SleepTimeInSec 60 `
        -ScriptBlockToRun {
        Invoke-WebRequest -Uri "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1" -UseBasicParsing | Invoke-Expression 6> $null
    }
    
    Install-OriAzBopPrerequisity -Name PowerShellGet -MinimumVersion 2.2.3 -SkipImport:$SkipImport -AllowClobber -SkipPublisherCheck
    Install-OriAzBopPrerequisity -Name PackageManagement -MinimumVersion 1.4.6 -SkipImport:$SkipImport -AllowClobber -SkipPublisherCheck

    # Required module needs to be installed and imported
    Register-OriAzBopRepository `
        -DevOpsAccount $DevOpsAccount `
        -RepositoryCredential $Credential `
        -PsProjectName $RegisterPsRepoFeedList `
        -NugetProjectName $RegisterNugetRepoFeedList `
        -SkipPrompt:$true `
        -Verbose:$VerbosePreference `
        -Debug:$DebugPreference 

    [PSCustomObject] $DependencyMap = Invoke-ResolveDependency `
        -InstalledLocation $Path `
        -Credential $Credential `
        -Repository $Repository `
        -SkipImport:$SkipImport `
        -Verbose:$VerbosePreference `
        -Debug:$DebugPreference
       
    Write-Verbose "Re-Import Module Path: $Path"
    # Note: Following import does NOT work.
    # Import-Module -Name $Name -RequiredVersion $RequiredVersion -Verbose
    # Any using of -RequiredVersion skip execution of init.ps1
    # This problem we're bpassing via using Import-Module on installed path of module.
    if ($SkipImport.IsPresent) {
        Write-Debug "Skip of Import-Module"
    }
    else {

        Wait-OriAzBopModuleComplete `
            -Path $Path `
            -SleepInSec $SleepInSec `
            -MaxRetry $MaxRetry `
            -Verbose:$VerbosePreference `
            -Debug:$DebugPreference

        Import-Module $Path `
            -Verbose:$VerbosePreference `
            -Debug:$DebugPreference `
            -Force
    }

    Write-Verbose "-- End of Import-OriAzBopPsd --"
    return $DependencyMap
}