diff --git a/src/GitlabCli/GitlabCli.psd1 b/src/GitlabCli/GitlabCli.psd1 index 4f0c78a..581d492 100644 --- a/src/GitlabCli/GitlabCli.psd1 +++ b/src/GitlabCli/GitlabCli.psd1 @@ -1,11 +1,11 @@ @{ - ModuleVersion = '1.101.2' + ModuleVersion = '1.101.3' PrivateData = @{ PSData = @{ LicenseUri = 'https://github.com/chris-peterson/pwsh-gitlab/blob/main/LICENSE' ProjectUri = 'https://github.com/chris-peterson/pwsh-gitlab' - ReleaseNotes = 'Move global variables to init script' + ReleaseNotes = 'Better handling for pipeline and job variables' } } @@ -242,6 +242,7 @@ 'ConvertTo-PascalCase' 'ConvertTo-SnakeCase' 'ConvertTo-UrlEncoded' + 'ConvertTo-GitlabVariables' 'Get-FilteredObject' 'Get-GitlabVersion' 'Invoke-GitlabApi' diff --git a/src/GitlabCli/Jobs.psm1 b/src/GitlabCli/Jobs.psm1 index c5b6e86..bead912 100644 --- a/src/GitlabCli/Jobs.psm1 +++ b/src/GitlabCli/Jobs.psm1 @@ -182,22 +182,14 @@ function Start-GitlabJob { HttpMethod = "POST" Path = "projects/$($Project.Id)/jobs/$JobId/play" SiteUrl = $SiteUrl - Body = @{ - job_variables_attributes = @{} - } + Body = @{} } if ($Variables) { - $ReformattedVariables = $Variables.GetEnumerator() | ForEach-Object { - @{ - key = $_.Name - value = $_.Value - } - } - $GitlabApiArguments.Body.job_variables_attributes = @($ReformattedVariables) + $GitlabApiArguments.Body.job_variables_attributes = $Variables | ConvertTo-GitlabVariables } - if ($PSCmdlet.ShouldProcess("start job $($Project.PathWithNamespace)", "$($GitlabApiArguments | ConvertTo-Json)")) { + if ($PSCmdlet.ShouldProcess("$($Project.PathWithNamespace)", "start job $($GitlabApiArguments | ConvertTo-Json)")) { try { # https://docs.gitlab.com/ee/api/jobs.html#run-a-job Invoke-GitlabApi @GitlabApiArguments | New-WrapperObject "Gitlab.Job" diff --git a/src/GitlabCli/Pipelines.psm1 b/src/GitlabCli/Pipelines.psm1 index bf52d81..9e6f4a9 100644 --- a/src/GitlabCli/Pipelines.psm1 +++ b/src/GitlabCli/Pipelines.psm1 @@ -809,14 +809,7 @@ function New-GitlabPipeline { } if ($Variables) { - $ReformattedVariables = $Variables.GetEnumerator() | ForEach-Object { - @{ - variable_type = 'env_var' - key = $_.Name - value = $_.Value - } - } - $Request.variables = @($ReformattedVariables) + $Request.variables = $Variables | ConvertTo-GitlabVariables -Type 'env_var' } $GitlabApiArguments = @{ @@ -826,7 +819,7 @@ function New-GitlabPipeline { SiteUrl = $SiteUrl } - if ($PSCmdlet.ShouldProcess("$($Project.PathWithNamespace)", "create new pipeline ($($Request | ConvertTo-Json))")) { + if ($PSCmdlet.ShouldProcess("$($Project.PathWithNamespace)", "create new pipeline $($Request | ConvertTo-Json)")) { $Pipeline = Invoke-GitlabApi @GitlabApiArguments | New-WrapperObject 'Gitlab.Pipeline' if ($Wait) { diff --git a/src/GitlabCli/Variables.psm1 b/src/GitlabCli/Variables.psm1 index e02fe52..c029188 100644 --- a/src/GitlabCli/Variables.psm1 +++ b/src/GitlabCli/Variables.psm1 @@ -69,3 +69,39 @@ function Resolve-GitlabVariable { } } } +function ConvertTo-GitlabVariables { + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + $Object, + + [Parameter()] + [Alias('Type')] + [string] + $VariableType + ) + + if ($Object) { + $Enumerator = switch ($Object.GetType().Name) { + hashtable { + $Object.GetEnumerator() + } + pscustomobject { + $Object.PSObject.Properties + } + default { + throw "Unsupported type for '-Object' (expected [hashtable] or [pscustomobject])" + } + } + $Enumerator | ForEach-Object { + $Var = @{ + key = $_.Name + value = $_.Value + } + if ($VariableType) { + $Var.variable_type = $VariableType + } + $Var + } + } +}