Неужели это такая необычная ситуация, что я нигде не могу найти ответы? Тем не мение. У меня есть виртуальный сервер 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, и я должен сделать это вручную.
Если у кого есть решение получше, подскажите. Я отмечу это как ответ, если ничего лучше не появится.