python - 具有干净 Python 环境的 Azure Devops Pipelines
问题描述
我有一个 Azure Devops CI 构建设置来在我的 Python 代码库上运行一组测试。管道使用我办公桌上的本地 PC 运行,我已将其添加到构建池中。我在构建代理的文件夹中安装了 Python 3.6,_work\_tool
并使用以下任务启动管道 .yaml 文件:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.6'
它抓取 Python 3.6 并将其用于后续步骤中的所有“python”命令。
这一切都很好,但是为了运行我的测试,我的 python 存储库中的包必须安装在 python 环境中。我通过调用一个自定义脚本来一一手动安装包(本质上调用python setup.py install
每个包,这也会引入外部依赖项)。问题是我不相信这每次都会将包安装到一个干净的环境中,因此 python 安装最终可能会使用以前构建作业中的包。
有没有办法确保每次管道运行时,构建代理都为其使用完全干净的 Python 虚拟环境?
解决方案
在 yaml 中,当您在自托管代理上运行管道时,默认情况下,不会在两次连续运行之间清理任何子目录。因此,您可以进行增量构建和部署,前提是实施任务以利用它。workspace
您可以使用作业上的设置覆盖此行为。有关详细信息,请参阅本文档。
- job: myJob
workspace:
clean: outputs | resources | all # what to clean up before the job runs
outputs
Build.BinariesDirectory
:在运行新作业之前删除。resources
Build.SourcesDirectory
:在运行新作业之前删除。all
Pipeline.Workspace
:在运行新作业之前删除整个目录。
注意:无论这些设置如何,总是在每次构建之前删除和重新创建$(Build.ArtifactStagingDirectory)
。$(Common.TestResultsDirectory)
正如您在问题中所说:“我通过调用一个手动安装软件包的自定义脚本来做到这一点”。如果您的包未安装在工作区目录中,则该clean
选项无法删除这些包。
因此,作为一种解决方法,您可以通过 cmd 或脚本清空安装包的文件夹。例如:
rmdir /s/q path\folderName
mkdir path\folderName
推荐阅读
- java - 为什么 HashSet.contains() 返回错误的结果?
- node.js - 从 Object.values nodejs 将数组转换为字符串
- python - 如何修复“ImportError: cannot import name 'setup' form 'cx_Freeze'”
- php - 选择按天分组的列值总和
- ios - 如何在 Xcode 中支持 iPhone 的多种屏幕尺寸?
- swift - 如何在 Xcode 11 Playground 中使用图像?
- python - 如何将此代码转换为 for 循环格式?
- python - PIP install Wheel 文件有效,但同一软件包的同一版本的 tar 文件无效
- kubernetes - 当部署在一个 pod 中的应用程序调用部署在 minikube 中另一个 pod 中的另一个应用程序时出现问题
- angular - 如何使用 Angular CurrencyPipe 显示以千为单位的货币