无法在Azure DevOps管道中激活conda



在conda 构建的python项目上测试azure devops管道

jobs:
- job: pre_build_setup
displayName: Pre Build Setup
pool:
vmImage: 'ubuntu-18.04'
steps:
- bash: echo "##vso[task.prependpath]$CONDA/bin"
displayName: Add conda to PATH
- job: build_environment
displayName: Build Environment
dependsOn: pre_build_setup
steps:
- script: conda env create --file environment.yml --name build_env
displayName: Create Anaconda environment
- script: conda env list
displayName:  environment installation verification
- job: unit_tests
displayName: Unit Tests
dependsOn: build_environment
strategy:
maxParallel: 2
steps:
- bash: conda activate build_env

最后一步- bash: conda activate build_env在我身上失败,出现以下错误

Script contents:
conda activate build_env
========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/d5af1b5c-9135-4984-ab16-72b82c91c329.sh
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.

##[error]Bash exited with code '1'.
Finishing: Bash

如何激活conda?路径似乎是错误的,因此无法找到conda。

CommandNotFoundError:您的shell未正确配置为使用"conda-activate"。

这里的问题是您的脚本在子shell中运行,但conda尚未在此子shell中初始化。

您需要将活动脚本更改为:

steps:
- task: Bash@3
inputs:
targetType: 'inline'
script: |
eval "$(conda shell.bash hook)"
conda activate build_env
displayName: Active

此外,请不要将Add PATHcreate environmentactive the environment拆分为不同的作业。

对于Azure devops管道,agent job是管道运行过程的基本单元,每个代理作业都有自己独立的运行环境和工作逻辑。

有关详细信息,您使用托管代理在该问题场景中应用脚本。

当有一个代理作业开始运行时,我们的池系统将为该代理作业分配一个VM。并且,一旦代理作业完成,此VM将被回收。当下一个代理作业开始运行时,将随机重新分配一个全新的VM。

dependsOn只能在作业之间共享文件和传递变量。它无法在下一个作业中继续VM。

我相信你应该能够猜测你将要遇到什么问题。是的,即使您能够成功应用activate脚本,您也将继续面对另一个error: Could not find conda environment: build_env。这是因为此activate脚本使用的环境是一个全新的vm,前一个build_environment作业使用的vm已被系统回收。

因此,不要将创建环境拆分为两个代理作业:

- job: build_environment
displayName: Build Environment
dependsOn: pre_build_setup
steps:
- script: conda env create --file environment.yml --name build_env
displayName: Create Anaconda environment
- script: conda env list
displayName:  environment installation verification
- task: Bash@3
inputs:
targetType: 'inline'
script: |
eval "$(conda shell.bash hook)"
conda activate build_env
displayName: Active

微软提出了另一种方法,它似乎更健壮。

在您希望激活环境的每一步中,都应该运行

source $CONDA/bin/activate <myEnv>

或者只是

source activate <myEnv>

如果您已经将$CONDA/bin添加到PATH变量中。您可以查看上面的链接来查找Ubuntu、macOS和Windows的示例。

在您的情况下,它看起来如下:

steps:
- task: Bash@3
inputs:
targetType: 'inline'
script: source activate build_env
displayName: Active

重要提示:目前,如果将环境名称传递给activate脚本,则必须在同一作业中创建环境。但是,如果您使用前缀(即环境目录的路径(,这并不重要。

最新更新