Прежде всего, я думаю это больше проблема Linux, так как проблема, похоже, связана с контейнером Docker со вкусом linux, но я рад, что могу что-то сделать с Команда города конфигурации, чтобы преодолеть это.
Я также не очень разбираюсь в Linux, Docker или node / npm, хотя у меня есть большой опыт разработки и я в целом хорошо знаком с интерфейсами командной строки.
Фон
В настоящее время Team City настроен в качестве сервера сборки для создания различных проектов:
- .Net Framework,
- .Net Core
- Угловой CLI
- Несколько простых веб-сайтов, которые используют пакеты узлов для генерации HTML из Markdown.
Сервер работает как контейнер Docker, используя Docker для Windows на Windows Server, и это работает хорошо.
У нас есть один агент по сборке Windows 10 (ВМ), который также работает нормально и прекрасно собирает все компоненты .Net и .Net Core.
В простых материалах сайта документации в основном используется пакет узлов markdown-to-html, поэтому его этапы сборки просто получают все исходные файлы .md и компилируются в html с markdown-to-html, а также используют некоторые другие пакеты npm для SASS. компиляция и минификация js и т. д. Нет фактического кода узла как такового, просто немного jQuery. Чтобы не связывать другого агента, и поскольку этот материал может успешно работать в Linux, я хочу, чтобы он работал на небольшом образе докера, а не на каком-либо агенте сборки виртуальной машины где-либо.
Ранее я успешно использовал образ докера агента города команды node.js (либо jacobpeddk/teamcity-agent-nodejs
, либо omez/teamcity-agent-nodejs
- не могу вспомнить), который некоторое время работал, хотя у меня были проблемы с возможностью установки некоторых пакетов npm. глобально в сценариях сборки, что означало, что мне нужно было вставить терминал bash в контейнер и выполнить несколько ручных команд npm. Я также думаю, что мне нужно было запустить apt-get install zip
, чтобы получить быстрый шаг к работе. Некоторое время это работало нормально (недели).
Я добавил несколько дополнительных JS-компонентов в один из этих простых проектов, и внезапно у меня возникли ошибки при попытке собрать. Я (возможно, глупо) решил, что это, вероятно, связано с тем, что в контейнере были более старые версии узла и / или npm и т. Д., Поэтому я попытался обновить это, вставив оболочку bash в контейнер, установив nvm и обновив node.js & npm.
Это закончилось довольно разбитым контейнером (ошибки узла), поэтому я решил вместо этого начать все сначала, но вместо этого начать с образа Docker jetbrains/minimal-build-agent
с целью получить хорошее сделанное на заказ изображение для наши потребности конкретно (так как я не смог найти очень современный, уже существующий)
Я запускаю оболочку Bash непосредственно в контейнере агента сборки, выполняя это на хосте:
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) 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 , это отличается.