使用参数设置Azure工厂管道



我现在很沮丧,因为我没有得到想要的结果。

我想做的是创建一个管道,该管道根据数据工厂的名称动态设置参数。

所以我有一个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数据库防火墙允许集成运行时访问

我猜这与我如何传递参数有关,但我不知道如何绕过这一点,因为我还没有找到一种方法来查看这些参数的值,除非它们被硬编码为链接服务的值,否则该方法可以工作。

首先,这听起来可行吗?还有其他人这样做过吗?他们是如何绕过这个问题的。

非常感谢

以下是一些建议,您可以将其作为参考:

  1. 您可以尝试有条件地动态设置变量。

    • 在管道作业中添加一个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)
  2. 如果使用的是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'
    

最新更新