为什么' exec bash '不能在CI管道中工作?



我已经写了一个github工作流文件。我想在github操作中运行python程序来验证一些更改。我有一个environment.yml文件,其中包含该程序所需的所有conda环境依赖项。问题是,实际的程序根本没有运行,我的工作流已经成功地完成了。

以下是workflow.yml文件

的job部分
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Cache conda
uses: actions/cache@v2
env:
# Increase this value to reset cache if etc/example-environment.yml has not changed
CACHE_NUMBER: 0
with:
path: ~/conda_pkgs_dir
key:
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-${{hashFiles('**/environment.yml') }}
- uses: conda-incubator/setup-miniconda@v2
with:
activate-environment: test-env
environment-file: environment.yml
use-only-tar-bz2: true # IMPORTANT: This needs to be set for caching to work properly!
- name: Test
run: |
export PATH="./:$PATH"
conda init bash
exec bash
conda activate test-env
echo "Conda prefix: $CONDA_PREFIX"
python test.py
shell: bash

我也试着在最后一步中删除shell:bash,但这也给了我相同的结果。最后一步的日志如下所示:

Run export PATH="./:$PATH"
export PATH="./:$PATH"
conda init bash
exec bash
conda activate test-env
echo "Conda prefix: $CONDA_PREFIX"
python test.py
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
pythonLocation: /opt/hostedtoolcache/Python/3.8.11/x64
LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.8.11/x64/lib
CONDA_PKGS_DIR: /home/runner/conda_pkgs_dir
no change     /usr/share/miniconda/condabin/conda
no change     /usr/share/miniconda/bin/conda
no change     /usr/share/miniconda/bin/conda-env
no change     /usr/share/miniconda/bin/activate
no change     /usr/share/miniconda/bin/deactivate
no change     /usr/share/miniconda/etc/profile.d/conda.sh
no change     /usr/share/miniconda/etc/fish/conf.d/conda.fish
no change     /usr/share/miniconda/shell/condabin/Conda.psm1
no change     /usr/share/miniconda/shell/condabin/conda-hook.ps1
no change     /usr/share/miniconda/lib/python3.9/site-packages/xontrib/conda.xsh
no change     /usr/share/miniconda/etc/profile.d/conda.csh
modified      /home/runner/.bashrc
==> For changes to take effect, close and re-open your current shell. <==

我们可以清楚地看到,echo "Conda prefix: $CONDA_PREFIX"行根本没有被执行,并且工作流成功地终止。我们应该期望它运行或使作业失败,但什么也没有发生。工作流只是忽略这些命令,并将工作流标记为成功。

您的CI脚本包含以下行:

exec bash

当执行这一行时,shell进程被一个新的shell进程所取代,并且新的shell进程不知道它应该继续执行前一个进程的脚本:所有的执行状态都丢失了。GitHub Actions将脚本作为命令行参数传递给初始shell进程,并将标准输入设置为/dev/null;由于新的shell进程在标准输入时以空命令行和空文件启动,因此它会立即退出。这在交互式shell中工作得很好,这是一个幸运的巧合。

安装程序指示您重新启动shell的原因是应用添加到shell初始化文件中的环境变量更改。因此,用

替换exec bash行可能就足够了
source "$HOME/.bashrc"

然而,即使有了这一行,环境修改也不会在后续步骤中应用,正如setup-miniconda操作的文档警告的那样:

  • Bash shell不使用~/.profile~/.bashrc,所以这些shell需要在需要正确执行的步骤上显式声明为shell: bash -l {0}已激活(或使用默认shell)。这是因为bash shell被执行了使用bash --noprofile --norc -eo pipefail {0},因此忽略bash上的更新conda init bash生成的profile文件。看到Github动作文档和线程。

基于这个建议,我认为最好的做法是在您放置exec bash的地方结束actions步骤,并将shell:设置应用于所有进一步的步骤(或至少那些实际需要它的步骤):

- name: Set up Conda environment
run: |
export PATH="./:$PATH"
conda init bash
- name: Perform Conda tests
shell: bash -l {0}
run: |
export PATH="./:$PATH"
conda activate test-env
echo "Conda prefix: $CONDA_PREFIX"
python test.py

正如@user3840170提到的,bash shell不使用~/.profile~/.bashrc。然后,使它工作的一种方法是运行conda初始化将运行的内容。在GitHub Actions上,conda安装的路径在变量$CONDA上,因此您可以使用它在需要conda activate的每个步骤上运行初始化。以下代码在GitHub Actions上为我工作(上面提供的代码在我的情况下不起作用)。

- name: Set up Conda environment
run: |
echo "${HOME}/$CONDA/bin" >> $GITHUB_PATH
conda init --all --dry-run
- name: On the steps you want to use
shell: bash
run: |
source $CONDA/etc/profile.d/conda.sh
conda activate test-env

python test.py

相关内容

  • 没有找到相关文章

最新更新