Gitlab-ci.yml, S SH и NVM: подключитесь к серверу через s sh и запустите nvm use - PullRequest
0 голосов
/ 06 мая 2020

У меня есть приложение Node, которое использует указанную c версию узла, поэтому я использую nvm для запуска правильной версии в файле .npmrc.

Приложение развертывается с помощью Gitlab. Процесс прост: когда я sh с локального репозитория на gitlab, gitlab подключается к производственному серверу через s sh и извлекает последнюю версию репозитория в Gitlab

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

Что я могу сделать, чтобы запустить NVM в example.com через s sh в gitlab-ci.yml?

1 Ответ

0 голосов
/ 06 мая 2020

Когда вы входите в систему, ваше окружение (в частности, переменная NVM_PATH, но также и сама PATH, которая вызывает «bash: nvm: command not found») отличается от того, когда вы выполняете команды с помощью S SH команда. Вы можете проверить это так:

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

Первый будет выполнять - в зависимости от того, какую оболочку и ОС вы используете - файлы, такие как .bashrc, которые выполняются после интерактивного входа в систему, а второй (часто) не выполняет . Отрывок из того, что добавляет NVM:

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

Первая определяет переменную, которую вам не хватает, вторая выполняет сценарий, который, помимо прочего, изменяет ваш PATH, чтобы исполняемый файл nvm мог быть нашел.

Вы можете запустить этот файл вручную или добавить фрагмент, который NVM добавляет в ваш конвейер CI перед вызовом nvm use.

...