我正在使用自托管代理来运行我的构建和发布管道。
我运行构建后出现问题,并且由于管道中的问题而失败。从远程克隆的分支位于工作目录中。第二次运行也使用相同的工作目录,而不是新的。 我已在代理上验证没有创建新目录。 我还可以在 Azure Pipeline 日志中看到它使用相同的旧目录。
我临时解决这个问题的方法是找到旧的工作目录(例如/home/user/_work/13)并手动将其删除。 然后 Azure 在 _work 下创建一个新文件夹(例如“14”),我可以在该新目录中看到来自远程的最新克隆代码。
如何在出现故障时自动删除工作文件夹(_work下的编号目录)?
注意:我已经在管道末尾放置了清理步骤,这些步骤在管道成功完成时运行。 另外,我正在编写 YAML 管道,而不是 Classic。
如果需要任何信息以便更好地理解,请告诉我。
Azure DevOps - 清理构建目录
“获取源”选项卡上有一个 Clean 选项,可以在运行构建之前对私有代理的工作目录执行不同类型的清理:
我们可以将该值设置为
true
来清理您的私人代理的工作目录。即使构建失败。
您可以查看文档清理代理上的本地仓库了解更多详细信息。
更新:
但是这是针对经典管道的,我们没有任何标签吗 我们仅在 yml 管道中定义
jobs:
- job: string # name of the job (A-Z, a-z, 0-9, and underscore)
...
workspace:
clean: outputs | resources | all # what to clean up before the job runs
查看此文档YAML 架构参考了解一些详细信息。
自从运行预清理作业(
workspace.clean
)或后清理作业some step X
来清理代理workdir
严重依赖于“某些管道”的管道作者来修复潜在的难以检测的“workdir”污染”问题,我们决定重新实现这个想法,保证workdir污染永远不会发生。
我创建了https://github.com/EugenMayer/azure-agent-self-hosted-toolkit,它在代理级别修复了这个项目,不需要对管道进行任何更改,也不需要依赖这些管道。
引用项目想法
The run-once mode is based on Microsoft's `./run.sh --once` which ensures that an agents only runs 1 job and then stops.
This is used to
- cleanup the workdir in a safe manner after each job
- ensures each job on an agent runs in a clean workdir
- starts the agent right after cleanup up (few seconds) to be available for the next job
此存储库还提供了一个工具包来启动/设置 x-agents 并使用 Microsoft 的原始工具维护它们,但封装在方便的脚本中。
如果这对其他人有帮助,很乐意分享。
执行此操作的最简单方法是使用以下配置在管道末尾添加一个步骤:
- task: DeleteFiles@1
condition: always()
inputs:
SourceFolder: "$(Agent.BuildDirectory)"
RemoveDotFiles: true
RemoveSourceFolder: false
Contents: |
a
b
s/**/*
TestResults
该步骤不删除 s 目录,以避免与使用它的进程相关的错误。但它删除了整个内容