linux - Team City“最小构建代理” Docker镜像-“npm:未找到” Linux问题?

标签 linux docker npm teamcity nvm

首先,我认为这更像是一个Linux问题,因为这个问题似乎是在Linux风格的Docker容器上出现的,但是我很高兴接受我可以对TeamCity配置做些什么来克服这个问题。
我对Linux、Docker或node/npm也不是很有经验,不过我确实有很多开发经验,并且对命令行界面非常熟悉。
背景
我们目前已将TeamCity设置为构建服务器,用于构建各种项目:
.Net框架,
.Net核心
角CLI
一些简单的网站使用节点包从标记生成HTML。
服务器作为Docker容器运行,在Windows服务器框上使用Docker for Windows,运行良好。
我们有一个Windows 10构建代理(VM),它也可以正常工作,并且可以构建所有的.Net和.Net内核。
简单的docs站点主要使用markdown-to-html节点包,因此它的构建步骤只需获取所有源.md文件并编译成带有markdown-to-html的html,再加上使用一些其他npm包进行SASS编译和js的小型化等,没有实际的节点代码,只有一些jQuery。为了不与另一个代理绑定,并且因为这些东西可以在Linux上很好地运行,我想让这个在一个小的docker映像上运行,而不是在某个地方运行一个完整的VM构建代理。
我之前成功地使用了node.js team city agent docker映像(要么jacobpeddk/teamcity-agent-nodejs要么omez/teamcity-agent-nodejs-不记得了),虽然我在构建脚本中无法全局安装一些npm包,这意味着我必须在容器中安装bash终端并运行一些手动npm命令。我还认为必须运行apt-get install zip才能快速启动。一段时间内(几周)效果不错。
我在其中一个简单的项目中添加了一些额外的JS内容,当我试图构建时,突然发现了一些错误。我(可能是愚蠢的)认为这可能是因为容器中有旧版本的node和/或npm等,所以我试图通过将bash shell放入容器中、安装nvm和更新node.js&npm来更新它。
这最终以一个相当残破的容器(节点错误)结束,所以我想我应该重新开始,但实际上是从一开始就把它替换为一个漂亮的定制图像(因为我找不到一个非常新的预先存在的图像)。
通过在主机上执行以下操作,我直接在构建代理容器上运行了Bash shell:

docker exec -it basicagent /bin/bash

然后从那里我安装了nvm、Python(节点安装步骤所需)和node:
jetbrains/minimal-build-agent
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
apt-get update
apt-get install python 3.6(我的开发计算机上的匹配版本)
nvm install v8.11.1(我以前发现必须在全球安装的npm包)
npm install -g markdown-folder-to-html(仅用于压缩工件的构建步骤)
如果我现在运行(通过bash shell)apt-get install zip我将返回5.6。
如果我试图在命令行步骤中运行使用npm的生成,则在生成日志中会出现以下错误:
npm -version
我想知道TeamCity代理进程使用的用户/路径与我在Bash中使用的用户/路径是否有问题,所以我在构建脚本中添加了以下内容:
echo PATH = $PATH
echo user var = $USER
echo user via 'id':
id -u -n

其输出为:
PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
user var =
user via id:
root

所以它以根用户的身份运行代理,并且看起来根本没有节点在$PATH中。
但是,如果我直接从Bash运行上面的代码,我可以看到我是root,但是我的$PATH不同:
/opt/buildagent/temp/agentTmp/custom_script2764770419520852926: npm: not found
PATH = /root/.nvm/versions/node/v8.11.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
所以我现在很困惑:我重新启动了容器,但这没有任何效果——看起来当我以root用户身份手动登录时,我设置了一个特定的路径,但是当构建代理服务以root用户身份运行时,情况就不同了。

最佳答案

我不知道为什么会这样,但我基本上解决了这个问题,补充道:
export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin
在脚本中使用npm的每个构建步骤的顶部。在我看来,这似乎是一件相当愚蠢的事情必须做-考虑到这曾经工作没有这个,唯一真正的区别可能是一个略有不同的风格的linux容器。AFAIK最初的构建代理容器是基于jetbrains minimal build agent的,所以除非他们改变了基于它的内容,否则应该大致相同。。。
我还不得不将节点minify构建步骤中使用的压缩器从gcc(google closure compiler)更改为babel minify,因为前者基本上是无限期挂起的,但这是一个单独的问题(尽管这也是一个很好但现在不是…)
感谢所有花时间阅读的人。。。尽管我真的很想知道是否有一天我会用尽我自己的研究选择,最后去问互联网,实际上得到某人的回应-出于某种原因,每当我到了必须问的地步,似乎总是没有其他人也有答案,我最终不得不自己解决。我想可能是性格塑造。。(这不只是如此-我发现在15年多的时间里,在各种各样的论坛上都是这样…)

关于linux - Team City“最小构建代理” Docker镜像-“npm:未找到” Linux问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53065655/

相关文章:

linux - 按文件名排序查找命令

linux - 期望接受一个带有空格的变量

docker - 如何在由docker compose启动的系统中更新容器

css - 如何使用UnCSS

linux - Nasm 程序段错误

java - 无法找到或加载主类 - 对于任何程序

linux - 我们是否应该一开始就从 Docker Hub 安装一个 docker 镜像?

networking - 如何更改 Docker 默认子网大小?

npm - 错误: Cannot find scss module error after babel build

npm - 您不能在以前发布的版本上发布