Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure Devops管道与干净的Python环境_Python_Azure Devops - Fatal编程技术网

Azure Devops管道与干净的Python环境

Azure Devops管道与干净的Python环境,python,azure-devops,Python,Azure Devops,我有一个Azure Devops CI构建,用于在我的Python代码库上运行一组测试。管道使用我桌上的本地PC运行,我已将其添加到构建池中。我将Python 3.6安装在build agent的“工作”工具文件夹中,并启动pipelines.yaml文件,其中包含一个任务: - task: UsePythonVersion@0 inputs: versionSpec: '3.6' 它获取Python3.6,并在后续步骤中将其用于所有Python命令 这一切都很好,但是为了运行我的

我有一个Azure Devops CI构建,用于在我的Python代码库上运行一组测试。管道使用我桌上的本地PC运行,我已将其添加到构建池中。我将Python 3.6安装在build agent的“工作”工具文件夹中,并启动pipelines.yaml文件,其中包含一个任务:

- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.6'
它获取Python3.6,并在后续步骤中将其用于所有Python命令

这一切都很好,但是为了运行我的测试,我的python repo中的包必须安装在python环境中。我通过调用一个自定义脚本来实现这一点,该脚本一个接一个地手动安装软件包,实际上在每个软件包上都调用python setup.py install,这也会引入外部依赖项。问题是,我不相信每次都会将包安装到干净的环境中,因此python安装最终可能会使用以前构建作业中的包


是否有办法确保每次管道运行时,生成代理都使用完全干净的Python虚拟环境?

在yaml中,当您在自托管代理上运行管道时,默认情况下,在两次连续运行之间不会清理任何子目录。因此,您可以进行增量构建和部署,前提是实现任务以利用增量构建和部署。您可以使用作业上的工作空间设置覆盖此行为。有关详细信息,请参阅此

- job: myJob
  workspace:
    clean: outputs | resources | all # what to clean up before the job runs
输出:在运行新作业之前删除Build.BinariesDirectory。 资源:在运行新作业之前删除Build.sources目录。 全部:在运行前删除整个Pipeline.Workspace目录 新工作。 注意:$Build.ArtifactStagingDirectory和$Common.TestResultsDirectory总是在每次生成之前删除并重新创建,而不管这些设置如何


正如您在问题中所说:我通过调用一个自定义脚本来实现这一点,该脚本手动逐个安装包。如果您的软件包未安装在工作区目录中,则clean选项无法删除这些软件包

因此,作为一种解决方法,您可以通过cmd或script清空安装包的文件夹。例如:

rmdir /s/q path\folderName
mkdir path\folderName

使用pip freeze>requirements.txt,然后使用pip install-r requirements.txt?安装过程与其说是个问题,不如说是清理Python环境,首先从不同的版本中删除对包的引用。目前,我的解决方法是为每个构建显式地创建一个新的虚拟环境:python-m venv pipeline_env,然后使用这个新的python在我要构建和测试的每个包上安装源代码中包含的包:pipeline_env\Scripts\python.exe setup.py install。对于每个完成的构建,代理文件系统中都会留下一个虚拟环境。感觉好像必须有一个更干净的方法。@JitterRobin无法获取您的最新信息,解决方法对您有帮助吗?或者,如果你有任何问题,欢迎在这里分享。谢谢你的回答。这些选项中是否有一个清除了构建使用的Python环境的包库?我已经在yaml中设置了clean“all”选项,但不幸的是,这似乎没有帮助。如果您的软件包未安装在工作区目录中,则clean选项无法删除这些软件包。因此,作为一种解决方法,您可以通过cmd或script清空安装包的本地文件夹。请查看我的更新。感谢@Hugh Lin,python包刚刚被安装到解释器的默认站点\u packagea,这就是它们最终被安装到\u tool文件夹的原因。我对虚拟环境的变通方法意味着包将位于工作目录中,并且可以按照您所说的方式进行清理。我想在我看来,使用python作为工具的管道的默认设置应该始终是为我的每个构建创建一个新的python虚拟环境,从而保证一个干净的管道。我认为这是最常见的用例/预期行为,但也许其他人会不同意。@ JITTROBIN如果这个答案对你有帮助,你可以考虑把它标记为答案,只需点击这个选项,这样就可以帮助其他成员获得相同的问题来轻松地找到解决方案。祝您有个美好的一天: