我正在尝试在Ubuntu上为Azure DevOps设置私有构建代理。而且我需要使用npm任务进行构建。
我尝试使用nvm安装最新的节点,并且安装成功:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
nvm install 11.10.1
我可以检查node -v
和npm -v
。但是,从管道执行npm任务时-失败,显示
无法找到可执行文件:“ npm”。请验证文件路径是否存在,或者可以在PATH环境变量指定的目录中找到该文件。还要检查文件模式以验证文件是否可执行。
在我的PATH中,有/usr/local/nvm/versions/node/v11.10.1/bin
和ls -l
显示:
lrwxrwxrwx 1500 500 38 Feb 28 06:00 /usr/local/nvm/versions/node/v11.10.1/bin/npm-> ../ lib / node_modules / npm / bin / npm-cli.js < / p>
我还为npm-cli.js添加了777(仅供尝试!),仍然没有运气。
我也发现了类似的问题-https://github.com/Microsoft/azure-pipelines-agent/issues/1862
如何在适用于Azure DevOps的Ubuntu代理上使用nvm正确安装节点和npm?
答案 0 :(得分:0)
作为一个临时解决方案,我在其中安装了节点
curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
sudo apt-get install nodejs
代替nvm,它可以正常工作。
答案 1 :(得分:0)
要使其正常工作,我最终创建了一个代理nvm的bash脚本,然后告诉代理将PATH变量更新为当前NVM。
在/usr/local/bin/nvm
创建一个包含以下内容的文件:
#!/usr/bin/env bash
# Store the current path so we can check to see if it changes
OLD_PATH=$PATH
# Normal NVM stuff
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
# Execute NVM and pass all the arguments
nvm $@
# Check to see if the path has changed, and if an azure agent is running the
# command by checking the existence of the $AGENT_VERSION variable.
if [[ "$OLD_PATH" != "$PATH" && ! -z ${AGENT_VERSION+x} ]]; then
# Grab the current node executable Something like:
# /Users/digitaldev/.nvm/versions/node/v10.16.3/bin
CURRENT_NODE=$(nvm which current)
# Resolve to directory of the node executable Something like
# /Users/digitaldev/.nvm/versions/node/v10.16.3
BIN_DIR=$(dirname "$CURRENT_NODE")
# Tell Azure Pipeline to update the PATH [1]
echo "##vso[task.prependpath]$BIN_DIR"
fi
使文件可执行:
chmod +x /usr/local/bin/nvm
现在,当Azure管道运行nvm
时,它将更新路径以查找节点的nvm版本。
答案 2 :(得分:0)
我根据nvm.sh的指令创建了一个类似的模板,并相应地设置了NVM_DIR和PATH。
steps:
- bash: |
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install
nvm use
echo "##vso[task.setvariable variable=NVM_DIR;]$NVM_DIR"
echo "##vso[task.setvariable variable=PATH;]$PATH"
displayName: "Install Node.js"
我还添加了nvm.sh中记录的.nvmrc
,以便指定要使用的节点版本。
然后按如下所示在管道中使用它
steps:
- template: templates/install-node-js.yml
- bash: |
node --version
这是我的模板,用于安装节点以及对package-lock.json
中的软件包进行缓存。
steps:
- task: Cache@2
inputs:
key: 'nvm | "$(Agent.OS)" | .nvmrc'
path: $(Pipeline.Workspace)/.nvm
displayName: "Cache NVM"
- task: Cache@2
inputs:
key: 'npm | "$(Agent.OS)" | package-lock.json'
path: $(Build.SourcesDirectory)/node_modules
displayName: "Cache node dependencies"
- bash: |
set -e
if [ $(System.Debug) ]
then
set -x
fi
if [ ! -s $NVM_DIR/nvm.sh ]
then
mkdir -p $NVM_DIR
curl -so- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
fi
. $NVM_DIR/nvm.sh || true
nvm install
nvm use
npm ci
echo "##vso[task.setvariable variable=PATH;]$PATH"
env:
NVM_DIR: $(Pipeline.Workspace)/.nvm
displayName: Install Node and dependencies