Build server: рекомендации по управлению сторонними компонентами?

Я поддерживаю довольно большое устаревшее приложение. Дерево источников-настоящий беспорядок. Я пытаюсь настроить сервер сборки.

в дереве источника у меня есть сторонний компонент с источниками (также в пути включения проекта). Эти компоненты также устанавливаются в среде IDE.

мой вопрос : Как управлять этими компонентами ?

Я думал управлять таким образом:

  • установите IDE в сборке сервер
  • установите все сторонние компоненты
  • удалите источники компонентов из дерева источников проекта (и сохраните их в корневом каталоге проекта в выделенной папке, каждая из которых сжата)
  • каждый раз, когда нам нужно настроить (или отладить) сторонний компонент, мы перестраиваем пакет и повторно устанавливаем его в IDE сервера сборки (и на каждой рабочей станции разработчиков)

в чем разница между установкой компонентов в IDE и наличие источников в пути включения ? Как линкер справляется с этим делом ?

4 ответов


мы настроили наши ежедневные сборки с помощью простых командных файлов.

  1. каждый проект (.dpr) имеет связанную сборку.файл cmd.
  2. Все Построить.cmd файлы вызываются из нашей основной BuildServerRun.файл cmd.

BuildServerRun.cmd файл заботится о

  1. удаление всего исходного дерева на buildserver.
  2. получение последней версии из нашего репозитория управления версиями.
  3. вызов каждой сборки.cmd и передайте выходные данные в файл.
  4. отправить результаты всем разработчикам.

все пути к внешним компонентам настроены в dcc32.файл cfg

..    
-u"c:\Program files\Developer Express Inc\ExpressInplaceEditors\Delphi 5\Lib"
-u"c:\Program files\Developer Express Inc\ExpressQuantumGrid\Delphi 5\Lib"
..
-r"c:\Program Files\Borland\Delphi5\Lib"
-r"C:\Program Files\jvcl\jvcl\resources"
..
-i"C:\Program Files\jvcl\jvcl\run"
-i"C:\Program Files\jvcl\jcl\source"

пример построения.УМК.

Примечание: у нас есть политика для компиляции в bin\dcu, exe в bin, следовательно, директивы-N,- E.

@echo on
dcc32speed -B -Q -W -H -Nbin\dcu -Ebin BpABA.dpr
@echo off

пример обрезанного BuildServerRun.cmd

SET %Drive%=E:

:BuildServer
REM *************************************************
REM     Clear files
REM *************************************************
ECHO. > "%Temp%\BuildLieven.txt"
ECHO. > "%Temp%\TestRunLieven.txt"

REM *************************************************
REM     Set start time
REM *************************************************
echo | TIME | FIND "Huidige tijd" > "%Temp%\ResultLieven.txt"

REM *************************************************
REM     Get latest versions
REM *************************************************
IF %LatestVersion%==1 CALL %Drive%\buildserver\latestversion.cmd
ECHO "Latest versions opgehaald" >> "%Temp%\ResultLieven.txt"

REM *************************************************
REM     Build projects
REM *************************************************
CD %Drive%\Projects\

ECHO ***************************************************************** >> "%Temp%\BuildLieven.txt"
ECHO BpABA >> "%Temp%\BuildLieven.txt"
ECHO ***************************************************************** >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\production
ECHO Building BPABA\production
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\test
ECHO Building BPABA\test
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\test\dunit
ECHO Building BPABA\test\dunit
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
ECHO BPABATests >> "%Temp%\TestRunLieven.txt"
ECHO Running BPABATests
CALL bin\BPABATests >> "%Temp%\TestRunLieven.txt"
CD %Drive%\Projects
ECHO. >> "%Temp%\BuildLieven.txt"
ECHO. >> "%Temp%\BuildLieven.txt"
ECHO. >> "%Temp%\BuildLieven.txt"

REM *****************************************************************
REM     Gather (Fatal)Errors/Hints/Warnings & Failures
REM *****************************************************************
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO (Fatal)Errors/Hints/Warnings en Failures >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Fatal errors during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Fatal:" >> "%Temp%\ResultLieven.txt"


ECHO Errors during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Error:" >> "%Temp%\ResultLieven.txt"

ECHO Warnings during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Warning:" >> "%Temp%\ResultLieven.txt"

ECHO Hints during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Hint:" >> "%Temp%\ResultLieven.txt"

ECHO Failures during test >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND /c "Failures:" >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"

ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Controle #Projecten = #Compiles >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO #Projecten >> "%Temp%\ResultLieven.txt"
TYPE "%Drive%\buildserver\buildserverrun.cmd" | FIND /i "cmd >> " | FIND /i "Lieven" | FIND /i /v /c "FIND /i /v /c" >> "%Temp%\ResultLieven.txt"
ECHO #Compiles >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\buildLieven.txt" | FIND /i /c "dcc32" >> "%Temp%\ResultLieven.txt"
ECHO #Tests expected to run >> "%Temp%\ResultLieven.txt"
TYPE "%Drive%\buildserver\buildserverrun.cmd" | FIND /i "TestRunLieven" | FIND /i "CALL" | FIND /i /v /c "FIND /i /v /c" >> "%Temp%\ResultLieven.txt"
ECHO #Tests actually run >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND /i /c "DUnit / Testing" >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"

ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Detail (Fatal)Errors/Hints/Warnings en Failures >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Fatal:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Error:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Warning:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Hint:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND "Failures:" >> "%Temp%\ResultLieven.txt"

REM *************************************************
REM     Set stop time
REM *************************************************
ECHO | TIME | FIND "Huidige tijd" >> "%Temp%\ResultLieven.txt"

REM *************************************************
REM     Send results
REM *************************************************
CALL %drive%\buildserver\Blat.cmd

мой ответ более общий, чем ответ Ливена, который специфичен для Дельфи. Я написал это вскоре после вопроса, но пошел к коллеге перед отправкой;)

Я отказываюсь устанавливать любую IDE на нашем основном агенте сборки Windows. Звучит как кошмар для меня. MSBuild engine хорошо обрабатывает все сценарии сборки, и, кроме .NET, вам просто нужно установить Windows SDK. Или вы можете использовать NAnt и даже CMake, что угодно. Просто не устанавливайте IDEs. Это не весело на build сервера.

теперь вы пометили это как Delphi. Я не знаю, насколько хорошо это работает, но, как писал Ливен, Delphi поставляется с компилятором командной строки. У меня просто нет опыта работы с сторонними компнентами, но я думаю, что Delphi поддерживает MSBuild в последней версии.

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

кроме того, всегда полезно проверить и иметь все компоненты, необходимые для создания приложения. Вам не нужно устанавливать компоненты в IDE, если они были сделаны хорошо. В зависимости от того, какими компонентами они являются, во многих случаи, которые вам даже не нужно устанавливать на машинах разработчика. Например, многие компоненты .NET доступны в конструкторе при добавлении ссылки на них. И лицензирование, как правило, не более чем "поместить файл лицензии в тот же каталог". По крайней мере, так должно быть. Если это не так, как это работает в Дельфах сегодня, это, вероятно, одна из причин Delphi на своем пути. Кроме Borland/Inprise/DevCo/Codegear/Embarcadero хлопот.


аналогичная ситуация здесь, к счастью, она не началась с большого беспорядка. Это правда, что реальная проблема заключается в конфигурации IDE, которая должна указывать на правильные версии сторонних компонентов, если вы проверяете более старую версию. Единственное решение, о котором я слышал, - это использование разных ветвей реестра для разных конфигураций выпуска продукта.

компоненты хранятся в отдельной структуре каталогов, и использовать номера версий в каталоге имена, когда это возможно. Это упрощает проверку старых версий и позволяет сценариям сборки указывать правильную версию.

мы используем Apache Ant в качестве основного инструмента сборки в течение многих лет, и он действительно делает все, что нам нужно, включая вызов модульного теста и создание сценария Innosetup.

компиляция пакетов необходима только вы отправляете исполняемый файл с BPLs, иначе это не нужно на сервере сборки.

установка компонентов в IDE также не требуется на сервере сборки.


можно использовать Owly CI.

Это позволяет легко создавать проекты, определяя файл манифеста. Он также позволяет обрабатывать зависимости - вы можете обернуть сторонние компоненты в пакеты owlyci и пометить их как зависимости от основного проекта.

есть пример, Как использовать его с системой Jenkins CI.