Сервер сборки: Лучшие практики, управляющие сторонними компонентами?

Jar-манифест позволяет вам указать не более одного основного класса. Это вызывается, когда вы выполняете java с флагом -jar.

java -jar myapp.jar

Вы можете включить несколько основных классов в один jar, но каждый (кроме необязательного 1 выше) должен вызываться с использованием флага -classpath и с указанием полного имени основного класса.

java -classpath myapp.jar com.mypackage.app.Main01 && \
  java -classpath myapp.jar com.mypackage.app.Main02 && \
  java -classpath myapp.jar com.mypackage.app.Main03

В приведенном выше примере будут созданы три отдельные виртуальные машины Java, каждая в своем собственном процессе. Очевидно, это не соответствует вашему требованию к «исполняемому банку».

В качестве альтернативы, вы можете захотеть иметь один основной метод, который запускает отдельные потоки, так что существует только один процесс, но одновременное выполнение.

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

10
задан Mogsdad 18 September 2015 в 04:02
поделиться

3 ответа

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

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

Файл BuildServerRun.cmd отвечает за

  1. Удаление всего дерева исходных текстов на сервере сборки.
  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"

Пример Build.cmd.

Примечание: у нас есть политика компиляции в 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
22
ответ дан 3 December 2019 в 16:10
поделиться

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

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

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

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

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

3
ответ дан 3 December 2019 в 16:10
поделиться

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

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

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

1
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: