Nodejs с плагином jenkins не исполняется в изображении alpine и отображает символ, который не найден

Фон:

У нас установлен узел версии 8, и он отлично работает в образе докера на базе Jenkins alpine (работает в AWS ECS). Узел 8 был установлен в образе докера jenkins-alpine.

Затем появилось еще одно требование для установки плагина node js Jenkins, чтобы пользовательская версия могла быть установлена ​​и применена по мере необходимости с использованием глобальной конфигурации инструментов. Мы установили nodejs 10, как показано на изображении ниже:  Подключаемый модуль JS jenkins для Node

Не удалось запустить подключаемый модуль Nodejs в jenkins

Затем я попытался использовать плагин jenkins nodejs 10 в конвейере jenkins следующим образом:

#!groovy​

pipeline {
    options {
        buildDiscarder(logRotator(daysToKeepStr: '5'))
        timeout(time: 5, unit: 'MINUTES')
        ansiColor('xterm')
    }
    agent {
        label 'jenkins-slave'
    }
    stages {
        stage('Nodejs test') {
            steps {
                nodejs('NodeJS 10.19.0') {
                    sh "which node; which npm"
                    sh "ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node"
                    sh "node -v"
                    }
                }
            }
        }
    }
}

Задание jenkins завершилось ошибкой, так как не удалось найти узел, хотя он существовал и был исполняемым:

11:00:31  + which node
11:00:31  /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
11:00:31  + which npm
11:00:31  /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/npm
[Pipeline] sh
11:00:31  + ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
11:00:31  -rwxrwxr-x 1 jenkins jenkins 41122344 Feb  5 23:36 /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node

11:00:32  + /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node -v
11:00:32  /var/jenkins_home/workspace/test-jerald-nodejs-plugin@tmp/durable-55482f4f/script.sh: line 1: /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: not found

Тесты внутри докер-контейнера подчиненного устройства jenkins

Я попытался выполнить команду версии узла непосредственно в контейнере подчиненного докера jenkins, однако результат был таким же. Затем я погуглил и сослался на следующий поток, в котором упоминалось, что это связано с отсутствием библиотек, необходимых для nodejs. ​​Команда Jenkins NodeJSPlugin node не найдена

Ниже был первоначальный результат поиска общих библиотек nodejs из плагина jenkins.

bash-4.4$ ldd /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
    /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
    libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
    librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fcbe2d29000)
    libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fcbe2d15000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node)
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: gnu_get_libc_version: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: __register_atfork: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: setcontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: makecontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: backtrace: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: getcontext: symbol not found

Затем я установил недостающие библиотеки с помощью следующей команды:

apk add libc6-compat gcompat

После установки отсутствующих библиотек не было ошибок, связанных с отсутствующими библиотеками, однако по-прежнему есть ошибки с «символом не найден» и узел по-прежнему не исполняется.

bash-4.4# ldd /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
    /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f0e697a1000)
    libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f0e6978d000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
    ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x7f0e69787000)
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: gnu_get_libc_version: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: __register_atfork: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: setcontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: makecontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: backtrace: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: getcontext: symbol not found
bash-4.4# 

Я также проверил разделяемые библиотеки существующего узла v8, и у него не было проблем:

bash-4.4# which node
/usr/local/bin/node
bash-4.4# ldd /usr/local/bin/node
    /lib/ld-musl-x86_64.so.1 (0x7f1e07118000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f1e0539f000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f1e0538b000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f1e07118000)

bash-4.4# /usr/local/bin/node -v
v8.11.3

Так может ли кто-нибудь помочь мне заставить работать плагин Jenkins nodejs?


person Jerald Sabu M    schedule 05.03.2020    source источник


Ответы (1)


Используя графический интерфейс Jenkins, вы установили «основной» плагин Linux NodeJS. Из приведенных выше выводов ясно, что этот плагин не совместим с Alpine Linux.

Alpine Linux основан на musl-libc - стандартной библиотеке C musl, на которой построено большинство дистрибутивов Linux. вокруг glibc - стандартной библиотеки C. Библиотека libc предоставляет базовые возможности для любой родной программы Linux, включая стандартные API C и POSIX, и является неотъемлемой частью операционной системы. Поэтому двоичные файлы, созданные в разных операционных системах с разными реализациями libc, такими как musl от Alpine и glibc Debian, обычно не смешиваются, поскольку реализации не полностью совместимы.

Упомянутые вами недостающие библиотеки: libc6-compat и _ 2_, добавьте слой совместимости с glibc вокруг musl Alpine, который позволяет запускать simple < / em> программы glibc. Однако он не предоставляет все API-интерфейсы glibc - отсюда и недостающие символы.

Для nodejs на Alpine обычно следует установить пакет nodejs репозитория Alpine, но, к сожалению, он не предоставляет подключаемый модуль Jenkins. Вам понадобится подключаемый модуль nodeJS Jenkins, совместимый с musl libc, и я не уверен, что он доступен.

Есть несколько вариантов:

  1. Вы можете перейти на «полную glibc» в Alpine Linux, установив надлежащую glibc в свой контейнер Alpine (пример). Однако это потребует реструктуризации вашего текущего образа, и вы потеряете «чистоту» альпийского образа.
  2. Если плагин, совместимый с musl, не найден, рассмотрите возможность перехода на (менее) компактный, совместимый с glibc базовый образ, например debian.
  3. Или попробуйте собрать плагин Jenkins из исходного кода в Alpine Linux, а затем установите его вручную.
person valiano    schedule 06.03.2020