Azure devops 在Azure DevOps中并行运行的多个构建之间锁定资源

Azure devops 在Azure DevOps中并行运行的多个构建之间锁定资源,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,假设我有一个构建: Job1: Task1: Build Job2: dependsOn: Job1 Task2: Test 测试任务使用某种数据库或另一种独特的资源 我想知道,当多个构建并行运行时,是否有可能锁定Job2以运行unique,而不让其他构建尝试访问相同的资源 我正在使用cmake和ctest,因此我知道我可以在单独的单元测试之间执行类似的操作,但我确信我将无法在多个ctest过程之间锁定该资源。同意@MarTin的解决方法。在Job1中为powershell任务

假设我有一个构建:

Job1:
    Task1: Build
Job2:
dependsOn: Job1
    Task2: Test
测试任务使用某种数据库或另一种独特的资源

我想知道,当多个构建并行运行时,是否有可能锁定Job2以运行unique,而不让其他构建尝试访问相同的资源


我正在使用cmake和ctest,因此我知道我可以在单独的单元测试之间执行类似的操作,但我确信我将无法在多个ctest过程之间锁定该资源。

同意@MarTin的解决方法。在
Job1
中为powershell任务设置一个变量,然后获取此变量并在
Job2
的作业条件中使用它

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

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

##vso[task.setvariable variable=firstVar;isOutput=true]Job2 Need skip
然后从Job2中的Job1获取输出变量:

Job2Var: $[dependencies.Job1.outputs['outputVars.firstVar']]
然后,在job2中,您可以将其用于:

完成的简单示例脚本如下所示:

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']
满足预定义的预期值,跳过当前作业2。

同意@MarTin的解决方法。在
Job1
中使用powershell任务设置一个变量,然后获取此变量并在作业条件下使用
Job2

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

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

##vso[task.setvariable variable=firstVar;isOutput=true]Job2 Need skip
然后从Job2中的Job1获取输出变量:

Job2Var: $[dependencies.Job1.outputs['outputVars.firstVar']]
然后,在job2中,您可以将其用于:

完成的简单示例脚本如下所示:

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']
满足预定义的预期值,跳过当前作业2。

您可以设置全局变量,而
Job2
中的第一个
任务
是一个PowerShell SKcript,它轮询此全局变量并阻止作业,直到其达到预期值?这些全局变量是否在两个不同的版本之间可用?它不仅仅是在jobs/tasks.over REST API中,您可以为完整的Azure DevOps范围(,)定义全局变量有趣的解决方法,感谢您的提示。我将尝试看看是否可以使用类似的方法。您可以设置全局变量,而
Job2
中的第一个
任务是一个PowerShell SKcript,它轮询此全局变量并阻止作业,直到其达到预期值。这些全局变量在两个dif之间可用吗不同版本?它不仅在作业/任务中。通过REST API,您可以为整个Azure DevOps范围定义全局变量(,,)有趣的解决方法,谢谢你的提示。我会尝试看看我是否可以这样做。我相信只有在我的yaml设置了一个Job1和一个Job2时,输出变量才会起作用,但是如果两个Job1同时运行呢。那么我相信最好改为设置全局变量,对吗?@Marnix,如果我理解cor的话你的意思是,当Job1并行运行时,输出变量集是否工作?只是想确认,依赖于Job1的job2现在是否存在?让我们只使用一个简单的Job1,并且有两台计算机同时运行它。它们有可能需要锁定资源。@Marnix好的。如果这样,输出变量将工作ess.因为输出变量只存在于具有依赖关系的作业之间。如果实际情况与您所描述的问题相同,则只有这样,输出变量才能起作用。我相信,只有在我的yaml设置为Job1和Job2时,输出变量才会起作用,但如果两个Job1同时运行该怎么办我认为最好是设置全局变量,对吗?@Marnix如果我理解正确,你的意思是当Job1并行运行时,输出变量集是否工作?只是想确认,依赖于Job1的job2现在是否存在?让我们只使用一个简单的Job1,并且您有两台机器同时运行它。有一个nce表示他们需要锁定资源。@Marnix好的。如果这样,输出变量将不工作。因为输出变量只存在于具有依赖关系的作业之间。如果实际情况与您描述的问题相同,则只有这样,输出变量才能工作。