У меня есть веб-приложение 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
Взгляните на вышеуказанную ветку. Похоже на проблему с версией npm. Проверьте свою локальную версию npm. Предустановленная версия ubnutu-20.04 runner — npm 9.5.1. Итак, похоже, что либо вам нужно установить mocha вручную перед его использованием, либо вы можете использовать npx mocha вместо него.
@Azeem Я сомневаюсь, что большая часть того, что есть в этой теме, имеет прямое отношение. Это было с тех пор, как Node начал стандартизировать node_modules/.bin, давным-давно, и скрипты npm теперь автоматически устанавливают этот префикс пути.
Я не вижу в ваших рабочих процессах ничего работающего npm i. Это в файле Docker, на который ссылается шаг сборки в компоновке? Если это так, вы можете добавить ls либо в RUN в вашем Dockerfile, либо в команде, чтобы убедиться, что они действительно там, где должны быть.
Спасибо! Я добавил Dockerfile в пост, именно там я запускаю npm install. Рассмотрю все предложения, спасибо! Я дам вам знать, как это происходит.





Ваша проблема, похоже, связана с контекстом, в котором выполняется команда 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 Я отредактировал ответ, чтобы ответить на ваш комментарий.
Чтобы иметь 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
Актуально: stackoverflow.com/questions/9722407/…