Gitlab-ci 脚本中的 Nvm 和 ssh

Emi*_* C. 7 ssh bash node.js gitlab nvm

我有一个通过 Gitlab 部署的应用程序。为了将其部署到生产服务器,我使用了deploy_production. 基本上通过 ssh 进入,删除 node_modules 进行拉取、安装和构建:

\n\n
image: node:latest\n\nbefore_script:\n  - apt-get update -qq\n  - apt-get install -qq git\n  - \'which ssh-agent || ( apt-get install -qq openssh-client )\'\n  - eval $(ssh-agent -s)\n  - ssh-add <(echo "$K8S_SECRET_SSH_PRIVATE_KEY" | base64 -d)\n  - mkdir -p ~/.ssh\n  - \'[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n" > ~/.ssh/config\'\n\nstages:\n  - install\n  - build\n  - deploy_production\n\ncache:\n  paths:\n    - node_modules/\n\ninstall:\n  stage: install\n  script:\n    - npm install\n  artifacts:\n    paths:\n      - node_modules/\n\n\nbuild:\n  stage: build\n  script:\n    - npm build\n\ndeploy_production:\n  stage: deploy_production\n  only:\n    - master\n  script:\n    - ssh example@example.com "export NPM_TOKEN=${NPM_TOKEN} && cd www/myproject && rm -rf node_modules dist/* && git pull && npm ci && npm run prod"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我的问题使用节点11.5,并且在生产服务器中默认有节点8。在该服务器上,我们安装了 nvm 以触发正确的节点版本,但问题是 gitlab-ci 脚本无法访问 nvm。无论我们做什么,都不会起作用。

\n\n

我们尝试过的一些选项 \xe2\x80\x94 没有断线\xe2\x80\x94:

\n\n
- ssh myuser@example.com "cd www/myproject\n&& export NPM_TOKEN=${NPM_TOKEN}\n&& export NVM_DIR=\'$HOME/.nvm\' && . \'$NVM_DIR/nvm.sh\' --no-use\n&& eval \'[ -f .nvmrc ] && nvm install || nvm install stable\'\n&& nvm use --delete-prefix\n&& rm -rf node_modules dist/*\n&& git pull && node -v\n&& npm ci && npm run prod"\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回:

\n\n
Warning: Permanently added \'myserver.com,x.x.x.x\' (ECDSA) to the list of known hosts.\nbash: /nvm.sh: No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者如果我尝试安装 nvm:

\n\n
- ssh myuser@example.com "cd www/myproject\n&& export NPM_TOKEN=${NPM_TOKEN}\n&& wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash\n&& export NVM_DIR=\'$HOME/.nvm\' && . \'$NVM_DIR/nvm.sh\' --no-use\n&& eval \'[ -f .nvmrc ] && nvm install || nvm install stable\'\n&& nvm use --delete-prefix\n&& rm -rf node_modules dist/*\n&& git pull\n&& node -v\n&& npm ci\n&& npm run prod"\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回:

\n\n
=> nvm is already installed in /home/myuser/.nvm, trying to update using git\n=> => Compressing and cleaning up git repository\n=> nvm source string already in /home/myuser/.bashrc\n=> bash_completion source string already in /home/myuser/.bashrc\nnvm is not compatible with the npm config "prefix" option: currently set to "/usr/home/myuser/.nvm/versions/node/v11.5.0"\nRun `npm config delete prefix` or `nvm use --delete-prefix v11.5.0 --silent` to unset it.\n=> Close and reopen your terminal to start using nvm or run the following to use it now:\nexport NVM_DIR="$HOME/.nvm"\n[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh"  # This loads nvm\n[ -s "$NVM_DIR/bash_completion" ] && \\. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion\nbash: /nvm.sh: No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我检查 .bashrc:

\n\n
- ssh myuser@exmple.com "cat .bashrc"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到:

\n\n
[\xe2\x80\xa6] lots of stuff\nexport NVM_DIR="$HOME/.nvm"\n[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh"  # This loads nvm\n[ -s "$NVM_DIR/bash_completion" ] && \\. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我这样做:

\n\n
- ssh myuser@exmple.com "echo $NVM_DIR"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我什么也没得到。

\n\n

所以看起来,即使 gitlab-ci 通过 ssh 进入服务器,也看不到环境变量。如果我试图拯救他们,他们就不会得救。

\n\n

有谁知道如何在 gitlab-ci 脚本中将 nvm 与 ssh 结合使用?

\n

Dan*_*iel 4

就我而言,这些行有效:

variables: # variables for dind
  DOCKER_REGISTRY_DOMAIN: "registry.digitalocean.com"
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""
  DOCKER_DRIVER: overlay2

image: docker:latest

services:
  - docker:dind

task:
  image: archlinux:latest # image on arch in this example
  script:
    - pacman -Sy wget --noconfirm # install wget
    - wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.38.0/install.sh | bash #install nvm
    - export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" --no-use #load nvm
    - eval "[ -f .nvmrc ] && nvm install || nvm install 14" #install node
    - node --version
    - npm --version
Run Code Online (Sandbox Code Playgroud)

您可以在存储库中找到最新版本

https://github.com/nvm-sh/nvm

更多关于“码头工人中的码头工人”

https://docs.gitlab.com/ee/ci/docker/using_docker_build.html