Я хочу передать переменные задаче SqlAzureDacpacDeployment@1 (или DotNetCoreCLI@2) экземпляра SQL Server при запуске конвейера Azure.
Эта переменная будет env (dev, Acceptance, Prod), для которой работает конвейер.
У меня есть конвейер, который выглядит так (не идентичен):
variables:
ARMSvcCnnName: YourAzureResourceManagerServiceConnectionName
AzureSQLServerName: YourAzureSQLSeverName
AzureSQLDBName: YourAzureSQLDBName
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
pool:
vmImage: 'windows-latest'
- task: DotNetCoreCLI@2
displayName: 'Build Project: *.sqlproj'
inputs:
command: 'build'
projects: '**\*.sqlproj'
- task: SqlAzureDacpacDeployment@1
displayName: 'Deploy Azure SQL DB'
inputs:
azureSubscription: '$(ARMSvcCnnName)'
AuthenticationType: 'servicePrincipal'
ServerName: '$(AzureSQLServerName).database.windows.net'
DatabaseName: '$(AzureSQLDBName)'
deployType: 'DacpacTask'
DeploymentAction: 'Publish'
DacpacFile: '**\*.dacpac'
AdditionalArguments: '/v:ETLUserPassword = "$(sql-password)" /v:AppUserPassword = "$(sql-password)"'
IpDetectionMethod: 'AutoDetect'
DeleteFirewallRule: false
Мне было интересно, могу ли я динамически передавать переменную env, которая поступает из интерфейса CI/CD, в каждую из этих задач, чтобы использовать ее в запросе T-SQL следующим образом:
IF @myVariable = 'dev'
BEGIN
PRINT 'DEV';
END
ELSE if @myVariable = 'acc'
BEGIN
-- Other commands here
PRINT 'ACC';
END
ELSE
BEGIN
-- Other commands here
PRINT 'PROD';
END
Я думал о sqlcmd вместе с PublishProfile, но мне не хватает подходящего урока.
Мб:
SqlAdditionalArguments: # строка. Необязательный. Используйте, когда TaskNameSelector = SqlTask. Дополнительные аргументы Invoke-Sqlcmd.
InlineAdditionalArguments: # строка. Необязательный. Используйте, когда TaskNameSelector = InlineSqlTask. Дополнительные аргументы Invoke-Sqlcmd.
Я провел дополнительное расследование и добавил ответ ниже, пожалуйста, проверьте.
Конечно, я сделаю. Дайте мне немного времени, пожалуйста





В вашей задаче SqlAzureDacpacDeployment@1 вы представляете publishdacpac файл в Azure sql, он вызывает SqlPackage.exe для развертывания, он не поддерживает передачу custom variable в скрипт sql.
Чтобы запустить файл сценария SQL в базе данных SQL Azure, вам следует выбрать SqlTask для deployType, он использует команду Invoke-Sqlcmd, вы можете указать сценарий sql и передать custom variables в SqlAdditionalArguments. Задача, как показано ниже:
- task: SqlAzureDacpacDeployment@1
inputs:
azureSubscription: 'ARMConn-NonProd'
AuthenticationType: 'server'
ServerName: 'testsqlserver1.database.windows.net'
DatabaseName: 'testdb1'
SqlUsername: 'test'
SqlPassword: '$(sqlpwd)'
deployType: 'SqlTask'
SqlFile: '**\test.sql'
SqlAdditionalArguments: '-Variable "myVariable=$(env)"'
IpDetectionMethod: 'AutoDetect'
Чтобы вывести переменную в консоль конвейера для проверки, измените содержимое сценария sql, как показано ниже:
DECLARE @OutputMessage VARCHAR(50)
IF '$(myVariable)' = 'dev'
BEGIN
SET @OutputMessage = 'DEV'
END
ELSE IF '$(myVariable)' = 'acc'
BEGIN
SET @OutputMessage = 'ACC'
END
ELSE
BEGIN
SET @OutputMessage = 'PROD'
END
SELECT @OutputMessage AS 'Environment'
Значение выводится в конвейер:
Более подробную информацию вы можете найти в руководстве по выполнению задач .
Не могли бы вы уточнить, как переменная
envопределяется в конвейере? Немного запутано, потому что оно может иметь разные значения. Кроме того, я не могу найти ни однойenvпеременной в вашей задачеSqlAzureDacpacDeployment@1, так что на самом деле вы хотите использовать это значение в запросе T-SQL? Если да, то переменные типаnon-secretимеют видautomatically mappedкакenvironment variable, вы можете прочитать значение из переменной среды. Пожалуйста, проверьте документ для получения подробной информации.