Назад | Перейти на главную страницу

Как установить Node.js и NPM на сервер Unix, чтобы пользователям не требовалось sudo для установки или чтения глобальных пакетов?

Неужели это такая необычная ситуация, что я нигде не могу найти ответы? Тем не мение. У меня есть виртуальный сервер Ubuntu на DigitalOcean, и я запускаю Jenkins на этом сервере для создания, тестирования и локального развертывания веб-приложения (по сути, скопируйте каталог веб-приложения в другое место и перезапустите службу systemctl, которая его запускает).

Проблема в том, что пользователь, которого jenkins генерирует в системе (с которым вы не можете войти в систему, кстати), каким-то образом испортил каталог модулей узлов. Он установлен в домашней папке jenkins /var/lib/jenkins/, при выполнении npm install (несмотря на то, что не было -g option) вместо сборки каталога развертывания и разрешения пакета из приложения не может разрешить модули, установленные в доме jenkins (несмотря на то, что они запускаются jenkins, то есть пользователем jenkins).

Я подозреваю, что решением будет разрешить каким-либо образом управляемую установку узла, чтобы каждый пользователь мог устанавливать и требовать глобальные модули без необходимости использования sudo, но до сих пор все решения, которые я искал (nvm, n-install, различные сценарии), предназначены для одного пользователя или sudo. Я действительно ничего не могу сделать с пользователем jenkins (или любым другим созданным программой) пользователем. Так какое же лучшее решение в этом случае?

Похоже, это действительно удивительно редкий случай, если судить по отсутствию какой-либо активности. В любом случае мое решение теперь состоит в том, чтобы включить установку node.js в конвейер в моем файле Jenkins и запустить ее с помощью sh команда. Сценарий установки выглядит так:

#!/usr/bin/env bash
command_exists () {
  command -v $1 >/dev/null 2>&1
}

if command_exists 'node' && command_exists 'npm'; then
  echo 'Node installed, exiting'
  exit 0
else
  if [ -d $HOME/n ]; then
    echo 'n-install directory exists, path likely not configured, exiting'
    exit 0
  fi
  echo 'Node not installed, installing'
  curl -L https://git.io/n-install | bash -s -- -y
  echo 'Reloading bashrc'
  . $HOME/.bashrc
  if command_exists 'node' && command_exists 'npm'; then
    echo 'Node installed successfully. Updating npm'
    npm i -g npm
    echo 'Node version:'
    node -v
    echo 'NPM version:'
    npm -v
    echo 'NPM prefix:'
    npm config get prefix
    exit 0
  else
    echo 'Node installation failed!'
    exit 1
  fi
fi

Это, конечно, не идеально, поскольку на самом деле он не устанавливает node.js и не делает его доступным для каждого пользователя, но имеет частные репозитории npm для каждого, поэтому им не нужно sudo для их установки или чтения. Поэтому я должен отдельно убедиться, что у пользователя, которого служба systemd использует для запуска приложения, также установлен node.js, и я должен сделать это вручную.

Если у кого есть решение получше, подскажите. Я отмечу это как ответ, если ничего лучше не появится.