[mod] Tools to install and maintain NVM versions manager for Node.js

[1] https://github.com/nvm-sh/nvm

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2021-11-14 18:10:14 +01:00
parent 646db5d4f9
commit dc1442a2d1
8 changed files with 274 additions and 45 deletions

1
.gitignore vendored
View file

@ -9,6 +9,7 @@ geckodriver.log
.coverage .coverage
coverage/ coverage/
.nvm/
cache/ cache/
build/ build/
dist/ dist/

View file

@ -36,7 +36,7 @@ install uninstall:
$(Q)./manage pyenv.$@ $(Q)./manage pyenv.$@
PHONY += clean PHONY += clean
clean: py.clean docs.clean node.clean test.clean clean: py.clean docs.clean node.clean nvm.clean test.clean
$(Q)./manage build_msg CLEAN "common files" $(Q)./manage build_msg CLEAN "common files"
$(Q)find . -name '*.orig' -exec rm -f {} + $(Q)find . -name '*.orig' -exec rm -f {} +
$(Q)find . -name '*.rej' -exec rm -f {} + $(Q)find . -name '*.rej' -exec rm -f {} +
@ -64,6 +64,7 @@ test.shell:
$(MTOOLS) \ $(MTOOLS) \
utils/lib.sh \ utils/lib.sh \
utils/lib_install.sh \ utils/lib_install.sh \
utils/lib_nvm.sh \
utils/lib_static.sh \ utils/lib_static.sh \
utils/filtron.sh \ utils/filtron.sh \
utils/searx.sh \ utils/searx.sh \
@ -89,13 +90,13 @@ MANAGE += pypi.upload pypi.upload.test
MANAGE += test.yamllint test.pylint test.pep8 test.unit test.coverage test.robot test.clean MANAGE += test.yamllint test.pylint test.pep8 test.unit test.coverage test.robot test.clean
MANAGE += themes.all themes.oscar themes.simple pygments.less MANAGE += themes.all themes.oscar themes.simple pygments.less
MANAGE += static.build.commit static.build.drop static.build.restore MANAGE += static.build.commit static.build.drop static.build.restore
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
PHONY += $(MANAGE) PHONY += $(MANAGE)
$(MANAGE): $(MANAGE):
$(Q)$(MTOOLS) $@ $(Q)$(MTOOLS) $@
# deprecated # deprecated
PHONY += docs docs-clean docs-live docker themes PHONY += docs docs-clean docs-live docker themes

View file

@ -43,7 +43,10 @@ searx.engines.load_engines(searx.settings['engines'])
jinja_contexts = { jinja_contexts = {
'searx': { 'searx': {
'engines': searx.engines.engines, 'engines': searx.engines.engines,
'plugins': searx.plugins.plugins 'plugins': searx.plugins.plugins,
'version': {
'node': os.getenv('NODE_MINIMUM_VERSION')
},
}, },
} }

View file

@ -29,7 +29,7 @@ Calling the ``help`` target gives a first overview (``make help``):
.. _make install: .. _make install:
Python Environment (``make install``) Python environment (``make install``)
===================================== =====================================
.. sidebar:: activate environment .. sidebar:: activate environment
@ -112,6 +112,60 @@ from the YAML configuration:
- ``SEARXNG_BIND_ADDRESS`` from :ref:`server.bind_address <settings global server>` - ``SEARXNG_BIND_ADDRESS`` from :ref:`server.bind_address <settings global server>`
- ``SEARXNG_PORT`` from :ref:`server.port <settings global server>` - ``SEARXNG_PORT`` from :ref:`server.port <settings global server>`
.. _make node.env:
Node.js environment (``make node.env``)
=======================================
.. _Node.js: https://nodejs.org/
.. _nvm: https://github.com/nvm-sh
.. _npm: https://www.npmjs.com/
.. jinja:: searx
Node.js_ version {{version.node}} or higher is required to build the themes.
If the requirement is not met, the build chain uses nvm_ (Node Version
Manager) to install latest LTS of Node.js_ locally: there is no need to
install nvm_ or npm_ on your system.
Use ``make nvm.status`` to get the current status of you Node.js_ and nvm_ setup.
Here is the output you will typically get on a Ubuntu 20.04 system which serves
only a `no longer active <https://nodejs.org/en/about/releases/>`_ Release
`Node.js v10.19.0 <https://packages.ubuntu.com/focal/nodejs>`_.
::
$ make nvm.status
INFO: Node.js is installed at /usr/bin/node
INFO: Node.js is version v10.19.0
WARN: minimal Node.js version is 16.13.0
INFO: npm is installed at /usr/bin/npm
INFO: npm is version 6.14.4
WARN: NVM is not installed
INFO: to install NVM and Node.js (LTS) use: manage nvm install --lts
To install you can also use :ref:`make nvm.nodejs`
.. _make nvm.nodejs:
``make nvm.nodejs``
===================
Install latest Node.js_ LTS locally (uses nvm_)::
$ make nvm.nodejs
INFO: install (update) NVM at /share/searxng/.nvm
INFO: clone: https://github.com/nvm-sh/nvm.git
...
Downloading and installing node v16.13.0...
...
INFO: Node.js is installed at searxng/.nvm/versions/node/v16.13.0/bin/node
INFO: Node.js is version v16.13.0
INFO: npm is installed at searxng/.nvm/versions/node/v16.13.0/bin/npm
INFO: npm is version 8.1.0
INFO: NVM is installed at searxng/.nvm
.. _make run: .. _make run:
``make run`` ``make run``
@ -133,14 +187,16 @@ browser (:man:`xdg-open`)::
``make clean`` ``make clean``
============== ==============
Drop all intermediate files, all builds, but keep sources untouched. Before Drops all intermediate files, all builds, but keep sources untouched. Before
calling ``make clean`` stop all processes using :ref:`make install`. :: calling ``make clean`` stop all processes using the :ref:`make install` or
:ref:`make node.env`. ::
$ make clean $ make clean
CLEAN pyenv CLEAN pyenv
PYENV [virtualenv] drop ./local/py3 PYENV [virtualenv] drop local/py3
CLEAN docs -- ./build/docs ./dist/docs CLEAN docs -- build/docs dist/docs
CLEAN locally installed npm dependencies CLEAN themes -- locally installed npm dependencies
...
CLEAN test stuff CLEAN test stuff
CLEAN common files CLEAN common files

View file

@ -5,6 +5,7 @@ Development Quickstart
====================== ======================
.. _npm: https://www.npmjs.com/ .. _npm: https://www.npmjs.com/
.. _Node.js: https://nodejs.org/
SearXNG loves developers, just clone and start hacking. All the rest is done for SearXNG loves developers, just clone and start hacking. All the rest is done for
you simply by using :ref:`make <makefile>`. you simply by using :ref:`make <makefile>`.
@ -24,37 +25,27 @@ choose a meaningful commit message and we are happy to receive your pull
request. To not end in *wild west* we have some directives, please pay attention request. To not end in *wild west* we have some directives, please pay attention
to our ":ref:`how to contribute`" guideline. to our ":ref:`how to contribute`" guideline.
If you implement themes, you will need to compile styles and JavaScript before If you implement themes, you will need to setup a :ref:`make node.env` once:
*run*.
.. code:: sh
make node.env
Before you call *make run* (2.), you need to compile the modified styles and
JavaScript:
.. code:: sh .. code:: sh
make themes.all make themes.all
Don't forget to install npm_ first. Alternatively you can also compile selective the theme you have modified,
e.g. the *simple* theme.
.. tabs::
.. group-tab:: Ubuntu / debian
.. code:: sh .. code:: sh
sudo -H apt-get install npm make themes.simple
.. group-tab:: Arch Linux
.. code-block:: sh
sudo -H pacman -S npm
.. group-tab:: Fedora / RHEL
.. code-block:: sh
sudo -H dnf install npm
If you finished your *tests* you can start to commit your changes. To separate If you finished your *tests* you can start to commit your changes. To separate
the changed code from the build products first run: the modified source code from the build products first run:
.. code:: sh .. code:: sh

23
manage
View file

@ -1,11 +1,16 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*- # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# shellcheck disable=SC2031
# shellcheck disable=SC2034
main_cmd="$(basename "$0")"
# shellcheck source=utils/lib.sh # shellcheck source=utils/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/utils/lib.sh" source "$(dirname "${BASH_SOURCE[0]}")/utils/lib.sh"
# shellcheck source=utils/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_nvm.sh"
# shellcheck source=utils/lib_static.sh # shellcheck source=utils/lib_static.sh
source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_static.sh" source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_static.sh"
@ -14,6 +19,7 @@ source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_static.sh"
PYOBJECTS="searx" PYOBJECTS="searx"
PY_SETUP_EXTRAS='[test]' PY_SETUP_EXTRAS='[test]'
GECKODRIVER_VERSION="v0.28.0" GECKODRIVER_VERSION="v0.28.0"
export NODE_MINIMUM_VERSION="16.13.0"
# SPHINXOPTS= # SPHINXOPTS=
pylint.FILES() { pylint.FILES() {
@ -41,6 +47,7 @@ PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES="supported_languages,language_aliases,log
PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc" PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc"
help() { help() {
nvm.help
cat <<EOF cat <<EOF
buildenv: buildenv:
rebuild ./utils/brand.env rebuild ./utils/brand.env
@ -63,9 +70,12 @@ docker.:
gecko.driver: gecko.driver:
download & install geckodriver if not already installed (required for download & install geckodriver if not already installed (required for
robot_tests) robot_tests)
EOF
nvm.help
cat <<EOF
node.: node.:
env : download & install npm dependencies locally env : download & install npm dependencies locally
clean : drop npm installations clean : drop locally npm installations
py.: py.:
build : Build python packages at ./${PYDIST} build : Build python packages at ./${PYDIST}
clean : delete virtualenv and intermediate py files clean : delete virtualenv and intermediate py files
@ -499,10 +509,9 @@ gecko.driver() {
} }
node.env() { node.env() {
if ! required_commands npm; then if ! nvm.min_node "${NODE_MINIMUM_VERSION}"; then
info_msg "to install build tools use::" info_msg "install Node.js by NVM"
info_msg " sudo -H ./utils/searx.sh install buildhost" nvm.nodejs
die 1 "install needed build tools first"
fi fi
( set -e ( set -e
@ -521,7 +530,7 @@ node.clean() {
build_msg CLEAN "npm is not installed / ignore npm dependencies" build_msg CLEAN "npm is not installed / ignore npm dependencies"
return 0 return 0
fi fi
build_msg CLEAN "locally installed npm dependencies" build_msg CLEAN "themes -- locally installed npm dependencies"
( set -e ( set -e
npm --prefix searx/static/themes/oscar run clean npm --prefix searx/static/themes/oscar run clean
npm --prefix searx/static/themes/simple run clean npm --prefix searx/static/themes/simple run clean

171
utils/lib_nvm.sh Executable file
View file

@ -0,0 +1,171 @@
#!/usr/bin/env bash
# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# Tools to install and maintain NVM versions manager for Node.js
#
# [1] https://github.com/nvm-sh/nvm
# https://github.com/koalaman/shellcheck/issues/356#issuecomment-853515285
# shellcheck source=utils/lib.sh
. /dev/null
declare main_cmd
# configure nvm environment
# -------------------------
NVM_LOCAL_FOLDER=.nvm
[[ -z "${NVM_GIT_URL}" ]] && NVM_GIT_URL="https://github.com/nvm-sh/nvm.git"
[[ -z "${NVM_MIN_NODE_VER}" ]] && NVM_MIN_NODE_VER="16.13.0"
# initalize nvm environment
# -------------------------
nvm.env() {
source "${NVM_DIR}/nvm.sh"
source "${NVM_DIR}/bash_completion"
}
nvm.is_installed() {
# is true if NVM is installed / in $HOME or even in <repo-root>/.nvm
[[ -d "${NVM_DIR}" ]]
}
if [[ -z "${NVM_DIR}" ]]; then
# nvm is not pre-intalled in $HOME. Prepare for using nvm from <repo-root>
NVM_DIR="$(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER}"
fi
export NVM_DIR
if nvm.is_installed; then
[ "$VERBOSE" = "1" ] && info_msg "source NVM environment from ${NVM_DIR}"
nvm.env
else
# if nvm is not installed, use this function as a wrapper
nvm() {
nvm.ensure
nvm "$@"
}
fi
# implement nvm functions
# -----------------------
nvm.is_local() {
# is true if NVM is installed in <repo-root>/.nvm
[ "${NVM_DIR}" = "$(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER}" ]
}
nvm.min_node(){
# usage: nvm.min_node 16.3.0
#
# Is true if minimal Node.js version is installed.
local min_v
local node_v
local higher_v
if ! command -v node >/dev/null; then
wanr_msg "Node.js is not yet installed"
return 42
fi
min_v="${1}"
node_v="$(node --version)"
node_v="${node_v:1}" # remove 'v' from 'v16.3.0'
if ! [ "${min_v}" = "${node_v}" ]; then
higher_v="$(echo -e "$min_v\n${node_v}" | sort -Vr | head -1)"
if [ "${min_v}" = "${higher_v}" ]; then
return 42
fi
fi
}
# implement nvm command line
# --------------------------
nvm.help(){
cat <<EOF
nvm.: use nvm (without dot) to execute nvm commands directly
install : install NVM locally at $(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER}
clean : remove NVM installation
status : prompt some status informations about nvm & node
nodejs : install Node.js latest LTS
bash : start bash interpreter with NVM environment sourced
EOF
}
nvm.install() {
local NVM_VERSION_TAG
info_msg "install (update) NVM at ${NVM_DIR}"
if [[ -d "${NVM_DIR}" ]] ; then
info_msg "already cloned at: ${NVM_DIR}"
pushd "${NVM_DIR}" &> /dev/null
git fetch --all | prefix_stdout " ${_Yellow}||${_creset} "
else
info_msg "clone: ${NVM_GIT_URL}"
git clone "${NVM_GIT_URL}" "${NVM_DIR}" 2>&1 | prefix_stdout " ${_Yellow}||${_creset} "
pushd "${NVM_DIR}" &> /dev/null
git config --local advice.detachedHead false
fi
NVM_VERSION_TAG="$(git rev-list --tags --max-count=1)"
NVM_VERSION_TAG="$(git describe --abbrev=0 --tags --match "v[0-9]*" "${NVM_VERSION_TAG}")"
info_msg "checkout ${NVM_VERSION_TAG}"
git checkout "${NVM_VERSION_TAG}" 2>&1 | prefix_stdout " ${_Yellow}||${_creset} "
nvm.env
}
nvm.clean() {
if ! nvm.is_installed; then
info_msg "NVM is not installed"
return 42
fi
if ! nvm.is_local; then
info_msg "can't remove NVM from ${NVM_DIR}"
return 42
fi
rm -rf "${NVM_DIR}"
}
nvm.status(){
if command -v node >/dev/null; then
info_msg "Node.js is installed at $(command -v node)"
info_msg "Node.js is version $(node --version)"
if ! nvm.min_node "${NVM_MIN_NODE_VER}"; then
warn_msg "minimal Node.js version is ${NVM_MIN_NODE_VER}"
fi
else
warn_msg "Node.js is mot installed"
fi
if command -v npm >/dev/null; then
info_msg "npm is installed at $(command -v npm)"
info_msg "npm is version $(npm --version)"
else
warn_msg "npm is not installed"
fi
if nvm.is_installed; then
info_msg "NVM is installed at ${NVM_DIR}"
else
warn_msg "NVM is not installed"
info_msg "to install NVM and Node.js (LTS) use: ${main_cmd} nvm install --lts"
fi
}
nvm.nodejs(){
nvm install --lts
nvm.status
}
nvm.bash() {
nvm.ensure
bash --init-file <(cat "${NVM_DIR}/nvm.sh" "${NVM_DIR}/bash_completion")
}
nvm.ensure() {
if ! nvm.is_installed; then
nvm.install
fi
}

View file

@ -43,8 +43,7 @@ shellcheck"
BUILD_PACKAGES_debian="\ BUILD_PACKAGES_debian="\
firefox graphviz imagemagick texlive-xetex librsvg2-bin firefox graphviz imagemagick texlive-xetex librsvg2-bin
texlive-latex-recommended texlive-extra-utils fonts-dejavu texlive-latex-recommended texlive-extra-utils fonts-dejavu
latexmk latexmk"
npm"
# pacman packages # pacman packages
SEARX_PACKAGES_arch="\ SEARX_PACKAGES_arch="\
@ -55,8 +54,7 @@ shellcheck"
BUILD_PACKAGES_arch="\ BUILD_PACKAGES_arch="\
firefox graphviz imagemagick texlive-bin extra/librsvg firefox graphviz imagemagick texlive-bin extra/librsvg
texlive-core texlive-latexextra ttf-dejavu texlive-core texlive-latexextra ttf-dejavu"
npm"
# dnf packages # dnf packages
SEARX_PACKAGES_fedora="\ SEARX_PACKAGES_fedora="\
@ -69,8 +67,7 @@ BUILD_PACKAGES_fedora="\
firefox graphviz graphviz-gd ImageMagick librsvg2-tools firefox graphviz graphviz-gd ImageMagick librsvg2-tools
texlive-xetex-bin texlive-collection-fontsrecommended texlive-xetex-bin texlive-collection-fontsrecommended
texlive-collection-latex dejavu-sans-fonts dejavu-serif-fonts texlive-collection-latex dejavu-sans-fonts dejavu-serif-fonts
dejavu-sans-mono-fonts dejavu-sans-mono-fonts"
npm"
# yum packages # yum packages
# #