Двоичные исполняемые файлы в node_modules не найдены в Github Actions Ubuntu Node image

У меня есть веб-приложение node, которое я запускаю локально для запуска тестовых спецификаций. Я использую мокко и карму в качестве бегуна. Вот одна из моих команд npm для запуска набора тестов:

{
  "scripts": {
   "test-jobs-once-docker": "mocha --reporter spec \"server/**/*.spec.js\""
  }
}

Когда я запускаю docker-compose up локально, команда работает, и спецификации запускаются в контейнере докера.

Вот мой docker-compose.yml:


version: "3"
services:  
  mongo:     
    image: mongo:3.4
    ports:
      - 27017:27017
    restart: always    
  redis:
    image: redis:7.0.8    
    ports:
      - 6379:6379
    restart: always        
  webapp:
    build:
      context: .
      args:
        - NODE_ENV=dockerTest
    platform: linux/amd64
    ports:
      - 9000:9000
    depends_on:
      - redis
    environment:
      - PORT=9000
      - NODE_ENV=dockerTest
      - REDIS_URL=redis://redis:6379            
    command: ['npm', 'run', 'test-jobs-once-docker']

Вот Dockerfile:

FROM --platform=linux/amd64 ubuntu:20.04

ENV APP_HOME = "/app"

WORKDIR /app

USER root
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
    && apt-get install -y curl \
    && apt-get -y autoclean

ENV NODE_VERSION=12.9.0
ENV NVM_DIR /usr/local/nvm
ENV CHROME_BIN=/usr/bin/google-chrome

RUN mkdir -p /usr/local/nvm/ && \
    curl --silent -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash

RUN /bin/bash -c "source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default"

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

RUN apt-get install python -y
RUN apt-get install libkrb5-dev -y
RUN apt-get install libpng-dev -y 
RUN apt-get install libfontconfig1 fontconfig libfontconfig1-dev -y

RUN apt-get install build-essential  -y

COPY ./package*.json ./
COPY .npmrc ./

RUN npm install
COPY . /app


RUN touch ./server/config/local.env.js

ENV PORT=9000

EXPOSE 8080
EXPOSE 9000

Однако, когда я запускаю это в GitHub Actions, он говорит:

мокко: команда не найдена

Вот мой рабочий процесс:

name: Run Test Suite
on: [push, pull_request]

jobs:
  run-tests-docker:
    runs-on: ubuntu-20.04
    steps: 
    - name: Check out code
      uses: actions/checkout@v2

    - name: Build Docker Containers & Run Test Specs
      run:  docker-compose -f "docker-compose.yml" up -d --build
          
    - name: Run Test Specs
      run:  npm run test-jobs-once-docker
      env:
        NODE_ENV: dockerTest
   
    - name: Stop Containers
      if: always()
      run: docker-compose -f "docker-compose.yml" down

Когда я запускаю это в GitHub Actions, я комментирую свойство command в веб-приложении в docker-compose.yml, чтобы команда выполнялась в задании в GitHub Actions, а не при сборке контейнера. Я чувствую, что это проблема. Я не знаю, как проверить контейнер, созданный и используемый в GitHub Actions, чтобы узнать, существует ли node_modules.

Кто-нибудь знает, как я могу получить доступ к исполняемому файлу mocha, чтобы я мог запускать свои тесты в GitHub Actions?

Обновлять:

Я заметил, что папка node_modules не находится в каталоге, в котором находится остальная часть моего приложения. Я собираюсь предположить, что это часть проблемы, это переменная $PATH и файлы в каталоге после сборки среды в действиях github ( также обратите внимание на Dockerfile и nvm

/home/runner/.local/bin:/opt/pipx_bin:/home/runner/.cargo/bin:/home/runner/.config/composer/vendor/bin:/usr/local/.ghcup/bin:/home/runner/.dotnet/tools:/snap/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Dockerfile
Gemfile
Gemfile.lock
Procfile
README.md
app.json
bower.json
client
database.json
docker-compose.yml
e2e
karma.conf.js
package-lock.json
package.json
server
shared
webpack-dev.config.js
webpack-production.config.js
webpack.common.js

Актуально: stackoverflow.com/questions/9722407/…

Azeem 18.05.2023 07:40

Взгляните на вышеуказанную ветку. Похоже на проблему с версией npm. Проверьте свою локальную версию npm. Предустановленная версия ubnutu-20.04 runner — npm 9.5.1. Итак, похоже, что либо вам нужно установить mocha вручную перед его использованием, либо вы можете использовать npx mocha вместо него.

Azeem 18.05.2023 07:45

@Azeem Я сомневаюсь, что большая часть того, что есть в этой теме, имеет прямое отношение. Это было с тех пор, как Node начал стандартизировать node_modules/.bin, давным-давно, и скрипты npm теперь автоматически устанавливают этот префикс пути.

Zac Anger 18.05.2023 07:47

Я не вижу в ваших рабочих процессах ничего работающего npm i. Это в файле Docker, на который ссылается шаг сборки в компоновке? Если это так, вы можете добавить ls либо в RUN в вашем Dockerfile, либо в команде, чтобы убедиться, что они действительно там, где должны быть.

Zac Anger 18.05.2023 07:50

Спасибо! Я добавил Dockerfile в пост, именно там я запускаю npm install. Рассмотрю все предложения, спасибо! Я дам вам знать, как это происходит.

HelloWorld 18.05.2023 15:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
103
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ваша проблема, похоже, связана с контекстом, в котором выполняется команда mocha.

  • Когда вы запускаете команду mocha внутри контейнера Docker, она получает доступ к каталогу node_modules, который был установлен в процессе сборки Docker (поскольку npm install выполняется в файле Docker).
  • Однако, когда вы пытаетесь запустить mocha непосредственно из рабочего процесса GitHub Actions, у него нет доступа к этим node_modules, поскольку он находится вне контекста контейнера Docker.

Убедитесь, что node_modules правильно установлен: если вы хотите продолжать выполнять тесты из рабочего процесса GitHub Actions, вы можете убедиться, что каталог node_modules установлен правильно. Вы можете сделать это, запустив npm install в рабочем процессе GitHub Actions:

- name: Install Dependencies
  run:  npm install

- name: Run Test Specs
  run:  npm run test-jobs-once-docker
  env:
    NODE_ENV: dockerTest

Однако имейте в виду, что это может не сработать, если ваши тесты основаны на других аспектах вашей среды Docker, которые не реплицируются в вашем обработчике GitHub Actions.

И убедитесь, что рабочий каталог указан правильно: убедитесь, что средство запуска GitHub Actions находится в правильном каталоге, когда пытается запуститься npm run test-jobs-once-docker. Если он находится не в правильном каталоге, он может не найти каталог node_modules. Вы можете использовать параметр working-directory в рабочем процессе GitHub Actions, чтобы убедиться, что бегун находится в правильном каталоге:

- name: Run Test Specs
  run:  npm run test-jobs-once-docker
  env:
    NODE_ENV: dockerTest
  working-directory: /path/to/your/app

Замените /path/to/your/app фактическим путем к вашему приложению в файловой системе бегуна.


Альтернативным подходом может быть запуск тестов в контейнере Docker**: вместо того, чтобы пытаться запустить npm run test-jobs-once-docker из рабочего процесса GitHub Actions, вы можете запускать тесты в самом контейнере Docker. Это гарантирует, что команда mocha имеет доступ к каталогу node_modules. Вы можете сделать это, изменив рабочий процесс GitHub Actions, чтобы выполнить команду внутри контейнера Docker. Вот пример того, как вы могли бы это сделать:

- name: Run Test Specs
  run:  docker exec <container-id> npm run test-jobs-once-docker
  env:
    NODE_ENV: dockerTest

Обратите внимание, что <container-id> следует заменить на идентификатор или имя вашего контейнера Docker. Вы можете получить эту информацию из вывода docker-compose up -d --build.

Вы можете получить идентификатор своего контейнера Docker, используя команду docker ps с фильтром для имени контейнера. Фильтр соответствует полному имени контейнера или его части.

Вот как вы можете использовать его в рабочем процессе GitHub Actions:

- name: Get Container ID
  run: echo "CONTAINER_ID=$(docker ps -aqf "name=webapp")" >> $GITHUB_ENV

На этом шаге команда docker ps -aqf "name=webapp" выводит список всех контейнеров и фильтров для одного из них с именем «webapp». Флаги -aq означают «все» и «тихие» соответственно, что означает, что команда вернет все контейнеры (а не только запущенные) и распечатает только их идентификаторы контейнеров.

Команда echo "CONTAINER_ID=$(docker ps -aqf "name=webapp")" >> $GITHUB_ENV записывает выходные данные (идентификатор контейнера) в файл GITHUB_ENV, что делает его доступным в качестве переменной среды на последующих этапах рабочего процесса.

Затем вы можете использовать этот идентификатор контейнера в следующих шагах:

- name: Inspect Node Modules
  run: docker exec ${{ env.CONTAINER_ID }} ls -la /app/node_modules

@HelloWorld Я отредактировал ответ, чтобы ответить на ваш комментарий.

VonC 24.05.2023 23:11

Чтобы иметь mocha и/или karma в вашем изображении, чтобы вы могли запускать их, в своем Dockerfile после:

RUN npm install

добавлять:

RUN npm install -g mocha

это сделает mocha и karma доступными в качестве команд в вашем PATH, поэтому вы можете запустить "mocha --reporter spec "server/**/*.spec.js""

команда mocha не найдена, поскольку она недоступна в среде, в которой вы пытаетесь ее запустить:

      run:  npm run test-jobs-once-docker

Пока есть команда npm и файл package.json, доступный для нее, она эффективно выполняет скрипт пакета npm, называемый test-jobs-once-docker, а именно:

mocha --reporter spec "server/**/*.spec.js"

Подоболочка npm вызывается, а затем не может найти mocha, что приводит к рассматриваемому сообщению об ошибке.


Это просто для понимания сообщения об ошибке.


Остальное не совсем понятно из вашего вопроса. И это влияет на среду, которая вам нужна для успешного выполнения командной строки mocha. Подходящее окружение, которое вы также подтверждаете рабочим, вы специально отвергаете:

Когда я запускаю это в GitHub Actions, я комментирую свойство команды в веб-приложении в docker-compose.yml, чтобы команда выполнялась в задании в GitHub Actions [...]

Обоснование, которое вы даете:

поэтому команда выполняется в задании GitHub Actions, а не при сборке контейнера.

А потом:

Я чувствую, что это проблема.

Действительно! Вся настройка выполняется для запуска этой команды, но затем вы отключаете команду, потому что выполняете всю настройку?

Это не имеет никакого смысла. На самом деле вы хотите запустить его, когда он будет собран, у вас есть это в вашем конвейере, даже с именем:

Создавайте контейнеры Docker и запускайте тестовые спецификации

Просто сделай это. Не комментируйте команду. В противном случае вы запускаете контейнер, но не запускаете команду. Команда, которую вы хотите запустить.

docker-compose -f "docker-compose.yml" up -d --build

Это либо недопонимание запуска установки в фоновом режиме, либо все в порядке, но тогда вам нужно выполнить команду в работающем контейнере (и оставить команду в конфигурации компоновки закомментированной):

docker-compose exec webapp npm run test-jobs-once-docker

Другие вопросы по теме