Я регистрирую несколько руководств в выходных данных Azure DevOps, обратите внимание: введите описание изображения здесь
Итак, *** (секрет) *** - это мой результат, потому что я знаю, что конкретное поле является секретом. Однако ClientId
и TenantId
маскируются Azure DevOps сами по себе, и я не понимаю, как Azure DevOps решил, что их нужно замаскировать.
Это не переменные сборки, просто некоторые операторы Write-Host
.
Мы используем предварительный Azure DevOps Server 2019.
EDIT 1
Вот сценарий Powershell, который запускается:
function Initialize-AzureSqlDB(
[parameter(Mandatory)][ValidateScript({ Test-Path -LiteralPath $_ -PathType Container })]$DBScriptsSource,
[parameter(Mandatory)][string]$SqlServerName,
[Parameter(Mandatory)][string]$SqlServerResourceGroup,
[Parameter(Mandatory)][string]$SubscriptionId,
[Parameter(Mandatory)][string]$ClientId,
[Parameter(Mandatory)][string]$ClientSecret,
[Parameter(Mandatory)][string]$TenantId,
[string]$DBNamePrefix = "${env:UserName}_"
)
{
# Some code that does Write-Host for all the script parameters
...
Сценарий вызывается из шаблона сборки YAML. Фактические учетные данные участника службы находятся в переменных среды ARM _.... Вот код YAML:
- powershell: Initialize-AzureSqlDB -DBScriptsSource ${{ parameters.dbScriptLocation }} -DBNamePrefix ${{ parameters.dbNamePrefix }} -TenantId $env:ARM_TENANT_ID -SubscriptionId $env:ARM_SUBSCRIPTION_ID -ClientId $env:ARM_CLIENT_ID -ClientSecret $env:ARM_CLIENT_SECRET -SqlServerName $env:SqlServerName -SqlServerResourceGroup $env:SqlServerResourceGroup
displayName: Initializing Database(s).
condition: eq(variables['RunDBUpgrade'],true)
Теперь ни ClientId
, ни TenantId
не определены как переменные сборки. Их фактические значения исходят из существующей конечной точки подключения службы в Azure DevOps, но даже там нет ни одного секрета.
Так что мне неясно, как Azure DevOps решает их маскировать, а не SubscriptionId
, например. Я, со своей стороны, не хочу, чтобы ни один из них был замаскирован.
Кто-нибудь может объяснить, как Azure DevOps решает, что здесь маскировать?
EDIT 2
Итак, я проверил наше расширение, и оно содержит следующий код:
Write-Host "##vso[task.setvariable variable=ARM_SUBSCRIPTION_ID;]$($se.data.subscriptionId)"
Write-Host "##vso[task.setvariable variable=ARM_SUBSCRIPTION_NAME;]$($se.data.subscriptionName)"
Write-Host "##vso[task.setvariable variable=ARM_TENANT_ID;]$($se.auth.parameters.tenantid)"
Write-Host "##vso[task.setvariable variable=ARM_CLIENT_ID;isSecret=true]$($se.auth.parameters.serviceprincipalid)"
Write-Host "##vso[task.setvariable variable=ARM_CLIENT_SECRET;isSecret=true]$($se.auth.parameters.serviceprincipalkey)"
Это может объяснить, как маскируется ClientId
, но не TenantId
. Теперь есть вероятность, что код в главной ветке не совсем соответствует тому, который установлен на сервере. Я позабочусь о том, чтобы задача была перенесена, и тогда мы узнаем.