Public/Set-BuildEnvironment.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
147
148
function Set-BuildEnvironment {
    <#
    .SYNOPSIS
        Normalize build system and project details into environment variables

    .FUNCTIONALITY
        CI/CD

    .DESCRIPTION
        Normalize build system and project details into environment variables

        Creates the following environment variables:
            $ENV:<VariableNamePrefix>ProjectPath via Get-BuildVariable
            $ENV:<VariableNamePrefix>BranchName via Get-BuildVariable
            $ENV:<VariableNamePrefix>CommitMessage via Get-BuildVariable
            $ENV:<VariableNamePrefix>BuildNumber via Get-BuildVariable
            $ENV:<VariableNamePrefix>ProjectName via Get-ProjectName
            $ENV:<VariableNamePrefix>PSModuleManifest via Get-PSModuleManifest
            $ENV:<VariableNamePrefix>ModulePath via Split-Path on PSModuleManifest
            $ENV:<VariableNamePrefix>BuildOutput via BuildOutput parameter
            $ENV:BHPSModulePath Legacy, via Split-Path on PSModuleManifest

        If you don't specify a prefix or use BH, we create BHPSModulePath (This will be removed July 1st)

    .PARAMETER Path
        Path to project root. Defaults to the current working path

    .PARAMETER VariableNamePrefix
        Allow to set a custom Prefix to the Environment variable created. The default is BH such as $Env:BHProjectPath

    .PARAMETER BuildOutput
        Specify a path to use for build output. Defaults to '$ProjectPath\BuildOutput'

        You may use build variables produced in this same call. Only include the variable, not ENV or the prefix. Use a literal $.

        Examples:
            -BuildOutput '$ProjectPath\BuildOutput'
            -BuildOutput 'C:\Build'
            -BuildOutput 'C:\Builds\$ProjectName'

    .PARAMETER Passthru
        If specified, include output of the build variables we create

    .PARAMETER GitPath
        Path to git. Defaults to git (i.e. git is in $ENV:PATH)

    .PARAMETER Force
        Overrides the Environment Variables even if they exist already

    .NOTES
        We assume you are in the project root, for several of the fallback options

    .EXAMPLE
        Set-BuildEnvironment

        Get-Item ENV:BH*

    .EXAMPLE
        Set-BuildEnvironment -VariableNamePrefix '' -Force

        Get-Item ENV:*

    .EXAMPLE
        Set-BuildEnvironment -Path C:\sc\PSDepend -BuildOutput 'C:\Builds\$ProjectName'

        # Set BuildEnvironment pointing at C:\sc\PSDepend
        # Assuming ProjectName evaluates to PSDepend, BuildOutput variable will be set to C:\Builds\PSDepend

    .LINK
        https://github.com/RamblingCookieMonster/BuildHelpers

    .LINK
        Get-BuildVariable

    .LINK
        Get-BuildEnvironment

    .LINK
        Get-ProjectName

    .LINK
        about_BuildHelpers
    #>

    [CmdLetBinding( SupportsShouldProcess = $false )]
    [System.Diagnostics.CodeAnalysis.SuppressMessage('PSUseShouldProcessForStateChangingFunctions', '')]
    param(
        [validatescript({ Test-Path $_ -PathType Container })]
        $Path = $PWD.Path,

        [ValidatePattern('\w*')]
        [String]
        $VariableNamePrefix = 'BH',

        [string]$BuildOutput = '$ProjectPath\BuildOutput',

        [switch]
        $Force,

        [switch]$Passthru,

        [validatescript({
            if(-not (Get-Command $_ -ErrorAction SilentlyContinue))
            {
                throw "Could not find command at GitPath [$_]"
            }
            $true
        })]
        [string]$GitPath
    )
    $GBEParams = @{
        Path = $Path
        As = 'hashtable'
        BuildOutput = $BuildOutput
    }
    if($PSBoundParameters.ContainsKey('GitPath')) {
        $GBEParams.add('GitPath', $GitPath)
    }
    $BuildHelpersVariables = Get-BuildEnvironment @GBEParams
    foreach ($VarName in $BuildHelpersVariables.Keys) {
        if($null -ne $BuildHelpersVariables[$VarName]) {
            $prefixedVar = "$VariableNamePrefix$VarName"

            Write-Verbose "storing [$prefixedVar] with value '$($BuildHelpersVariables[$VarName])'."
            $Output = New-Item -Path Env:\ -Name $prefixedVar -Value $BuildHelpersVariables[$VarName] -Force:$Force
            if ("VSTS" -eq $BuildHelpersVariables["BuildSystem"]) {
                Set-VSTSVariable -Name $prefixedVar -Value $BuildHelpersVariables[$VarName]
            }
            if($Passthru)
            {
                $Output
            }
        }
    }
    if($VariableNamePrefix -eq 'BH' -and $BuildHelpersVariables.ModulePath)
    {
        # Handle existing scripts that reference BHPSModulePath
        Write-Verbose "storing [BHPSModulePath] with value '$($BuildHelpersVariables.ModulePath)'"
        $Output = New-Item -Path Env:\ -Name BHPSModulePath -Value $BuildHelpersVariables.ModulePath -Force:$Force
        if ("VSTS" -eq $BuildHelpersVariables["BuildSystem"]) {
            Set-VSTSVariable -Name BHPSModulePath -Value $BuildHelpersVariables.ModulePath
        }
        if($Passthru)
        {
            $Output
        }
    }
}