【问题标题】:Gitlab-ci.yml, SSH and NVM: connect to server via ssh and run nvm useGitlab-ci.yml、SSH 和 NVM:通过 ssh 连接到服务器并运行 nvm 使用
【发布时间】:2020-08-21 06:24:21
【问题描述】:

我有一个使用特定版本节点的 Node 应用程序,因此我使用 nvm 来触发 .npmrc 文件中的正确版本。

该应用程序是使用 Gitlab 部署的。过程很简单:当我从本地推送到 gitlab repo 时,gitlab 会通过 ssh 连接到生产服务器,并在 Gitlab 中拉取最新版本的 repo

image: node:latest

before_script:
  - apt-get update -qq
  - apt-get install -qq git
  - 'which ssh-agent || ( apt-get install -qq openssh-client )'
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$K8S_SECRET_SSH_PRIVATE_KEY" | base64 -d)
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

stages:
  - deploy_production

deploy_production:
  stage: deploy_production
  only:
    - master
  script:
    - ssh myuser@example.com 'export NPM_TOKEN=${NPM_TOKEN} && cd www/myproject && rm -rf node_modules dist/* && git pull && export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" --no-use && eval "[ -f .nvmrc ] && nvm install || nvm install stable" && nvm use --delete-prefix && npm ci && npm run prod'
    - ssh myuser@example.com "cd www/myproject && nvm use --delete-prefix"

问题出在最后一个脚本中。我收到了这样的回复:

Webpack Bundle Analyzer saved report to /usr/home/myuser/www/myproject/dist/client-report.html
$ ssh myuser@example.com "cd www/myproject && nvm use --delete-prefix"
bash: nvm: command not found
ERROR: Job failed: exit code 1

如果我直接从本地终端进入部署服务器并询问 NVM_DIR 变量,我可以按预期得到它:

ssh myuser@example.com
cd www/myproject
echo $NVM_DIR
$~/home/myuser/.nvm

但是,如果我使用相同的操作将脚本添加到我的 gitlab-ci.yml:

image: node:latest

before_script:
  - apt-get update -qq
  - apt-get install -qq git
  - 'which ssh-agent || ( apt-get install -qq openssh-client )'
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$K8S_SECRET_SSH_PRIVATE_KEY" | base64 -d)
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

stages:
  - deploy_production

deploy_production:
  stage: deploy_production
  only:
    - master
  script:
    - ssh myuser@example.com 'export NPM_TOKEN=${NPM_TOKEN} && cd www/myproject && rm -rf node_modules dist/* && git pull && export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" --no-use && eval "[ -f .nvmrc ] && nvm install || nvm install stable" && nvm use --delete-prefix && npm ci && npm run prod'
    - ssh myuser@example.com "cd www/myproject && echo $NVM_DIR"
    - ssh myuser@example.com "cd www/myproject && nvm use --delete-prefix"

结果为空

[…]
Webpack Bundle Analyzer saved report to /usr/home/myuser/www/myproject/dist/client-report.html
$ ssh myuser@example.com "cd www/myproject && echo $NVM_DIR"

$ ssh myuser@example.com "cd www/myproject && nvm use --delete-prefix"
bash: nvm: command not found
ERROR: Job failed: exit code 1

如何通过 gitlab-ci.yml 中的 ssh 在example.com 中触发 NVM?

【问题讨论】:

    标签: node.js ssh gitlab nvm


    【解决方案1】:

    当您登录时,您的环境(特别是变量 NVM_PATH 以及导致“bash: nvm: command not found”的变量 PATH 本身)与使用 SSH 命令执行命令时不同。你可以这样检查:

    ssh myuser@example.com
    env
    # vs:
    ssh myuser@example.com env
    

    第一个将执行(取决于您使用的 shell 和操作系统)在交互式登录后执行的文件(例如 .bashrc),第二个(通常)不会执行。 NVM 添加的内容摘录:

    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    

    第一个定义您缺少的变量,第二个执行一个脚本,除其他外,更改您的PATH,以便可以找到nvm 可执行文件。

    您可以在调用nvm use 之前将execute this file manually 或添加the snippet that NVM adds 到您的CI 管道中。

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2020-05-12
      • 2021-08-28
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多