使用 Anaconda 环境运行管道

Azure DevOps Services

在工作流中设置并使用 Anaconda 和 Python。 Anaconda 是用于数据科学和机器学习的 Python 发行版。

先决条件

Python 预安装在 适用于 Linux、macOS 和 Windows 的 Microsoft 托管代理 上。 无需设置更多内容即可生成 Python 项目。 若要查看预安装的 Python 版本,请参阅 软件

产品 要求
Azure DevOps - Azure DevOps 项目
- 能够在 Microsoft 托管的代理上运行管道。 可以购买 并行作业 ,也可以请求免费层。
- 对 YAML 和 Azure Pipelines 的基本知识。 有关详细信息,请参阅 创建第一个管道
- 权限:
     - 若要创建管道:必须位于 “参与者 ”组中,并且该组需要将 “创建生成管道 ”权限设置为“允许”。 项目管理员组的成员可以管理管道。
    - 若要创建服务连接:必须具有服务连接的管理员创建者角色。
GitHub - GitHub 帐户。
- 用于授权 Azure Pipelines 的 GitHub 服务连接

开始

按照这些说明为具有 Anaconda 环境的示例 Python 应用设置管道。

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 在项目中,导航到“Pipelines”页面 。 然后选择“操作”以创建新的管道。

  3. 首先选择“GitHub”作为源代码位置,完成向导的各个步骤 。

  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  5. 显示存储库列表时,请选择你的 Anaconda 示例存储库。

  6. Azure Pipelines 分析存储库中的代码,并检测现有 azure-pipelines.yml 文件。

  7. 选择“运行”。

  8. 开始新运行。 请等待运行完成。

提示

若要更改本文中所述的 YAML 文件,请在“管道”页中选择管道,然后编辑azure-pipelines.yml该文件。

将 conda 添加到系统路径

托管代理上,conda 默认不包含在 PATH 内,以防止其 Python 版本与其他已安装版本冲突。 使用task.prependpath代理命令,使 conda 在所有后续步骤中可用。

- bash: echo "##vso[task.prependpath]$CONDA/bin"
  displayName: Add conda to PATH

创建环境

从命令行参数

conda create 命令使用传递的参数创建环境。

- bash: conda create --yes --quiet --name myEnvironment
  displayName: Create Anaconda environment

从 YAML

可以将 environment.yml 文件签入定义 Anaconda 环境配置的存储库。

- script: conda env create --quiet --file environment.yml
  displayName: Create Anaconda environment

注意

如果使用自承载代理,但最终不会删除环境,则下次生成时会收到错误,因为环境已存在。 若要解决此问题,请先删除环境,然后再使用“conda env remove --name your-env-name”创建新环境。

注意

如果使用自承载代理来共享存储和使用同一 Anaconda 环境并行运行作业,则这些环境之间可能存在冲突。 若要解决此问题,请使用 --name 参数和唯一标识符作为参数值,例如与 $(Build.BuildNumber) 生成变量的串联。

从 Anaconda 安装包

以下 YAML 在名为 scipy 的 conda 环境中安装 myEnvironment 包。

- bash: |
    conda activate myEnvironment
    conda install --yes --quiet --name myEnvironment scipy
  displayName: Install Anaconda packages

在 Anaconda 环境中运行管道步骤

注意

每个生成步骤都在自己的进程中运行。 激活 Anaconda 环境时,它会编辑 PATH 并对其当前进程进行其他更改。 因此,为每个步骤单独激活 Anaconda 环境。

- bash: |
    conda activate myEnvironment
    python -m pytest --junitxml=junit/unit-test.xml
  displayName: pytest

- task: PublishTestResults@2
  inputs:
    testResultsFiles: 'junit/*.xml'
  condition: succeededOrFailed()

FAQ

为什么我收到“权限被拒绝”错误?

在托管的 macOS 上,代理用户不拥有安装 Miniconda 的目录。 若要解决此问题,请转到“ 将 conda 添加到系统路径”下的“托管 macOS”选项卡。

为什么我的生成在 conda createconda install 步骤上停止响应?

如果未通过 --yes,conda 将停止并等待用户输入。

为什么 Windows 上的脚本在激活环境后停止?

在 Windows 上,activate 是 Batch 脚本。 激活后,你必须使用 call 命令才能继续运行脚本。 请参阅在管道中使用call的示例。

如何使用多个版本的 Python 运行测试?

转到 在 Azure Pipelines 中生成 Python 应用