Как поэтапно включить nvm в circleci 2.0?

Вот мои шаги в моем

steps:
  -run:
      name: Setup nvm and npm
      command: |
        wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
        export NVM_DIR=$HOME/.nvm
        source $NVM_DIR/nvm.sh
        nvm install 8.9 && nvm alias default 8.9
   -run: npm install && npm run lint && npm test

Второй шаг всегда терпит неудачу с этим сообщением об ошибке

/bin/bash: npm: command not found

Я проверил .bashrc и вижу, что в конец файла добавлены следующие строки

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

Circleci 2.0 вызывает команду step, запустив новую оболочку с #!/bin/bash -eo pipefail

Если я запускаю докер (docker run -i -t buildpack-deps:xenial) и применяю первый шаг, а затем запускаю новую оболочку через #!/bin/bash -eo pipefail, я вижу, что npm доступен на пути

Я использую докер для этого проекта

version: 2
jobs:
  test_main:
    docker:
      - image: buildpack-deps:xenial

Так почему же это не работает в среде circleci 2.0? Как я могу гарантировать, что npm будет доступен для шага 2 с шага 1?

Я попытался добавить [ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc" в ~/.bash_profile (в случае, если .bashrc не выполняется из-за неинтерактивной оболочки или оболочки без входа в систему)

Чтобы воспроизвести проблему, вы можете запустить circleci build с этим .circleci/config.yml файлом.

version: 2
jobs:
  build:
    docker:
      - image: buildpack-deps:xenial
    steps:
      - run:
          name: Setup nvm and npm
          command: |
            wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
            # Activate nvm
            export NVM_DIR=$HOME/.nvm
            touch $HOME/.nvmrc
            source $NVM_DIR/nvm.sh
            # Use node 8.9
            nvm install 8.9 && nvm alias default 8.9
            echo 8.9 > $HOME/.nvmrc
            # Enable nvm in following steps
            echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile
            # To fix npm install : "node-pre-gyp: Permission denied"
            npm config set user 0
            npm config set unsafe-perm true
            npm install -g npx webpack webpack-cli jest
            node --version
            npm --version
      - run: npm install

Вы увидите следующее сообщение об ошибке:

====>> npm install
  #!/bin/bash -eo pipefail
npm install
/bin/bash: npm: command not found
Error: Exited with code 127
Step failed
Task failed

person Anthony Kong    schedule 12.03.2018    source источник
comment
Было бы полезно больше вашей конфигурации. Например, какой исполнитель и изображение вы используете?   -  person FelicianoTech    schedule 13.03.2018
comment
Я использую докер. Я добавил дополнительную информацию к вопросу   -  person Anthony Kong    schedule 13.03.2018


Ответы (3)


Проблема заключается в следующих строках:

        # Enable nvm in following steps
        echo '[ -s "$HOME/.bashrc" ] && \. "$HOME/.bashrc"' >> $HOME/.bash_profile

Я надеялся получить .bashrc от .bash_profile. Однако, поскольку оболочка circleci не интерактивна, переменная среды PS1 пуста. Следовательно, .bashrc в основном завершает работу сразу после получения, из-за этой строки в .bashrc

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Я должен поместить следующие строки непосредственно в файл, указанный $BASH_ENV

echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
person Anthony Kong    schedule 13.03.2018
comment
У меня не получилось, приходилось делать nvm install 8.9 && nvm alias default 8.9 на каждом шаге. - person Omer Levi Hevroni; 19.03.2019
comment
Кто-нибудь нашел для этого решение? - person Josias Iquabius; 02.04.2019

Просто source /opt/circleci/.nvm/nvm.sh в начале каждого шага.

person Denis Glotov    schedule 05.01.2020

Я обнаружил, что изменение узла по умолчанию с помощью nvm не работает для моих шагов.

Решено:

      - run:
          name: 'Install Project Node'
          command: |
            set +x
            source ~/.bashrc

            nvm install 12
            NODE_DIR=$(dirname $(which node))
            echo "export PATH=$NODE_DIR:\$PATH" >> $BASH_ENV
person Vladislav Zaynchkovsky    schedule 15.05.2020