Team City "minimal build agent" Docker 图片 - "npm: not found" Linux 问题?
Team City "minimal build agent" Docker image - "npm: not found" Linux issue?
首先,我 认为 这更像是一个 Linux 问题,因为问题似乎是 linux-flavoured Docker 容器,但我很高兴接受我可以对团队城市配置做一些事情来克服这个问题。
我对 Linux、Docker 或 node/npm 也不是很有经验,尽管我确实有很多开发经验并且总体上对命令行界面非常熟悉.
背景
我们目前将 Team City 设置为构建服务器,用于构建各种项目:
- .Net 框架,
- .网核
- Angular 命令行
- 几个使用节点包从 Markdown 生成 HTML 的简单网站。
服务器 运行宁作为 Docker 容器使用 Docker for Windows 在 Windows 服务器机器上,这运行良好。
我们有一个 Windows 10 构建代理(VM),它也工作正常,并且可以很好地构建所有 .Net 和 .Net Core 的东西。
简单的文档站点内容主要使用 markdown-to-html 节点包,因此其构建步骤只需获取所有源 .md 文件并使用 markdown-to- 编译为 html html,加上一些其他的 npm 包用于 SASS js 的编译和缩小等。没有实际的节点代码,只有一些 jQuery。为了不占用其他代理,并且因为这些东西可以 运行 在 Linux 上愉快地 运行,我想把这个 运行ning 放在一个小的 docker 图像上而不是某个地方的完整 VM 构建代理。
我之前成功地使用了 node.js team city agent docker 图像(jacobpeddk/teamcity-agent-nodejs
或 omez/teamcity-agent-nodejs
- 不记得了),它确实有效了一段时间,尽管我无法在构建脚本中全局安装一些 npm 包,这意味着我必须在容器中安装一个 bash 终端和 运行 一些手动 npm 命令。我还认为必须 运行 apt-get install zip
才能使压缩步骤起作用。这在一段时间(几周)内运行良好。
我向这些简单项目之一添加了一些额外的 JS 内容,但在尝试构建时突然遇到错误。我(也许是愚蠢的)决定这可能是由于容器具有旧版本的节点 and/or 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
(仅用于构建步骤以压缩工件)
如果我现在运行(通过bashshell)npm -version
我回来5.6。
如果我尝试在命令行步骤中使用 npm 构建到 运行,那么我会在构建日志中收到此错误:
/opt/buildagent/temp/agentTmp/custom_script2764770419520852926: npm: not found
我想知道 team city agent 进程使用的 user/path 与我在 Bash 中使用的 user/path 是否有问题,所以我在构建中添加了以下内容脚本:
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 手动登录时,我设置了特定的路径,但是当构建代理服务 运行ning 作为 root 时,它是不同的。
我不知道为什么会这样,但我基本上通过添加解决了这个问题:
export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin
到在脚本中使用 npm 的每个构建步骤的顶部。在我看来,这似乎是一件必须要做的相当愚蠢的事情——考虑到过去没有这个也可以工作,唯一真正的区别可能是 linux 容器的风格略有不同。据我所知,最初的构建代理容器是基于 jetbrains minimal-build-agent 容器的,因此除非他们更改了基于它的内容,否则应该大致相同...
我还必须将 node-minify 构建步骤中使用的压缩器从 gcc(google 闭包编译器)更改为 babel-minify,因为前者基本上会无限期挂起,但这是一个单独的问题(虽然也有一些很好但现在不是......)
感谢所有花时间阅读的人...虽然我确实想知道是否有一天我会用尽自己的研究选择,最后去互联网上询问并实际得到有人回应 - 出于某种原因每当我到了我不得不问的地步,似乎总是没有其他人有答案,我最终不得不自己解决。虽然我想这可能是在塑造性格......(这不仅仅是如此 - 我发现这种情况在各种论坛上已经超过 15 年了......)
首先,我 认为 这更像是一个 Linux 问题,因为问题似乎是 linux-flavoured Docker 容器,但我很高兴接受我可以对团队城市配置做一些事情来克服这个问题。
我对 Linux、Docker 或 node/npm 也不是很有经验,尽管我确实有很多开发经验并且总体上对命令行界面非常熟悉.
背景
我们目前将 Team City 设置为构建服务器,用于构建各种项目:
- .Net 框架,
- .网核
- Angular 命令行
- 几个使用节点包从 Markdown 生成 HTML 的简单网站。
服务器 运行宁作为 Docker 容器使用 Docker for Windows 在 Windows 服务器机器上,这运行良好。
我们有一个 Windows 10 构建代理(VM),它也工作正常,并且可以很好地构建所有 .Net 和 .Net Core 的东西。
简单的文档站点内容主要使用 markdown-to-html 节点包,因此其构建步骤只需获取所有源 .md 文件并使用 markdown-to- 编译为 html html,加上一些其他的 npm 包用于 SASS js 的编译和缩小等。没有实际的节点代码,只有一些 jQuery。为了不占用其他代理,并且因为这些东西可以 运行 在 Linux 上愉快地 运行,我想把这个 运行ning 放在一个小的 docker 图像上而不是某个地方的完整 VM 构建代理。
我之前成功地使用了 node.js team city agent docker 图像(jacobpeddk/teamcity-agent-nodejs
或 omez/teamcity-agent-nodejs
- 不记得了),它确实有效了一段时间,尽管我无法在构建脚本中全局安装一些 npm 包,这意味着我必须在容器中安装一个 bash 终端和 运行 一些手动 npm 命令。我还认为必须 运行 apt-get install zip
才能使压缩步骤起作用。这在一段时间(几周)内运行良好。
我向这些简单项目之一添加了一些额外的 JS 内容,但在尝试构建时突然遇到错误。我(也许是愚蠢的)决定这可能是由于容器具有旧版本的节点 and/or 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
(仅用于构建步骤以压缩工件)
如果我现在运行(通过bashshell)npm -version
我回来5.6。
如果我尝试在命令行步骤中使用 npm 构建到 运行,那么我会在构建日志中收到此错误:
/opt/buildagent/temp/agentTmp/custom_script2764770419520852926: npm: not found
我想知道 team city agent 进程使用的 user/path 与我在 Bash 中使用的 user/path 是否有问题,所以我在构建中添加了以下内容脚本:
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 手动登录时,我设置了特定的路径,但是当构建代理服务 运行ning 作为 root 时,它是不同的。
我不知道为什么会这样,但我基本上通过添加解决了这个问题:
export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin
到在脚本中使用 npm 的每个构建步骤的顶部。在我看来,这似乎是一件必须要做的相当愚蠢的事情——考虑到过去没有这个也可以工作,唯一真正的区别可能是 linux 容器的风格略有不同。据我所知,最初的构建代理容器是基于 jetbrains minimal-build-agent 容器的,因此除非他们更改了基于它的内容,否则应该大致相同...
我还必须将 node-minify 构建步骤中使用的压缩器从 gcc(google 闭包编译器)更改为 babel-minify,因为前者基本上会无限期挂起,但这是一个单独的问题(虽然也有一些很好但现在不是......)
感谢所有花时间阅读的人...虽然我确实想知道是否有一天我会用尽自己的研究选择,最后去互联网上询问并实际得到有人回应 - 出于某种原因每当我到了我不得不问的地步,似乎总是没有其他人有答案,我最终不得不自己解决。虽然我想这可能是在塑造性格......(这不仅仅是如此 - 我发现这种情况在各种论坛上已经超过 15 年了......)