根据存储库名称使用不同的池/无法在作业条件下访问“ Build.Repository.Name”变量

时间:2019-09-02 15:01:09

标签: azure-pipelines

对于我的主存储库(假设rmetzger/flink),我想将Azure Pipelines构建作业发送到我自己的运行非常强大的构建计算机的代理池。 对于任何分叉我的存储库的人,我想在Azure提供的生成计算机上运行其生成。

要实现这一目标,我相信使用JobsConditions是正确的方法。 我想定义两个非常相似的作业,每个作业都有一个条件来检查存储库是否为rmetzger/flink

这是我的azure-pipelines.yml文件的相关部分:

jobs:
- job: runOnStrongMachines
  condition: eq(variables['Build.Repository.Name'], 'rmetzger/flink')
  pool:
    name: Default
  steps:
  - ...
- job: runOnAzure
  condition: not(eq(variables['Build.Repository.Name'], 'rmetzger/flink'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - ...

运行此命令,variables['Build.Repository.Name']始终求值为null,因此始终执行第二个作业。

我担心predefined Build.Repository.Name variable的作用域会导致在构建的早期阶段无法访问。

1 个答案:

答案 0 :(得分:1)

  

我担心预定义的Build.Repository.Name变量的作用域为   一种在构建的早期阶段无法访问的方式。

是的,正确。 Build.Repository.Name不能在构建的早期阶段使用。而且,“构建的早期阶段”确切地表示职位水平。实际上,您在问题中提到的doc link已经宣布此变量是代理作用域的:

enter image description here

如本文档所述,此预定义变量Build.Repository.Name仅可用于脚本/任务级别。并且在您的脚本中,在Job条件中使用此变量的范围是job级别而不是agent级别。这就是为什么您收到null的原因。

解决方法是,可以使用此变量step/task在每个Build.Repository.Name中设置条件。或者,为方便起见,在工作开始时添加一个步骤,以尽早退出工作。