【发布时间】:2018-10-30 13:40:54
【问题描述】:
首先,我认为这更像是一个 Linux 问题,因为问题似乎出在 linux 风格的 Docker 容器上,但我很高兴接受我可以做点什么团队城市配置来克服这个问题。
我对 Linux、Docker 或 node/npm 也不是很有经验,但我确实有很多开发经验,并且对命令行界面非常熟悉。
背景
我们目前将 Team City 设置为构建服务器,用于构建各种项目:
- .Net 框架,
- .Net Core
- Angular CLI
- 几个使用节点包从 Markdown 生成 HTML 的简单网站。
服务器在 Windows Server 机器上使用 Docker for Windows 作为 Docker 容器运行,并且运行良好。
我们有一个 Windows 10 构建代理(VM),它也可以正常工作,并且可以正常构建所有 .Net 和 .Net Core 内容。
简单的 docs 站点主要使用 markdown-to-html 节点包,因此其构建步骤只需获取所有源 .md 文件并使用 markdown-to-html 编译为 html,并使用其他一些用于 SASS 的 npm 包js等的编译和缩小等。没有实际的节点代码,只是一些jQuery。为了不占用其他代理,并且因为这些东西可以在 Linux 上愉快地运行,我想让它在一个小的 docker 映像上运行,而不是某个地方的完整 VM 构建代理。
我之前成功使用了一个 node.js 团队城市代理 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 来更新它。
这最终导致一个相当损坏的容器(节点错误),所以我想我应该重新开始,但实际上是从 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 | bashexport 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_completionapt-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 身份运行时,情况就不同了。
【问题讨论】:
标签: linux docker npm teamcity nvm