Nvm в скрипте Gitlab-ci и ssh - PullRequest
2 голосов
/ 06 мая 2020

У меня есть приложение, которое я развертываю через Gitlab. Чтобы развернуть его на производственном сервере, я использую сценарий в deploy_production. В основном введите через s sh, удалите node_modules, выполните извлечение, установку и сборку:

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:
  - install
  - build
  - deploy_production

cache:
  paths:
    - node_modules/

install:
  stage: install
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/


build:
  stage: build
  script:
    - npm build

deploy_production:
  stage: deploy_production
  only:
    - master
  script:
    - ssh example@example.com "export NPM_TOKEN=${NPM_TOKEN} && cd www/myproject && rm -rf node_modules dist/* && git pull && npm ci && npm run prod"

Но моя проблема использует node 11.5, а на производственном сервере по умолчанию есть node 8. На этом сервере мы установили nvm для запуска правильной версии узла, но проблема в том, что сценарий gitlab-ci не может получить доступ к nvm. Что бы мы ни делали, это не сработает.

Некоторые варианты, которые мы пробовали - без структурных линий -:

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

Возвращает:

Warning: Permanently added 'myserver.com,x.x.x.x' (ECDSA) to the list of known hosts.
bash: /nvm.sh: No such file or directory

Или если я попробуйте установить nvm:

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

Возвращает:

=> nvm is already installed in /home/myuser/.nvm, trying to update using git
=> => Compressing and cleaning up git repository
=> nvm source string already in /home/myuser/.bashrc
=> bash_completion source string already in /home/myuser/.bashrc
nvm is not compatible with the npm config "prefix" option: currently set to "/usr/home/myuser/.nvm/versions/node/v11.5.0"
Run `npm config delete prefix` or `nvm use --delete-prefix v11.5.0 --silent` to unset it.
=> Close and reopen your terminal to start using nvm or run the following to use it now:
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
bash: /nvm.sh: No such file or directory

Если я проверю .bashr c:

- ssh myuser@exmple.com "cat .bashrc"

я получаю:

[…] lots of stuff
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

И если я сделаю:

- ssh myuser@exmple.com "echo $NVM_DIR"

Я ничего не получу.

Похоже, что даже когда gitlab-ci входит на сервер через s sh, не может видеть переменные среды. И если я попытаюсь их сохранить, они не сохранятся.

Кто-нибудь знает, как использовать nvm с s sh в скрипте gitlab-ci?

...