По моему мнению, внедрение автоматизированного сервера сборки было бы самым чистым решением для того, чего вы пытаетесь достичь. С дополнительным преимуществом ... постоянная интеграция! (Я коснусь CI чуть позже).
Существует множество инструментов для использования. @Clifford уже упоминал CMake. Но некоторые другие:
- Хадсон (с открытым исходным кодом)
- CruiseControl (с открытым исходным кодом)
- TeamCity (Коммерческая - но она имеет довольно щедрую бесплатную версию, которая позволяет использовать до 3 агентов сборки и 20 конфигураций сборки. Корпоративная версия TeamCity - это то, что использует моя компания, поэтому мой ответ будет направлен на это то, что я знаю, но концепции, вероятно, будут применяться ко всем инструментам)
Итак, прежде всего я попытаюсь объяснить, что мы делаем, и предложить, как это может работать для вас. Я не предполагаю, что это принятый способ сделать что-то, но он сработал для нас. Как я уже говорил, мы используем TeamCity для нашего сервера сборки. Каждый программный проект добавляется в TeamCity и настраивается конфигурация. Конфигурации сборки сообщают TeamCity, когда создавать, как создавать и где находится репозиторий SCM вашего проекта. Мы используем две разные конфигурации сборки для каждого проекта, одну из которых мы называем «интеграция», которая контролирует репозиторий SCM проекта и запускает инкрементную сборку при обнаружении регистрации. Другая конфигурация, которую мы называем «ночная», запускается в определенное время каждую ночь и выполняет полностью чистую сборку.
Кстати, просто краткая заметка о SCM. Чтобы это работало наиболее корректно, я думаю, что SCM для каждого проекта должен использоваться в стабильной топологии соединительных линий. Если все ваши разработчики работают из своих собственных веток, вам, вероятно, потребуются отдельные конфигурации сборки для каждого разработчика, которые, я думаю, будут излишне запутанными. Мы настроили наш сервер сборки с собственной учетной записью пользователя SCM, но с доступом только для чтения.
Таким образом, когда сборка запускается для конкретной конфигурации сборки, сервер извлекает последние файлы из хранилища и отправляет их «агенту сборки», который выполняет сборку с использованием сценария сборки. Мы использовали Rake для сценариев наших сборок и автоматического тестирования, но вы можете использовать все что угодно. Агент сборки может находиться на том же ПК, что и сервер, но в нашем случае у нас есть отдельный ПК, потому что наш сервер сборки расположен в центре с отделом ИКТ, в то время как нам нужно, чтобы наш агент сборки физически находился в моей команде (для автоматической целевое тестирование). Таким образом, наборы инструментов, которые вы используете, установлены в вашем агенте сборки.
Как это может сработать для вас?
Допустим, вы работаете в TidyDog и у вас есть два проекта:
- «PoopScoop» основан на цели PIC18F, скомпилированной с использованием компилятора C18, чья магистраль расположена в SCM по адресу
//PoopScoop/TRUNK/
- "PoopBag" основан на цели ColdFire, скомпилированной с GCC, ствол которой расположен в
//PoopBag/TRUNK/
Компиляторы, необходимые для сборки всех проектов, установлены на вашем агенте сборки (назовем его TidyDogBuilder). Будет ли это тот же компьютер, на котором работает сервер сборки, или отдельный блок, зависит от вашей ситуации. Каждый проект имеет свой собственный скрипт сборки (например, //PoopScoop/Rakefile.rb
и //PoopBag/Rakefile.rb
), который обрабатывает зависимости исходного файла и вызывает соответствующие компиляторы. Например, вы можете перейти к // PoopScoop / в командной строке, ввести rake
, и скрипт сборки позаботится о компиляции проекта PoopScoop в командной строке.
Затем вы настраиваете свои конфигурации сборки на сервере сборки.Конфигурация сборки для PoopScoop, например, будет указывать, какой инструмент SCM вы используете, и расположение хранилища (например, //PoopScoop/TRUNK/
), указывать, какой агент сборки использовать (например, TidyDogBuilder), указывать, где найти подходящий сценарий сборки, и любую необходимую команду.использовать (например, //PoopScoop/Rakefile.rb
, вызванный с rake incremental:build
) и указать, какое событие вызывает сборку (например, Обнаружение регистрации на //PoopScoop/TRUNK/
).Таким образом, идея заключается в том, что если кто-то отправит изменение в //PoopScoop/TRUNK/Source/Scooper.c
, сервер сборки обнаружит это изменение, извлечет последние версии исходных файлов из хранилища и отправит их агенту сборки для компиляции с использованием сценария сборки и в концепо электронной почте каждому разработчику, у которого есть изменения в сборке с результатом сборки.
Если ваши проекты должны быть скомпилированы для нескольких целей, вы просто измените сценарий сборки проекта, чтобы справиться с этим (например, у вас могут быть такие команды, как * 1055).* или rake build:Coldfire
) и настройте отдельную конфигурацию сборки на сервере сборки для каждой цели.
Непрерывная интеграция
Таким образом, с этой системой вы получаете непрерывную интеграцию и запуск.Измените ваши сценарии сборки для запуска модульных тестов, а также для компиляции вашего проекта, и вы можете автоматически выполнять модульное тестирование после каждого изменения.Мотивом для этого является попытка выявить проблемы как можно раньше, так как вы развиваетесь, а не удивляетесь во время проверок.
Заключительные мысли
- Разработчики, не имеющие всех установок инструментальных цепочек, будут в некоторой степени зависеть от того, какую работу они выполняют чаще всего.Если бы это был я и моя работа была в основном на низком уровне, много взаимодействуя с аппаратным обеспечением, то отсутствие компиляторов на моей рабочей станции раздражало бы меня.С другой стороны, если я в основном работаю на уровне приложений и могу заглушить аппаратные зависимости, это может быть не такой проблемой.
- В TeamCity есть плагин для Eclipse с довольно интересной функцией.Вы можете делать личные сборки, что означает, что разработчики могут запускать сборку ожидающих изменений для любой заданной конфигурации сборки.Это означает, что разработчик инициирует сборку предварительно переданного кода на сервере сборки без необходимости фактически передавать свой код в SCM.Мы используем это для пробных изменений по сравнению с нашими текущими модульными тестами и статическим анализом, поскольку наши дорогие инструменты тестирования устанавливаются только на агенте сборки.
- Что касается доступа к артефактам сборки, когда «в дороге» я согласен, что-то вродеVPN в вашей интрасети, вероятно, самый простой вариант.