Como instalar o Node.js e o NPM no servidor Unix para que nenhum usuário precise do sudo para instalar ou ler pacotes globais?

1

É realmente uma situação tão incomum que não consigo encontrar respostas em lugar algum? De qualquer forma. Eu tenho um servidor Ubuntu VM no DigitalOcean e estou executando o Jenkins neste servidor para criar, testar e implantar localmente um aplicativo da Web (essencialmente copiar o diretório do aplicativo da Web para outro local e reiniciar o serviço systemctl que o executa). p>

O problema é que o usuário que o jenkins gera no sistema (com o qual você não pode efetuar login btw), de alguma forma atrapalhou o diretório de módulos do nó. Ele é instalado na pasta de início do jenkins /var/lib/jenkins/ , ao executar npm install (apesar de não haver -g opção), em vez de compilar o diretório de implantação e a resolução de pacote do aplicativo não pode resolver os módulos instalados no jenkins home sendo executado por Jenkins, então por usuário Jenkins).

Eu suspeito que a solução seria permitir a instalação do nó de alguma forma gerenciada, de modo que cada usuário possa instalar e exigir módulos globais sem a necessidade de usar sudo , mas até agora todas as soluções que eu consultei (nvm, n- instalar, vários scripts) são para usuário único ou sudo. Eu não posso realmente fazer nada para o usuário jenkins (ou qualquer outro gerado pelo programa). Então, qual é a melhor solução neste caso?

    
por Megakoresh 12.07.2017 / 16:47

1 resposta

0

Parece que é um caso surpreendentemente incomum, a julgar pela ausência de qualquer atividade. De qualquer forma, minha solução agora é incluir a instalação do node.js no pipeline no meu Jenkinsfile e executá-lo usando o comando sh . O script de instalação é assim:

#!/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
Obviamente, isso não é o ideal, já que ele não instala o node.js e o torna disponível para todos os usuários, mas tem repositórios privados npm para cada, de forma que eles não precisam do sudo para instalá-los ou lê-los. Portanto, tenho que ter certeza de que o usuário que o serviço systemd usa para executar o aplicativo também tenha o node.js instalado e eu tenha que fazer isso manualmente.

Se alguém tiver uma solução melhor, diga-me. Vou marcar isso como a resposta se nada aparecer melhor.

    
por 13.07.2017 / 14:06