Ранее я спрашивал, как выполнить замену переменных с помощью 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'
DataSource=TheDbName;CheckConnectionOnOpen=true;UserId=USER001;Password=SE7VEN07;
- person Hershizer33   schedule 14.05.2020