如何在circleci 2.0中启用nvm?

Ant*_*ong 4 npm nvm circleci

这是我在我的步骤

steps:
  -run:
      name: Setup nvm and npm
      command: |
        wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
        export NVM_DIR=$HOME/.nvm
        source $NVM_DIR/nvm.sh
        nvm install 8.9 && nvm alias default 8.9
   -run: npm install && npm run lint && npm test
Run Code Online (Sandbox Code Playgroud)

第二步始终失败并显示此错误消息

/bin/bash: npm: command not found
Run Code Online (Sandbox Code Playgroud)

我检查了 .bashrc,我可以看到以下行被添加到文件的末尾

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
Run Code Online (Sandbox Code Playgroud)

Circleci 2.0通过启动一个新的shell来调用step命令 #!/bin/bash -eo pipefail

如果我启动一个docker(docker run -i -t buildpack-deps:xenial)并应用第一步,然后启动一个新的shell #!/bin/bash -eo pipefail,我可以npm在路径上看到

我正在使用docker来完成这个项目

version: 2
jobs:
  test_main:
    docker:
      - image: buildpack-deps:xenial
Run Code Online (Sandbox Code Playgroud)

那么为什么它在circleci 2.0环境中失败了呢?如何确保npm步骤2中的步骤2可用?

我尝试添加[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"~/.bash_profile(如果.bashrc不是由于非交互式/非登录壳执行)

要重现此问题,您可以circleci build使用此.circleci/config.yml文件运行

version: 2
jobs:
  build:
    docker:
      - image: buildpack-deps:xenial
    steps:
      - run:
          name: Setup nvm and npm
          command: |
            wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
            # Activate nvm
            export NVM_DIR=$HOME/.nvm
            touch $HOME/.nvmrc
            source $NVM_DIR/nvm.sh
            # Use node 8.9
            nvm install 8.9 && nvm alias default 8.9
            echo 8.9 > $HOME/.nvmrc
            # Enable nvm in following steps
            echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile
            # To fix npm install : "node-pre-gyp: Permission denied"
            npm config set user 0
            npm config set unsafe-perm true
            npm install -g npx webpack webpack-cli jest
            node --version
            npm --version
      - run: npm install
Run Code Online (Sandbox Code Playgroud)

您将看到以下错误消息:

====>> npm install
  #!/bin/bash -eo pipefail
npm install
/bin/bash: npm: command not found
Error: Exited with code 127
Step failed
Task failed
Run Code Online (Sandbox Code Playgroud)

Ant*_*ong 7

问题在于以下几点:

        # Enable nvm in following steps
        echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile
Run Code Online (Sandbox Code Playgroud)

我希望从中.bashrc获取.bash_profile.但是,由于circleci的shell是非交互式的,因此环境变量PS1是空白的.因此,.bashrc一旦它被采购,基本上就会立即退出,因为这一行.bashrc

# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)

我必须将以下行直接放在指定的文件中 $BASH_ENV

echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
Run Code Online (Sandbox Code Playgroud)