如何在 circleci 2.0 中逐步启用 nvm?
How to enable nvm in steps in circleci 2.0?
这是我
中的步骤
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
第二步总是失败并显示此错误消息
/bin/bash: npm: command not found
我检查了 .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
Circleci 2.0 通过启动新的 shell 和 #!/bin/bash -eo pipefail
来调用步骤命令
如果我启动一个 docker (docker run -i -t buildpack-deps:xenial
) 并应用第一步,然后通过 #!/bin/bash -eo pipefail
启动一个新的 shell,我可以看到 npm
在路径
上可用
我正在为这个项目使用 docker
version: 2
jobs:
test_main:
docker:
- image: buildpack-deps:xenial
那么为什么在circleci 2.0环境下会失败呢?我如何确保 npm
可用于第 1 步的第 2 步?
我尝试将[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"
添加到~/.bash_profile
(以防.bashrc
由于non-interactive/non-login shell而未执行)
要重现该问题,您可以 运行 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
您将看到以下错误消息:
====>> npm install
#!/bin/bash -eo pipefail
npm install
/bin/bash: npm: command not found
Error: Exited with code 127
Step failed
Task failed
问题在于这些行:
# Enable nvm in following steps
echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile
我希望从 .bash_profile
获取 .bashrc
。但是由于circleci的shell是non-interactive,所以环境变量PS1
是空的。因此 .bashrc
基本上在获取后立即退出,因为 .bashrc
中的这一行
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
我必须将以下行直接放在 $BASH_ENV
指定的文件中
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
在每一步的开头 source /opt/circleci/.nvm/nvm.sh
。
我发现通过 nvm 更改默认节点对我的步骤不起作用。
解决者:
- run:
name: 'Install Project Node'
command: |
set +x
source ~/.bashrc
nvm install 12
NODE_DIR=$(dirname $(which node))
echo "export PATH=$NODE_DIR:$PATH" >> $BASH_ENV
这是我
中的步骤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
第二步总是失败并显示此错误消息
/bin/bash: npm: command not found
我检查了 .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
Circleci 2.0 通过启动新的 shell 和 #!/bin/bash -eo pipefail
如果我启动一个 docker (docker run -i -t buildpack-deps:xenial
) 并应用第一步,然后通过 #!/bin/bash -eo pipefail
启动一个新的 shell,我可以看到 npm
在路径
我正在为这个项目使用 docker
version: 2
jobs:
test_main:
docker:
- image: buildpack-deps:xenial
那么为什么在circleci 2.0环境下会失败呢?我如何确保 npm
可用于第 1 步的第 2 步?
我尝试将[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"
添加到~/.bash_profile
(以防.bashrc
由于non-interactive/non-login shell而未执行)
要重现该问题,您可以 运行 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
您将看到以下错误消息:
====>> npm install
#!/bin/bash -eo pipefail
npm install
/bin/bash: npm: command not found
Error: Exited with code 127
Step failed
Task failed
问题在于这些行:
# Enable nvm in following steps
echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile
我希望从 .bash_profile
获取 .bashrc
。但是由于circleci的shell是non-interactive,所以环境变量PS1
是空的。因此 .bashrc
基本上在获取后立即退出,因为 .bashrc
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
我必须将以下行直接放在 $BASH_ENV
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
在每一步的开头 source /opt/circleci/.nvm/nvm.sh
。
我发现通过 nvm 更改默认节点对我的步骤不起作用。
解决者:
- run:
name: 'Install Project Node'
command: |
set +x
source ~/.bashrc
nvm install 12
NODE_DIR=$(dirname $(which node))
echo "export PATH=$NODE_DIR:$PATH" >> $BASH_ENV