Skip to content

Проект сборочного образа NodeJS на основе отечественной ОС Astra Linux

License

Notifications You must be signed in to change notification settings

NGRsoftlab/Astra-nodejs-build-utils-image

Repository files navigation

NGRSOFTLAB logo

NodeJS build utils

Dive efficiency Made with love Powered by Docker NGR Team

Rocket Turtle fake mascot image

Rocket turtle под авторством mcollina.

Description

Среда для сборки контейнера с зависимостями для NodeJS. Основан на сборочных компонентах NodeJS и таблице соотношения Debian-Astra

Присоединяйтесь к нашим социальным сетям:

NGR Social Telegram       NGR Social Media

Contents

Dockerfile для сборки NodeJS, на основе отечественной ОС AstraLinux

Для начала работы необходимо установить pre-commit и хуки

$ pip install pre-commit
$ pre-commit --version

pre-commit 4.2.0

$ pre-commit install

pre-commit installed at .git/hooks/pre-commit
pre-commit installed at .git/hooks/commit-msg
pre-commit installed at .git/hooks/pre-push

Warning

Чтобы проверить свои изменения, воспользуйтесь командой pre-commit run --all-files. Чтобы проверить конкретную задачу, воспользуетесь командой pre-commit run <target> --all-files. Если Вы понимаете что творите и хотите пропустить проверку pre-commit-ом воспользуйтесь --no-verify, пример git commit -m "Добавил изменения и не хочу проверки" --no-verify

Собрать образ Astra Linux based

## Export NodeJS build utils version for 1.7.5
export ASTRA_VERSION='1.7.5-slim'
export NODEJS_BUILD_UTILS_VERSION="1.0.0-astra${ASTRA_VERSION}"

## NodeJS build utils image: 601MB
docker build \
    --progress=plain \
    --no-cache \
    -t nodejs-build-utils:"${NODEJS_BUILD_UTILS_VERSION}" \
    .

## Export NodeJS build utils version for 1.8.2
export ASTRA_VERSION='1.8.2-slim'
export NODEJS_BUILD_UTILS_VERSION="1.0.0-astra${ASTRA_VERSION}"

## NodeJS build utils image: 799MB
docker build \
    --progress=plain \
    --no-cache \
    --build-arg image_version="${ASTRA_VERSION}" \
    -t nodejs-build-utils:"${NODEJS_BUILD_UTILS_VERSION}" \
    .
Имя Значение по умолчанию Тип Описание
image_name astra string Имя образа.
image_registry '' string Адрес до реестра образа. Например: --build-arg image_registry=my-container-registry:1111/.
image_version 1.7.5-slim string Версия образа.
Таблица 1. Переопределяемые аргументы для Dockerfile.
  • Представление Makefile-а, который используется в CI-е
  • Представление Makefile-а, который используется в анализатором Svace
  • Представление Makefile-а на основе ninja-build, но в CI-е падает с ошибкой сборки:
FAILED: obj/deps/v8/src/compiler/v8_compiler.pipeline.o
c++ -MMD -MF obj/deps/v8/src/compiler/v8_compiler.pipeline.o.d -D_GLIBCXX_USE_CXX11_ABI=1 -DNODE_OPENSSL_CONF_NAME=nodejs_conf -DNODE_OPENSSL_HAS_QUIC -DICU_NO_USER_DATA_OVERRIDE -DV8_GYP_BUILD -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -D__STDC_FORMAT_MACROS -DOPENSSL_NO_PINSHARED -DOPENSSL_THREADS -DV8_TARGET_ARCH_X64 -DV8_HAVE_TARGET_OS -DV8_TARGET_OS_LINUX '-DV8_EMBEDDER_STRING="-node.20"' -DENABLE_DISASSEMBLER -DV8_PROMISE_INTERNAL_FIELD_COUNT=1 -DV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION -DV8_SHORT_BUILTIN_CALLS -DOBJECT_PRINT -DV8_INTL_SUPPORT -DV8_ATOMIC_OBJECT_FIELD_WRITES -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_USE_SIPHASH -DV8_SHARED_RO_HEAP -DV8_WIN64_UNWINDING_INFO -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_USE_ZLIB -DV8_ENABLE_TURBOFAN -DV8_ENABLE_WEBASSEMBLY -DV8_ENABLE_JAVASCRIPT_PROMISE_HOOKS -DV8_ALLOCATION_FOLDING -DV8_ALLOCATION_SITE_TRACKING -DV8_ADVANCED_BIGINT_ALGORITHMS -DUCONFIG_NO_SERVICE=1 -DU_ENABLE_DYLOAD=0 -DU_STATIC_IMPLEMENTATION=1 -DU_HAVE_STD_STRING=1 -DUCONFIG_NO_BREAK_ITERATION=0 -I../../deps/v8 -I../../deps/v8/include -Igen/generate-bytecode-output-root -Igen -I../../deps/icu-small/source/i18n -I../../deps/icu-small/source/common -pthread -Wno-unused-parameter -Wno-return-type -flax-vector-conversions -Wno-invalid-offsetof -fno-strict-aliasing -m64 -m64 -O3 -fno-omit-frame-pointer -fdata-sections -ffunction-sections -O3 -fno-rtti -fno-exceptions -std=gnu++17  -c ../../deps/v8/src/compiler/pipeline.cc -o obj/deps/v8/src/compiler/v8_compiler.pipeline.o
c++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
[3250/4019] CXX obj/deps/v8/src/wasm/v8_base_without_compiler.wasm-result.o
[3251/4019] CXX obj/deps/v8/src/compiler/turboshaft/v8_turboshaft.store-store-elimination-phase.o
FAILED: obj/deps/v8/src/compiler/turboshaft/v8_turboshaft.store-store-elimination-phase.o
c++ -MMD -MF obj/deps/v8/src/compiler/turboshaft/v8_turboshaft.store-store-elimination-phase.o.d -D_GLIBCXX_USE_CXX11_ABI=1 -DNODE_OPENSSL_CONF_NAME=nodejs_conf -DNODE_OPENSSL_HAS_QUIC -DICU_NO_USER_DATA_OVERRIDE -DV8_GYP_BUILD -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -D__STDC_FORMAT_MACROS -DOPENSSL_NO_PINSHARED -DOPENSSL_THREADS -DV8_TARGET_ARCH_X64 -DV8_HAVE_TARGET_OS -DV8_TARGET_OS_LINUX '-DV8_EMBEDDER_STRING="-node.20"' -DENABLE_DISASSEMBLER -DV8_PROMISE_INTERNAL_FIELD_COUNT=1 -DV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION -DV8_SHORT_BUILTIN_CALLS -DOBJECT_PRINT -DV8_INTL_SUPPORT -DV8_ATOMIC_OBJECT_FIELD_WRITES -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_USE_SIPHASH -DV8_SHARED_RO_HEAP -DV8_WIN64_UNWINDING_INFO -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_USE_ZLIB -DV8_ENABLE_TURBOFAN -DV8_ENABLE_WEBASSEMBLY -DV8_ENABLE_JAVASCRIPT_PROMISE_HOOKS -DV8_ALLOCATION_FOLDING -DV8_ALLOCATION_SITE_TRACKING -DV8_ADVANCED_BIGINT_ALGORITHMS -DUCONFIG_NO_SERVICE=1 -DU_ENABLE_DYLOAD=0 -DU_STATIC_IMPLEMENTATION=1 -DU_HAVE_STD_STRING=1 -DUCONFIG_NO_BREAK_ITERATION=0 -I../../deps/v8 -I../../deps/v8/include -Igen/generate-bytecode-output-root -Igen -I../../deps/icu-small/source/i18n -I../../deps/icu-small/source/common -pthread -Wno-unused-parameter -Wno-return-type -flax-vector-conversions -Wno-invalid-offsetof -fno-strict-aliasing -m64 -m64 -O3 -fno-omit-frame-pointer -fdata-sections -ffunction-sections -O3 -fno-rtti -fno-exceptions -std=gnu++17  -c ../../deps/v8/src/compiler/turboshaft/store-store-elimination-phase.cc -o obj/deps/v8/src/compiler/turboshaft/v8_turboshaft.store-store-elimination-phase.o
c++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
ninja: build stopped: subcommand failed.
make[1]: *** [Makefile:149: node] Error 1

Особенности сборки: Существует 2 образа под сборку NodeJS из исходного кода:

  • nodejs-build-utils:1.0.0-astra1.7.5
  • nodejs-build-utils:1.0.0-astra1.8.1

Каждая из них имеет смысл, т.к. собирают NodeJS определенной версии. Сборка до 21.7.3 (LTS 20.18.1 Iron) производиться тегом 1.0.0-astra1.7.5. Остальные версии, что выше, тегом 1.0.0-astra1.8.1 Причина этой сборки - версии python3 и gcc компиляторов, что участвует в сборке. Соответственно, при установке в ОС-ы необходимо учитывать данные ограничения

Данные переменные могут использоваться как для локальной сборки, так и для сборки через CI. Данные переменные применимы и оказывают эффект на скрипт. Данный скрипт работает в следующих режимах:

  • Сборка node с прохождением всех тестов сборки
  • Сборка node без прохождения тестов
Имя Значение по умолчанию Тип Описание
MAKEFILE_INSTALL_DIR /usr/local string Значение пути, куда будет установлен конечная версия артефакта, после сборки.
MAKEFILE_NODE_DEPLOY_DIR тут stringspec Название директории, куда будет экспортирован артефакт для последующего развертывания в реестре артефактов.
MAKEFILE_NUMBER_OF_CPUS 20 integer Количество ядер CPU, которое будет использовано по умолчанию. Если значение велико для конкретной сборки, то можно проверить максимум посредством команды nproc --ignore 1
MAKEFILE_SKIP_TEST FALSE string Включить/Отключить пропуск тестов. Может быть актуален для версий, младше 20.18.1. По умолчанию тесты включены. Чтобы отключить необходимо экспортировать переменную в режиме TRUE: export MAKEFILE_SKIP_TEST=TRUE.
NODE_VERSION ${CI_COMMIT_REF_NAME} stringspec Ветка/тег собираемого интерпретатора. Если не указно, то использует предопределенные переменные GitLab-a. Если предопределенная переменная отсутствует, то используется значение по умолчанию: test-version.
Таблица 2. Трактовка переменных для взаимодействия с Makefile.

Легенда:

  • ✅ — все тесты проходят
  • ⚠️ — возможны проблемы (нужны патчи)
  • ❌ — не поддерживается
Версия Node.js Астра 1.7.x (Debian 10) Астра 1.8.x (Debian 12)
Node.js 12.x ⚠️ (есть проблемы с тестами) ❌ (нужен Python2.7)
Node.js 14.x
Node.js 16.x ✅ (LTS)
Node.js 18.x ⚠️ (требует --openssl-no-asm)
Node.js 20.x ⚠️ (есть проблемы с тестами) ✅ (LTS)
Node.js 21.x ✅ (до 21.7.3)
Node.js 22.x ❌ (нужен OpenSSL 3.0+) ⚠️ (тесты могут падать)
Таблица 3. Поддерживаемые версии Node.js (с прохождением тестов).
  1. Склонировать репозиторий с компилятором
  2. Войти в интерактивную среду данного образа: docker run -it --rm -v "$(pwd):/build" -w /build nodejs-build-utils:1.0.0-astra1.7.5 bash
  3. Объявить необходимые переменные, чтобы сформировать окружение для работы скрипта
  4. Перенести Makefile в директорию с компилятором: cp ./init/Makefile /path/to/nodejs/repo/Makefile-build
  5. Запустить сборщик: make -f Makefile-build all

Пример запуска сборщика

## Если необходимо пропустить тесты
export MAKEFILE_SKIP_TEST=TRUE
make -f Makefile-build all
  • Ошибка Error: getaddrinfo ENOTFOUND localhost связана с невозможность обращения к LO ввиду проблем с /etc/hosts файлом. Решение состоит в том, чтобы использовать тег сборки docker-without-host-mapping, который предотвращает общий маппинг хостового файла в сборки типа dind
Path: parallel/test-net-socket-connect-without-cb
node:events:497
      throw er; // Unhandled 'error' event
      ^
Error: getaddrinfo ENOTFOUND localhost
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (node:internal/streams/destroy:169:8)
    at emitErrorCloseNT (node:internal/streams/destroy:128:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -3007,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'localhost'
}
Node.js v21.7.3
Command: out/Release/node /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-net-socket-connect-without-cb.js
=== release test-tcp-wrap-listen ===
Path: parallel/test-tcp-wrap-listen
(node:129747) internal/test/binding: These APIs are for internal testing only. Do not use them.
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:497
      throw er; // Unhandled 'error' event
      ^
Error: getaddrinfo ENOTFOUND localhost
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (node:internal/streams/destroy:169:8)
    at emitErrorCloseNT (node:internal/streams/destroy:128:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -3007,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'localhost'
}
Node.js v21.7.3
Command: out/Release/node --expose-internals /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-tcp-wrap-listen.js
=== release test-worker-message-port-transfer-target ===
Path: parallel/test-worker-message-port-transfer-target
(node:136697) Warning: The target port was posted to itself, and the communication channel was lost
(Use `node --trace-warnings ...` to show where the warning was created)
node:assert:173
  throw err;
  ^
AssertionError [ERR_ASSERTION]: The communication channel is still open at /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-worker-message-port-transfer-target.js:21
    at Timeout.mustNotCall [as _onTimeout] (/builds/borrowed-components/interpreters/nodejs/node/test/common/index.js:554:12)
    at listOnTimeout (node:internal/timers:573:17)
    at process.processTimers (node:internal/timers:514:7) {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: undefined,
  expected: undefined,
  operator: 'fail'
}
Node.js v21.7.3
Command: out/Release/node /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-worker-message-port-transfer-target.js
[05:45|% 100|+ 4045|-   3]: Done
Failed tests:
out/Release/node /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-net-socket-connect-without-cb.js
out/Release/node --expose-internals /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-tcp-wrap-listen.js
out/Release/node /builds/borrowed-components/interpreters/nodejs/node/test/parallel/test-worker-message-port-transfer-target.js
Проблема Решение (Астра 1.7.5) Решение (Астра 1.8.1)
Нет OpenSSL 3.0 Сборка Node.js ≤ 16.x OpenSSL 3.0 уже есть
Нет Python 2.7 apt-get install python2.7 Использовать Node.js ≥ 12.x
Ошибки с ICU apt-get install libicu-dev То же самое
Слишком старый GCC Сборка вручную GCC 10 Уже есть GCC 10
Таблица 4. Проблемы и решения для разных версий Astra Linux.

Шаги по установке продукта:

  1. Скачать необходимый компилятор из реестра артефактов
  2. Удалить старые бинарные файлы и экспортировать новые tar -C /usr/local --strip-components 1 -xzf node-v22.13.0-linux-x86_64.tar.gz
  3. Проверить версию установленного бинарного файла node --version

Пример:

## Скачиваем артефакт
curl --silent \
    https://example.registry.com/node/node-v22.13.0-linux-amd64.tar.gz | tar -C "/usr/local" --strip-components 1 -zx

## В качестве проверки проверяем версию продукта
node --version

## Попробуем установить пакет
npm -g install pnpm
pnpm --version

## Если необходимо очистить NodeJS, то необходимо изучить уровень поставляемой вложенности
tar --exclude="*/*/*/*" -tf node-v22.13.0-linux-amd64.tar.gz

## Получаем что-то вроде такого
rm -rfv /usr/local/bin/npm \
        /usr/local/bin/node \
        /usr/local/bin/npx \
        /usr/local/bin/corepack \
        /usr/local/share/man/man1/node.1 \
        /usr/local/share/doc/node \
        /usr/local/include/node \
        /usr/local/lib/node_modules \
        /usr/local/bin/_node/
NodeJS mascot image
Rocket turtle под авторством Angela Angelini.

About

Проект сборочного образа NodeJS на основе отечественной ОС Astra Linux

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published