KeyVault --› Azure Pipeline --› Замена переменной XML добавляет в конец дополнительную одинарную кавычку, которая разрывает строку подключения.

Ранее я спрашивал, как выполнить замену переменных с помощью Azure KeyVault здесь, и смог заставить его в основном работать, за исключением одной последней проблемы. По какой-то неизвестной причине подстановка происходит идеально, но в конце добавляется одна лишняя одинарная кавычка. Поскольку это строки подключения в файле web.config, эта дополнительная одинарная кавычка нарушает их. Я понятия не имею, что добавляет эту дополнительную одинарную кавычку. Я сделал четырехкратную проверку KeyVault, чтобы убедиться, что это не опечатка. Я попытался выполнить замену переменной XML с помощью задачи FileTransform@2, как это рекомендовано в ответе на мой предыдущий вопрос, а также с задачей IISWebAppDeploymentOnMachineGroup@0 с XmlVariableSubstitution, установленным на true. Оба добавили дополнительную одинарную кавычку

Пример web.config перед запуском конвейера (это то, что проверяется в Git):

<connectionStrings>
  <add name="DbConnection" connectionString="Placeholder"/>
  ...
</connectionStrings>

И после завершения конвейера подстановкой переменных XML

<connectionStrings>
  <add name="DbConnection" connectionString="DataSource=TheDatabase;CheckConnectionOnOpen=true;UserId=MyUser;Password=ThePassword;'"/>
  ...
</connectionStrings>

Как видите, он правильно подключается к Azure KeyVault, получает значение и выполняет замену. Это дополнительная одинарная кавычка в конце после "ThePassword"; это делает строку подключения невозможной для анализа приложением.

Вот фрагменты моего конвейера:

- task: AzureKeyVault@1
  displayName: 'Get secrets from KeyVault'
  inputs:
    azureSubscription: '${{parameters.keyVault.keyVaultServiceConnection}}'
    KeyVaultName: '${{parameters.keyVault.keyVaultName}}'
    SecretsFilter: '*'
# KeyVault has an app name prefix for each connection string as well as an environment name postfix so this loops removes that prefix so the transformation can match the names/keys properly
- ${{ each secret in parameters.keyVault.secrets }}:
    - task: CmdLine@2
      displayName: 'Set KeyVault secret to match config name'
      inputs:
        script: echo ##vso[task.setvariable variable=${{secret.configSecretName}}]$(${{secret.secretName}}-${{parameters.environment}})
- task: IISWebAppManagementOnMachineGroup@0
  displayName: 'Set up app pool and web site'
  inputs:
    IISDeploymentType: 'IISWebsite'
    ActionIISWebsite: 'CreateOrUpdateWebsite'
    WebsiteName: '${{parameters.webSiteName}}'
    WebsitePhysicalPath: '${{parameters.webSitePhysicalPathRoot}}'
    WebsitePhysicalPathAuth: 'WebsiteUserPassThrough'
    CreateOrUpdateAppPoolForWebsite: true
    AppPoolNameForWebsite: '${{parameters.webAppPool}}'
    DotNetVersionForWebsite: '${{parameters.webAppPoolDotNetVersion}}'
    PipeLineModeForWebsite: '${{parameters.pipeLineModeForWebsite}}'
    AppPoolIdentityForWebsite: '${{parameters.appPoolIdentityForWebsite}}'
- task: IISWebAppDeploymentOnMachineGroup@0
  displayName: 'Deploy web site'
  inputs:
    WebSiteName: '${{parameters.webSiteName}}'
    VirtualApplication: '${{parameters.webAppName}}'
    Package: '$(System.ArtifactsDirectory)\*.zip'
    RemoveAdditionalFilesFlag: ${{parameters.removeAdditionalFiles}} # Set to true
    XmlTransformation: ${{parameters.xmlTransformation}} # Set to false
    XmlVariableSubstitution: ${{parameters.xmlVariableSubstitution}} # Set to true
    TakeAppOfflineFlag: true

Я также попытался установить для XmlVariableSubstitution значение false и использовать FileTransform@2, как указано выше:

- task: FileTransform@2
  inputs:
    folderPath: '${{parameters.webSitePhysicalPathRoot}}'
    xmlTargetFiles: 'web.config'

person Hershizer33    schedule 13.05.2020    source источник
comment
Протестировано с использованием переменных Keyvault для замены параметра web.config. Но это может работать нормально (без одинарной кавычки). Вы можете проверить, содержит ли значение Keyvault специальные символы. Если существуют специальные символы, вы можете попробовать удалить специальные символы и проверить, работает ли он должным образом. Пожалуйста, поделитесь примером специального контента Keyvault   -  person Kevin Lu-MSFT    schedule 14.05.2020
comment
Это строка подключения, поэтому, очевидно, ее нужно изменить, чтобы опубликовать здесь, но это пример того, что находится в хранилище ключей: DataSource=TheDbName;CheckConnectionOnOpen=true;UserId=USER001;Password=SE7VEN07;   -  person Hershizer33    schedule 14.05.2020
comment
Я тестирую ценность, которой вы поделились, но она все еще работает нормально. После тестирования я заметил, что если в KeyVault есть двойные кавычки, после замены они будут преобразованы в одинарные кавычки. Пожалуйста, проверьте, есть ли у вас двойные кавычки в значении keyvault. Вы можете напрямую попытаться заменить существующее значение хранилища ключей значением, которое вы указали выше для тестирования (создайте новую версию хранилища ключей). Вы также можете попробовать использовать только задачу хранилища ключей Azure и задачу преобразования файлов, чтобы запустить конвейер и проверить результат.   -  person Kevin Lu-MSFT    schedule 15.05.2020
comment
@KevinLu-MSFT В качестве продолжения двойных кавычек не было. Я пробовал много комбинаций всех задач и все еще имею проблему с одинарной кавычкой. На самом деле мне пришлось написать глупый скрипт powershells, который удалял одинарную кавычку, если строка подключения заканчивалась на единицу, просто чтобы запустить его. Любые другие мысли?   -  person Hershizer33    schedule 05.06.2020