Team Dok "образ минимального агента сборки" Изображение Docker - "npm: not found" Проблема с Linux? - PullRequest
0 голосов
/ 30 октября 2018

Прежде всего, я думаю это больше проблема 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 , это отличается.

1 Ответ

0 голосов
/ 05 ноября 2018

Я понятия не имею, почему это происходит, но я в основном обошел проблему, добавив: export PATH=$PATH:/root/.nvm/versions/node/v8.11.1/bin

к началу каждого шага сборки, который использует npm в скрипте . На мой взгляд, это кажется довольно глупой вещью - учитывая, что раньше это работало без этого, и единственное реальное отличие, возможно, это немного другой вид контейнера linux. AFAIK исходный контейнер с агентом сборки был основан на одном из минимальных агентов Jetbrains, поэтому, если они не изменили то, что они основывают, оно должно быть примерно таким же ...

Мне также пришлось изменить компрессор, используемый на этапе сборки minify узла, с gcc (компилятор google closure) на babel-minify, поскольку первый в основном зависал на неопределенное время, но это отдельная проблема (хотя и кое-что, что было хорошо, а сейчас нет ...)

Спасибо всем, кто нашел время, чтобы прочитать ... хотя мне интересно, если однажды я исчерпаю свои собственные возможности исследования, и, наконец, пойду спрашиваю в Интернете и на самом деле заставить кого-то ответить - по какой-то причине, когда я получаю до такой степени, что я должен спросить, это всегда кажется, что никто другой не имеет ответа, и я заканчиваю тем, что должен был решить это сам. Наверное, это построение персонажей ... (это не просто ТАК - я обнаружил, что так было более 15 лет на разных форумах о разных вещах ...)

...