首页 > 解决方案 > 在 Azure 构建管道中保留对 defaultWorkingDirectory 的更改

问题描述

我有一个类似于以下内容的 YAML 文件:

stages: 
  - stage: A
    pool:
        vmImage: 'windows-2019'  
    jobs:
    - job: a
      steps:
        - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |              
             #edits file "$(System.DefaultWorkingDirectory)/myfolder/myfile.json"

  - stage: B
    dependsOn: A
    pool:
        vmImage: 'windows-2019'  
    jobs:
      - job: b
        steps:
        - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |              
             #uses file "$(System.DefaultWorkingDirectory)/myfolder/myfile.json"

我将管道分为两个阶段;A:编辑存储库中的文件,B:使用编辑后的文件。

我的问题是,文件似乎在阶段之间重置。有没有办法在整个阶段保持更改,而不是重置它们?

我不想在阶段 b 中发布工件等,尽管不在上面的 YAML 中,但我正在运行多个包含硬编码文件路径的 PowerShell 脚本文件,覆盖文件路径指向运行阶段之前的 artifacts 目录。

一个

标签: azureazure-devopsyamlazure-pipelines

解决方案


根据我的测试,这个问题的原因是这两个阶段在不同的代理机器上运行。

例如:Stage A -> Agent machine name: 'fv-az146' , Stage B -> Agent machine name: 'fv-az151'

您可以在Build log -> Initialize job中查看代理信息。

初始化作业

有没有办法在整个阶段保持更改,而不是重置它们?

由于您不想发布工件,您可以尝试使用自托管代理来运行两个阶段。

您需要向代理添加需求,以确保各个阶段在同一个自托管代理上运行。

根据这个文档

专用池支持需求关键字。

我们无法在 Microsoft 托管的代理中指定特定的“代理功能”。所以我们不能确保两个阶段可以在同一个代理上运行

更新:

由于这两个阶段在同一个代理上运行,因此阶段 B 中的“签出”步骤可能会覆盖阶段 A 中的文件。

所以你还需要- checkout: none在Stage B中添加。

这是更新的 Yaml 模板:

stages:      
 - stage: A
    pool:
     name: Pool name
     demands:
     - Agent.Name -equals agentname1
    jobs:
    - job: a
      steps:
        - task: PowerShell@2
          ...

  - stage: B
    dependsOn: A
    pool:
     name: Pool name
     demands:
     - Agent.Name -equals agentname1
    jobs:
      - job: b
        steps:
        - checkout: none
        - task: PowerShell@2
        ...

整体工作流程: Stage A 编辑文件并保存到 $(System.DefaultWorkingDirectory)。

然后Stage B 可以直接使用$(System.DefaultWorkingDirectory) 中的文件。

$(System.DefaultWorkingDirectory) 中的文件将保留阶段 A 和 B 中的更改。


推荐阅读