我正在研究 Azure DevOps YAML 管道,我不确定我们是否可以在整个管道中使用单个代理。 我有多个作业/阶段 - 构建、部署、部署后,并且希望将其分配给单个代理,因为它消耗相同的工件。 有没有办法通过管道分配单个代理。
提前致谢。
是的,您可以在 YAML 上定义特定代理。
例如: 水池: 名称:代理池名称 需要: - agent.name -等于 AgentName
https://learn.microsoft.com/en-us/azure/devops/pipelines/process/demands?view=azure-devops&tabs=yaml
是的,有一种方法,您需要做的就是将第一份工作的代理名称存储在变量中,然后对于任何其他工作,您需要请求相同的代理。就这样完成了-
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)
如果您无法使用特定代理,如@Savio Moreira 建议的那样,我发现的唯一选择是重复一些步骤。
在我的例子中,有一个类似的两阶段管道:
仅当使用 YAML 阶段中的条件和启用分支策略创建 PR 时,才会触发构建部分。 Publish 部分只有在合并到 master 时才会触发。
有些步骤需要重复,但执行是唯一的,这有点烦人,并且使用相同的管道,我可以在合并之前执行验证,然后在代码进入主版本后创建工件。
结帐选项没有帮助,因为在我的情况下,每个阶段都在完全不同的容器上执行。
快速回答。仅使用步骤,因为它们在同一代理上按顺序运行。
如果您使用MS托管代理(例如windows-2022),根据我的经验,管道会为每个阶段和作业启动一个新代理,因此在这种情况下获得相同的代理似乎“不可能”。我可能错了。
或者,您可以跨阶段使用工件并保持并行化选项打开。
在构建阶段/工作结束时:
如果需要的话。 将文件复制到artifactstaging目录:
- 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