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好的。如果这样,输出变量将不工作。因为输出变量只存在于具有依赖关系的作业之间。如果实际情况与您描述的问题相同,则只有这样,输出变量才能工作。