我现在很沮丧,因为我没有得到想要的结果。
我想做的是创建一个管道,该管道根据数据工厂的名称动态设置参数。
所以我有一个3个数据工厂,除了实例名称外,所有的名称都完全相同。
显然,我可以通过使用命令@pipeline().DataFactory
获得这些信息。我仍然找到了一种方法,告诉我什么是有帮助的。
从这里我可以得到一个例子,例如数据工厂的名称如下:
- dataFactory_d
- 数据Factory_t
- dataFactory_p
如果我可以使用substring(@pipeline().DataFactory,13,1)
,这应该会给我"d"、"t"或"p"作为实例。根据数组是否基于0,我再次从阅读指南中不知道。
因此,一旦我有了这些信息,我就有了一些可以用来确定连接使用哪个结构的东西。
我创建了一个使用多个数据集的管道,所以我正试图使这些数据集成为动态的。
我已经设置了这些,以便它们使用链接服务,并且我可以手动填写值,并且连接工作正常。例如:-
- DomainName=domainDev
- UserName=userDev
- SecretName=sectretDev
所以我现在要做的是设置参数,它将是:if(equals(@{dataset().Instance}),'p'),'db_prod',equals(@{dataset().Instance}),'t'),'db_test','db_dev')
然后,我应该能够设置链接的服务参数==动态参数。
这种方法似乎不起作用。我得到这个错误:
检查链接的服务配置是否正确,并确保SQL数据库防火墙允许集成运行时访问
我猜这与我如何传递参数有关,但我不知道如何绕过这一点,因为我还没有找到一种方法来查看这些参数的值,除非它们被硬编码为链接服务的值,否则该方法可以工作。
首先,这听起来可行吗?还有其他人这样做过吗?他们是如何绕过这个问题的。
非常感谢
以下是一些建议,您可以将其作为参考:
-
您可以尝试有条件地动态设置变量。
- 在管道作业中添加一个shell脚本任务,以有条件地动态设置变量(此处以Bash为例(。
Instance=@{dataset().Instance} if [[ $Instance = p ]]; then echo "##vso[task.setvariable variable=database]db_prod" elif [[ $Instance = t ]]; then echo "##vso[task.setvariable variable=database]db_test" else echo "##vso[task.setvariable variable=database]db_dev" fi
- 完成上述任务后,在同一作业的后续步骤(任务(中,您可以访问变量
$(database)
- 在管道作业中添加一个shell脚本任务,以有条件地动态设置变量(此处以Bash为例(。
-
如果使用的是YAML管道,并且动态参数用作任务的输入,则可以尝试使用
if
子句来有条件地设置任务输入。例如:
steps: - task: {task name}@{version} inputs: . . . ${{ if(equals(@{dataset().Instance}),'p') }}: database: 'db_prod' ${{ if(equals(@{dataset().Instance}),'t') }}: database: 'db_test' ${{ if(equals(@{dataset().Instance}),'d') }}: database: 'db_dev'