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

时间:2018-10-30 13:40:54

标签: linux docker npm teamcity nvm

首先,我认为这更多是Linux问题,因为问题似乎出在Linux风格的Docker容器上,但是我很高兴接受我可以做些什么团队城市配置来克服这个问题。

我对Linux,Docker或node / npm也不太有经验,尽管我确实有很多开发经验,并且对命令行界面非常满意。

背景

我们目前已将Team City设置为构建服务器,用于构建各种项目:

  • .Net Framework,
  • .Net Core
  • Angular CLI
  • 几个使用节点包从Markdown生成HTML的简单网站。

该服务器在Windows Server盒子上使用Docker for Windows作为Docker容器运行,并且运行良好。
我们有一个Windows 10 Build代理(VM),它也可以正常工作,并且可以很好地构建所有.Net和.Net Core东西。

简单的docs网站内容主要使用markdown-to-html节点包,因此其构建步骤仅获取所有源.md文件并使用markdown-to-html编译为html,并使用其他一些npm包进行SASS js等的编译和最小化。没有实际的节点代码,只有一些jQuery。为了不占用其他代理,并且因为这些东西可以在Linux上愉快地运行,我想让它在小的docker映像上运行,而不是在某个地方的完整VM构建代理上运行。

我以前成功地使用过一次有效的node.js团队城市代理docker映像(jacobpeddk/teamcity-agent-nodejsomez/teamcity-agent-nodejs-无法回忆起),尽管我在能够在构建脚本中全局安装一些npm软件包,这意味着我必须将bash终端放入容器并运行一些手动npm命令。我还认为必须运行apt-get install zip才能开始压缩步骤。在一段时间(几周)内效果良好。

我向这些简单项目之一添加了一些额外的JS东西,突然间,在尝试构建时出现错误。我(也许是愚蠢的)认为这可能是由于容器具有旧版本的node和/或npm等导致的,所以我尝试通过将bash shell放入容器,安装nvm并更新node.js和npm来进行更新。

这最终以一个相当破损的容器(节点错误)结束,所以我想我应该重新开始,但是实际上是从jetbrains/minimal-build-agent Docker镜像开始,目的是以一个很好的定制结尾专门满足我们需求的图片(因为我找不到最新的已有图片)

我已经通过在主机上执行此操作直接在构建代理容器上运行Bash shell:

docker exec -it basicagent /bin/bash

然后从那里我安装了nvm,Python(节点安装步骤必需)和节点:

  • 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 install -g markdown-folder-to-html(我之前发现我必须全局安装的npm软件包)
  • apt-get install zip(仅用于压缩工件的构建步骤)

如果我现在(通过bash shell)运行npm -version,我得到5.6。

如果我尝试在命令行步骤中运行使用npm的构建,那么我会在构建日志中得到以下错误: /opt/buildagent/temp/agentTmp/custom_script2764770419520852926: npm: not found

我想知道团队城市代理进程正在使用的用户/路径与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

因此它以 root 身份运行代理,并且在$ PATH中似乎根本没有节点。

但是,如果我直接从Bash运行上述代码,则可以看到我是root用户,但是我的$ PATH是不同的:

PATH = /root/.nvm/versions/node/v8.11.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

root

所以我现在很困惑:我已经重新启动了容器,但没有效果-似乎当我以 root 身份手动登录时,我已经设置了某个路径,但是当构建代理服务以 root 身份运行时,则有所不同。

1 个答案:

答案 0 :(得分:1)

我不知道为什么会这样,但是我基本上通过添加以下方法解决了该问题: export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin

在脚本中使用npm的每个构建步骤的顶部。在我看来,这似乎是一件很愚蠢的事情-考虑到以前在没有此功能的情况下就可以工作,并且唯一真正的区别可能是Linux容器的风格略有不同。 AFAIK最初的构建代理容器是基于jetbrains minimal-build-agent容器的,所以除非他们更改了基于它们的内容,否则它应该大致相同...

我还不得不将节点最小化构建步骤中使用的压缩器从gcc(谷歌关闭编译器)更改为babel-minify,因为前者基本上是无限期挂起的,但这是一个单独的问题(尽管很好,现在不是...)

感谢所有花时间阅读的人...尽管我确实想知道是否有一天我会用尽自己的研究选择,最后去询问互联网并实际上得到某人的答复-每当我得到时,出于某种原因到我不得不问的地步,似乎总是没人能找到答案,而我最终不得不自己解决。我想这可能是建立角色的..(不仅仅是SO-我在各种论坛上讨论各种事情已经有15年了……)