Nodejs с плагином jenkins, не исполняемым на альпийском изображении и отображающим "символ не найден" - PullRequest
2 голосов
/ 05 марта 2020

Фон :

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

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

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 docker контейнере

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

Ниже приведены первоначальные результаты поиска общих библиотек 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 заработал?

1 Ответ

1 голос
/ 06 марта 2020

Используя Jenkins GUI, вы установили плагин "mainstream" Linux NodeJS. Из приведенных выше результатов видно, что этот плагин не совместим с Alpine Linux.

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

Отсутствующие библиотеки Вы упомянули, libc6-compat и gcompat, добавьте слой совместимости glib c вокруг musl Alpine, который позволяет запускать simple glib c программы. Тем не менее, он не предоставляет все API glib c - отсюда и отсутствующие символы.

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

Существует несколько вариантов:

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