azure - 在 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 目录。
一个
解决方案
根据我的测试,这个问题的原因是这两个阶段在不同的代理机器上运行。
例如: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 中的更改。
推荐阅读
- firebase - 在flutter中从firebase中检索特定的用户数据
- wpf - 分配给按钮时,在 Powershell 中播放音乐停止
- hangout - Google Hangout API中的空间名称是什么意思
- reactjs - 如何在 React js 上过滤产品
- vue.js - Api-Plaftom:vuetify 生成器:嵌套实体的问题
- flutter - 在 Freezed 中,是否可以从已经存在的冻结数据类创建联合案例
- c# - WPF:我可以用两种不同的方式显示一个替身吗?
- mongodb - 从对象数组中删除键值时出错
- matlab - Matlab:关闭并行池 - 仅适用于 parfeval() 但不适用于 spmd
- curl - 在合作伙伴中心 API 中过期令牌 401