团队城市“;“最小生成代理”;Docker图像-“;npm:找不到“;Linux问题?
首先,我认为这更像是一个Linux问题,因为问题似乎出现在一个Linux风格的Docker容器上,但我很高兴接受我可以对team city配置做些什么来克服这一点 我对Linux、Docker或node/npm也不是很有经验,尽管我确实有很多开发经验,并且通常对命令行界面非常熟悉 背景 我们目前已将Team City设置为构建服务器,用于构建各种项目:团队城市“;“最小生成代理”;Docker图像-“;npm:找不到“;Linux问题?,linux,docker,npm,teamcity,nvm,Linux,Docker,Npm,Teamcity,Nvm,首先,我认为这更像是一个Linux问题,因为问题似乎出现在一个Linux风格的Docker容器上,但我很高兴接受我可以对team city配置做些什么来克服这一点 我对Linux、Docker或node/npm也不是很有经验,尽管我确实有很多开发经验,并且通常对命令行界面非常熟悉 背景 我们目前已将Team City设置为构建服务器,用于构建各种项目: .Net框架 .Net核心 角型CLI 两个简单的网站使用节点包从降价生成HTML 服务器作为Docker容器运行,在Windows服务器盒
- .Net框架
- .Net核心
- 角型CLI
- 两个简单的网站使用节点包从降价生成HTML
我们有一个Windows10构建代理(一个VM),它也可以正常工作,并且可以很好地构建所有的.Net和.Net核心内容 simple docs site stuff主要使用markdown to html节点包,因此其构建步骤只需获取所有源.md文件并使用markdown to html编译为html,再加上使用其他一些npm包进行SASS编译和js缩小等。没有实际的节点代码,只有一些jQuery。为了不占用另一个代理,并且因为这个东西可以在Linux上愉快地运行,我想让它在一个小的docker映像上运行,而不是在某个地方运行一个完整的VM构建代理 我之前成功地使用了node.js team city agent docker映像(无论是
Jacobbedk/teamcity agent nodejs
还是omez/teamcity agent nodejs
-记不得),虽然我在构建脚本中全局安装一些npm包时遇到了问题,但它确实工作了一段时间,这意味着我必须将bash终端放入容器中并运行一些手动npm命令。我还认为我必须运行apt get install zip
,才能使压缩步骤正常工作。这在一段时间(几周)内效果良好
我在其中一个简单的项目中添加了一些额外的JS内容,在尝试构建时突然出现了错误。我(可能是愚蠢地)认为这可能是由于容器中有较旧版本的node和/或npm等,所以我尝试通过在容器中安装bashshell、安装nvm和更新node.js&npm来更新它
这最终导致了一个相当破碎的容器(节点错误),因此我想我应该重新开始,但实际上是从jetbrains/minimal build agent
Docker映像开始,目的是为我们的需要专门定制一个好的映像(因为我找不到一个非常最新的预存映像)
通过在主机上执行以下操作,我已在build agent容器上直接运行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\u DIR/NVM.sh”]&&&&\。“$NVM_DIR/NVM.sh”#这将加载NVM
[-s“$NVM\u DIR/bash\u completion”]&&&\。“$NVM_DIR/bash_completion”#这将加载NVM bash_completion
apt获取更新
apt get install python 3.6
(与我的开发机器上的版本相匹配)nvm安装v8.11.1
(我以前发现我必须全局安装npm包)npm安装-g标记文件夹到html
(仅用于压缩工件的构建步骤)apt get install zip
npm-version
5.6
如果我尝试在命令行步骤中运行使用npm的生成,则生成日志中会出现以下错误:
/opt/buildagent/temp/agentTmp/custom_script2764770419520852926:npm:未找到
我想知道team city agent进程使用的用户/路径与我在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/sbin:/usr/bin:/sbin:/bin
root
因此,我现在感到困惑:我重新启动了容器,但这没有任何效果-似乎当我以root身份手动登录时,我设置了特定的路径,但当构建代理服务以root身份运行时,情况就不同了。我不知道为什么会发生这种情况,但我基本上解决了这个问题,添加了:
export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin
在脚本中使用npm的每个构建步骤的顶部。在我看来,这似乎是一件相当愚蠢的事情——考虑到以前在没有这个的情况下它也能工作,唯一真正的区别可能是linux容器的味道略有不同。AFAIK最初的构建代理容器是基于jetbrains最小构建代理的,所以除非他们改变了基于它的内容,否则应该大致相同
我还不得不将节点缩小构建步骤中使用的压缩器从gcc(google closure compiler)更改为babel minify,因为前者基本上是无限期挂起的,但这是一个单独的问题(虽然也有一些问题是好的,但现在不是…)
感谢所有花时间阅读的人。。。虽然我真的很想知道有一天我是否会用尽我自己的研究选择,最后去问互联网,并真正得到别人的回应——出于某种原因,每当我不得不问的时候,似乎总是没有人回答