8 votes

La configuration simple de CircleCI 2.0 échoue pour l'installation globale des paquets NPM

J'ai un fichier Docker qui fonctionne bien :

FROM node:10
RUN npm set unsafe-perm true
RUN npm install -g '@oresoftware/r2g@0.0.132'

mais le même fichier config.yml de CircleCI qui reflète le Dockerfile ci-dessus ne fonctionne pas :

{
  "version": 2,
  "jobs": {
    "build": {
      "docker": [
        {
          "image": "circleci/node:10"
        }
      ],
      "steps": [
        {
          "run": "npm set unsafe-perm true"
        },
        {
          "run": "npm install -g --loglevel=warn '@oresoftware/r2g@0.0.132'"
        }
      ]
    }
  }
}

J'obtiens l'erreur suivante sur CircleCI en utilisant le fichier config.yml ci-dessus :

#!/bin/bash -eo pipefail
npm install -g --loglevel=warn @oresoftware/r2g
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2018-06-18T18_26_53_651Z-debug.log
Exited with code 243

CircleCI 2.0 devrait utiliser Docker, donc je ne sais pas pourquoi cette erreur de permissions se produit.

17voto

robSE13 Points 36

Tldr - utilisez le préfixe suivant :

npm install --prefix=$HOME/.local --global serverless`
  • Remplacer serverless avec vos propres exigences en matière d'emballage global.

Le contexte :

  • Après un peu d'expérimentation, la méthode ci-dessus semble être la plus propre que j'ai trouvée.

  • L'actualité de CircleCI circleci/node:lts-buster L'image a les éléments suivants sur le chemin :

    /home/circleci/.local/bin:/home/circleci/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

  • Je n'ai pas pu écrire à /home/circleci/bin en raison du blocage des droits d'écriture.

  • J'ai pu écrire à /home/circleci/.local/bin

  • Ajout de la --prefix=$HOME/.local option pour npm install signifie que le paquet global est ensuite installé dans /home/circleci/.local/bin

  • Après l'installation, la commande, dans mon cas serverless est exécutable.

7voto

vstm Points 7303

Comme nous l'avons dit, le Dockerfile du haut n'est pas totalement identique à celui du CircleCI-config. Dans le Dockerfile, l'image de base est node qui, par défaut, fonctionne sous le nom de root utilisateur.

Le site circleci/node l'image de l'autre côté tombe sur les non-privilégiés circleci utilisateur. Ainsi, un fichier Docker 100 % identique basé sur le fichier node ressemblerait à ceci :

FROM node:10
RUN useradd -m circleci
USER circleci
RUN npm set unsafe-perm true
RUN npm install -g '@oresoftware/r2g@0.0.132'

Et avec ce Dockerfile, la même erreur apparaît comme dans CircleCI.

Une solution serait d'utiliser sudo Le problème est qu'il faudrait alors utiliser sudo sur chaque commande qui utilise le paquetage node que vous avez installé (puisqu'avec sudo, il serait en fait installé dans le répertoire de l'utilisateur). /root qui n'est pas accessible avec l'option circleci utilisateur).

Je pense que la meilleure option serait d'installer le paquet dans le répertoire circleci répertoire personnel.

{
  "version": 2,
  "jobs": {
    "build": {
      "docker": [
        {
          "image": "circleci/node:10"
        }
      ],
      "steps": [
        {
          "run": "npm set prefix=/home/circleci/npm && echo 'export PATH=$HOME/circleci/npm/bin:$PATH' >> /home/circleci/.bashrc"
        },
        {
          "run": "npm install -g --loglevel=warn '@oresoftware/r2g@0.0.132'"
        }
      ]
    }
  }
}

De cette façon, vous n'avez pas à sudo à chaque fois que vous voulez utiliser le paquet.

3voto

IronPatriotNY Points 11

Sur CircleCI, vous devez utiliser sudo . L'utilisateur par défaut est circleci qui a un accès sudo sans mot de passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X