锁定在Azure DevOps中并行运行的多个版本之间的资源

时间:2019-10-14 08:23:42

标签: azure-devops azure-pipelines

假设我有一个版本:

Job1:
    Task1: Build
Job2:
dependsOn: Job1
    Task2: Test

测试任务使用某种数据库或其他唯一资源。

我想知道是否有可能,当多个构建并行运行时,锁定Job2以使其唯一运行,而无需其他构建尝试访问同一资源。

我正在使用cmake和ctest,所以我知道我可以使用RESOURCE_LOCK在单独的单元测试之间做类似的事情,但是我确定我将无法在多个ctest进程之间锁定该资源。

1 个答案:

答案 0 :(得分:0)

同意@Martin的工作。在Job1中使用powershell任务设置一个变量,然后获取此变量并将其用于Job2的工作条件中。

您不需要使用API​​添加全局变量。还有另一种更简单的方法可以尝试:Output variables。我们扩展了一项功能,客户可以配置一个输出变量并在取决于第一个作业的下一个作业中访问此输出变量。

Job1中设置输出变量的示例:

##vso[task.setvariable variable=firstVar;isOutput=true]Job2 Need skip

然后从Job2中的Job1获取输出变量:

Job2Var: $[dependencies.Job1.outputs['outputVars.firstVar']]

然后,在job2中,您可以将其用于job condition

condition: eq(dependencies.Job1.outputs['outputVars.firstVar'], 'Job2 Need skip')

完整的简单示例脚本如下:

jobs:
- job: Job1
  steps:
  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: 'echo "##vso[task.setvariable variable=firstVar;isOutput=true]Need skip Job2"'
    name: outputVars
- job: Job2
  dependsOn: Job1
  variables:
    Job2Var: $[dependencies.Job1.outputs['outputVars.firstVar'], 'Need skip Job2']
  steps:
  ...
  ...

我要表达的逻辑是根据Job1和当前管道执行状态为输出变量动态分配值。一个特定的值表示Job2应该被锁定,这意味着跳过其执行。在Job2的条件表达式中,当获得的值$[dependencies.Job1.outputs['outputVars.firstVar']满足预定义的期望值时,跳过当前Job2。