Comments 12
Я ничего не имею против виртуализации сборки, так как это во-первых решает вопрос настройки окружения, во-вторых изолирует процесс сборки, т.е. есть уверенность, что если собралось на его машине, то соберется и на билд сервере, и у других разработчиков.
Лучше собрать контейнер со всем необходимым, при запуске контейнера монтировать каталог с исходным кодом (можно и каталог куда будут складываться результат сборки, чтобы они сохранялись между перезапусками контейнера). А разработчик вручную запускает сборку в контейнере (контейнер предоставляет консоль, X Server или в нем запущен ssh сервер). При изменнии исходного кода разработчик заново запускает сборку без пересборки контейнера.
В результате для сборки будет только копироваться исходный код и скомпиленый бинарник, что заметно ускорит процесс.
А вот запуск сборки вручную — очень странная идея. Сборка должна быть по коммиту, как минимум, чтобы удостовериться, что код компилируется и тесты проходят. В противном случае добавляется человеческий фактор, который обычно выстреливает в самый неподходящий момент.
Я думаю под "вручную запускает сборку в контейнере" подразумевалось на хардкодить вызов cmake в Dockerfile, а использовать что-то типа: docker run build-container cmake /app && cmake --build ...
.
Кто и как будет выполнять эту команду — вопрос отдельный.
Это было сделано в первую очередь, чтобы вновь пришедшим разработчикам не пришлом возиться со всем этим. Опять же, можно делать инкрементальную сборку, что может быть весьма актуально на больших проектах.
точнее осбрать все библиотеки довольно длителное занятие плюс они других версий от того, что используется для других проектов и могут возникнуть проблемы из-за этого.
У нас решается это просто, есть отдельный репозиторий depends, в котором уже собраны либы для osx, windows, linux, asm.js. Цепляем все через cmake, поэтому для развертки требуется всего лишь компилятор и cmake.
Сборка по коммиту при помощи docker реализовано в GitLab CI, поэтому тут говорить не о чем. Автор говорит именно об освобождении от настройки окружения:
Таким образом, освободив последующих разработчиков от необходимости тратить время на настройку локальной сборки.
В результате мы создали полноценное C++ приложение, настроили окружение для его сборки и запуска под Linux и завернули его в Docker-контейнер. Таким образом, освободив последующих разработчиков от необходимости тратить время на настройку локальной сборки.
Entrypoint = точка входа, а то, что передаётся в CMD, "добавляется" к entrypoint. Так что корректное завершение работы контейнера будет (exit with 0 status). Вы, возможно, путаете с RUN - вот это действительно предварительная настройка. Точнее, каждая команда RUN создаёт новый слой собираемого образа
Использование Docker для сборки и запуска проекта на C++