本文共 4850 字,大约阅读时间需要 16 分钟。
在前面的文章中我们验证了Alpine版本的Linux发行版和NodeJS安装包不兼容的情况,并给出了解决的方法。而Jenkins本身也提供Alpine版本的镜像,这篇文章来确认一下目前最新的Alpine版本(2.190.1)的镜像是否支持NodeJS插件。
获取最新lts的alpine版本Jenkins
执行命令:docker pull jenkins/jenkins:lts-alpine
liumiaocn:~ liumiao$ docker pull jenkins:lts-alpineError response from daemon: manifest for jenkins:lts-alpine not foundliumiaocn:~ liumiao$ docker pull jenkins/jenkins:lts-alpinelts-alpine: Pulling from jenkins/jenkins...省略f47b1765c187: Pull complete Digest: sha256:abbd597e5791e740ea7039951d3f694a65444b708e1c9991a85534d4e38f1bbcStatus: Downloaded newer image for jenkins/jenkins:lts-alpineliumiaocn:~ liumiao$ liumiaocn:~ liumiao$ docker images |grep jenkins |grep lts-alpinejenkins/jenkins lts-alpine 8d4feb9f9f15 3 weeks ago 226MBliumiaocn:~ liumiao$
启动Jenkins
执行命令:
docker run -d -p 8080:8080 -p 60000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-alpine
执行日志如下所示:
liumiaocn:~ liumiao$ docker run -d -p 8080:8080 -p 60000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-alpine6535aece8684557eb085061cd39199201f4237961bf0dfa75885cc1aa8dec15bliumiaocn:~ liumiao$
设定Jenkins
使用docker logs命令获取如下信息,并填入Jenkins启动页面,然后安装缺省建议的插件。
Jenkins initial setup is required. An admin user has been created and a password generated.Please use the following password to proceed to installation:f1a30728e5584561b9081805a0caa8c0This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
当前的版本是2.190.1
安装并设定NodeJS插件
这里使用Node 10.15.3版
创建Job并设定
创建一个Free Style的Job并做如下设定,仅仅确认npm和node的版本信息
结果分析
- 日志分析 第一次执行的时候的日志信息如下所示:
Started by user adminRunning as SYSTEMBuilding in workspace /var/jenkins_home/workspace/nodejs-freestyle-jobUnpacking https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gz to /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3 on Jenkins
可以看到,下载和压缩的nodejs的二进制包的源就是https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gz,而这个显然是64位的基于libc的编译结果。
由于需要从网络上下载并展开此nodejs包,所以会花费一定时间。而一旦下载并完成解压,下面的日志也随之展开。
Started by user adminRunning as SYSTEMBuilding in workspace /var/jenkins_home/workspace/nodejs-freestyle-jobUnpacking https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gz to /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3 on Jenkins[nodejs-freestyle-job] $ /bin/sh -xe /tmp/jenkins5559044380616609516.sh+ npm -venv: ‘node’: No such file or directoryBuild step 'Execute shell' marked build as failureFinished: FAILURE
从结果中可以很清晰的看到,node -v也同样提示No such file or directory,表明是无法正常运行的。
- Jenkins的Alpine基础镜像版本 此Jenkins镜像是基于Alpine的镜像,而Alpine的版本可以从系统中的如下文件予以确认:
liumiaocn:~ liumiao$ docker exec -it mystifying_spence sh/ $ cat /etc/alpine-release 3.9.4/ $
可以看到Alpine的版本是3.9.4,而目前Alpine也没有官方支持libc的特性,所以此nodejs只有在满足所需要的libc的符号链接和函数所有库都有替代的情况下才能够正常运行。
- 链接库状态确认
/ $ cd /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64/~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $ ldd ./bin/node /lib64/ld-linux-x86-64.so.2 (0x7f4264595000) libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f4264595000) librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f4264595000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f4264440000) libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f4264595000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f426442c000) libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f4264595000) libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f4264595000)Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by ./bin/node)Error relocating ./bin/node: gnu_get_libc_version: symbol not foundError relocating ./bin/node: __register_atfork: symbol not foundError relocating ./bin/node: setcontext: symbol not foundError relocating ./bin/node: makecontext: symbol not foundError relocating ./bin/node: backtrace: symbol not foundError relocating ./bin/node: getcontext: symbol not found~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $
- 版本确认 执行node -v和npm -v均无法正常动作,而文件又存在,根本原因就是因为libc下编译的二进制文件在musl支持的环境中运行,自然无法使用。就像我们希望windows下的exe文件能在linux下运行一样,一般是不太可行的。
~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $ ./bin/node -vsh: ./bin/node: not found~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $ ./bin/npm -venv: ‘node’: No such file or directory~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $ ls binnode npm npx~/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs10.15.3/node-v10.15.3-linux-x64 $
结论
最新的Jenkins的官方的Alpine版本的镜像同样存在这个问题,如果使用了官方镜像同时又希望使用NodeJS插件的情况下,解决方法同样需要前面的文章中提到的如下解决方案:
- https://liumiaocn.blog.csdn.net/article/details/102587460
转载地址:https://liumiaocn.blog.csdn.net/article/details/102633238 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!