Azure DevOps私有代理-如何使用nvm

时间:2019-03-06 04:59:43

标签: ubuntu azure-devops nvm

我正在尝试在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 -vnpm -v。但是,从管道执行npm任务时-失败,显示

  

无法找到可执行文件:“ npm”。请验证文件路径是否存在,或者可以在PATH环境变量指定的目录中找到该文件。还要检查文件模式以验证文件是否可执行。

在我的PATH中,有/usr/local/nvm/versions/node/v11.10.1/binls -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?

3 个答案:

答案 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版本。

[1] Logging Commands PrependPath

答案 2 :(得分:0)

只是nvm

我根据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