如何在Azure DevOps YAML管道中使用单个代理执行多个作业/阶段

10
我正在使用Azure DevOps的YAML管道,不确定是否可以在整个管道中使用单个代理。 我有多个任务/阶段-构建、部署、后部署,并希望将其分配给单个代理,因为它正在消耗相同的工件。 是否有一种方法可以通过管道分配单个代理。
提前感谢。

你是在谈论针对每个单独阶段使用相同的代理,相同的池,还是在给定阶段中所有作业都使用相同的代理? - DreadedFrost
是的,我在谈论在多个阶段/作业中使用相同代理。 - Abhishek Anvekar
@Abhishek Anvekar,我没有收到你的最新信息,这个解决方法对你有帮助吗?或者如果你有任何疑虑,请在这里分享。 - Hugh Lin
5个回答

7

是的,有一种方法,你需要做的就是将第一份工作的代理名称存储在一个变量中,然后对于任何其他工作,你需要要求相同的代理。操作如下:

 jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=AgentName;isoutput=true]$(Agent.Name)"
    name: passOutput
- job: B
  dependsOn: A
  variables:
    AgentName: $[ dependencies.A.outputs['passOutput.AgentName'] ]  
  pool:
    name: pool1
    demands: Agent.Name -equals $(AgentName)   
  steps:
  - bash: |
     echo $(AgentName)

这似乎有效。唯一的问题是,如果其他工作插队,你必须排队等待特定的代理。 - CodeMonkey
上述方案对于这种情况很好,但是如果作业B需要无论如何运行,那么这种方法就不适用了,因为ADO将会抛出一个错误,说变量中存储的Agent.Name为空时无法运行作业B。如果作业A中有多个步骤,在加载变量之前出现故障,则可能会发生这种情况。这将阻止作业B的运行。 - Ajay Meda
有没有谁熟练掌握Azure的GUI,可以让这个实现?我使用自托管代理,并且我的代码库在SVN中,所以我不能使用YAML(微软加油!!爱你们)。我正在努力弄清楚哪些GUI字段会导致上述问题。 - David Elgstuen
有人知道如何使用PowerShell而不是Bash获取代理名称吗?我的所有代理都是Windows机器。 - undefined

6

我不希望代理在每次新任务时都执行检出操作。

使用checkout关键字来配置或禁止此行为。

steps:
- checkout: none

您可以参考这份官方文档了解详情:文档链接

RTFQ OP 不想破坏流程,他们想使获取操作变得不必要 - undefined

4

1
谢谢您的回复,我的问题有点不同,我不想让代理每次都进行结帐操作以获取新作业。就像我的第一个作业生成工件,第二个作业应自动在代理文件夹中拥有该工件。 - Abhishek Anvekar
1
这是YML文件: trigger:
  • Master
pool: vmImage: Windows-2019stages:
  • stage: Build displayName: "构建" jobs:
    • job: BuilddisplayName: 构建 steps:
      • task: PowerShell@2 inputs: targetType: 'inline' script: Write-Host "这是构建工作"
    • job: Deploy displayName: 部署 steps:
      • task: CmdLine@2 inputs: script: echo 这是部署工作
- Abhishek Anvekar

4

快速回答。仅在同一代理上按顺序使用步骤

如果使用MS托管代理(例如windows-2022),根据我的经验,流水线会为每个阶段和作业启动一个新代理,因此在这种情况下获取相同代理似乎是“不可能的”。我可能错了。

或者,您可以跨阶段使用构件并保持并行选项开启。

在构建阶段/作业结束时:

如果需要的话,将文件复制到artifactstagingdirectory中。
- task: CopyFiles@2
  inputs:
    Contents: '**'
    TargetFolder: '$(build.artifactstagingdirectory)'

添加一个“保存”构建结果的发布工件。
- publish: '$(Build.ArtifactStagingDirectory)'
  name: CheckoutAndBuildToPipelineArtifact
  displayName: 'Publish CheckoutAndBuildToPipelineArtifact'
  artifact: drop 

在下一个阶段/作业(部署)开始时:

您将从构建中下载工件结果。

steps:
- checkout: none # Don´t check out repository. Might be redundant
- download: current # The artifact created in the current pipeline
  artifact: CheckoutAndBuildToPipelineArtifact

0
如果您无法像@Savio Moreira建议的那样使用特定代理,则我发现唯一的选择是复制一些步骤。
在我的情况下,有2个类似的流水线阶段:
构建(用于验证PR) Visual Studio构建 Visual Studio测试 VS测试
发布(将合并到主分支后发布工件) Visual Studio构建 复制文件 发布构建工件
构建部分仅在使用YAML Stage和启用分支策略创建PR时触发条件。发布部分仅在合并到主分支时触发。
有些步骤需要复制,但执行是唯一的,并且使用相同的流水线,可以在合并之前执行验证,然后在代码合并到主分支后创建工件。
检出选项对我没有帮助,因为在我的情况下,每个阶段都在完全不同的容器上执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接