构建服务器:最佳实践管理第三方组件?(Build server: Best practices ma

2019-07-29 00:06发布

我保持了相当大的遗留应用程序。 源树是一个真正的混乱。 我试图建立一个构建服务器。

在源代码树,我有第三方组件与来源(也是该项目的包括路径)。 这些组件也安装在IDE中。

我的问题是:如何管理这些组件?

我认为管理是这样的:

  • 构建服务器上安装IDE
  • 安装所有的第三方组件
  • 从项目中移除源树中的组件源(并保持他们对项目的根上的专用文件夹中每个压缩)
  • 每次我们需要自定义(或调试)第三方组件,我们重新构建软件包,它在构建服务器的IDE重新安装(每个开发者工作站上)

什么是具有安装在IDE的组件,并具有在包括路径的源之间的区别? 链接器如何处理这种情况?

Answer 1:

我们已经建立了我们的每日构建使用简单的命令文件。

  1. 每个项目(.dpr)有关联的Build.cmd文件。
  2. 所有Build.cmd文件从我们的主要BuildServerRun.cmd文件调用。

该BuildServerRun.cmd文件需要照顾

  1. 删除的buildserver整个源代码树。
  2. 充分利用我们的源代码控制库中的最新版本。
  3. 调用每个Build.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到垃圾桶,因此-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


Answer 2:

我的回答是不是利芬的答案,这是德尔福特异性比较一般。 我写了这一个问题后不久,而是去了一个同事提交前;)

我拒绝安装我们的主要的Windows生成代理的任何IDE。 听起来像是一场噩梦给我。 MSBuild引擎处理所有的建设场景,其他一些比.NET,你只需要安装Windows SDK。 或者你可以使用楠甚至CMake的,等等。 只是不安装的IDE。 这不是构建服务器上的乐趣。

现在你已经标记这是德尔福。 我不知道它有多好作品出现,但列文写道,德尔福提供了命令行编译器。 我没有任何经验,它是如何与第三方compnents工作,但我认为德尔福MSBuild的支持在最新的版本。

我也不能确定是否包括THIRY方组件版本控制是一件好事,因为空间的需要 - 尽管你也可以把它们放在别的地方,并把它们作为外部,这使得它更小,同时还对问题升级组件为一个应用程序将升级他们 - 因此,你最好有很好的集成测试。 但是,这是一个构建服务器的角度反正。

除此之外,它始终是退房,并必须建立可用的应用程序所需的所有组件一件好事。 你不需要组件安装到一个IDE,如果他们作了很好。 根据它们是什么成分,在很多情况下,你甚至都不需要在开发机器上安装它们。 许多.NET组件,例如,当你添加一个引用到他们是在设计可用。 和许可通常是没有“把许可证文件在同一目录”不止。 嗯,这是应该的,至少。 如果这不是它如何在德尔福工作的今天,这是有可能的原因是德尔福在其出路之一。 除了Borland / Inprise公司/迪威/ CodeGear的/ Embarcadero的麻烦。



Answer 3:

这里类似的情况,幸好它没有一个大的混乱开始。 这是事实,真正的问题出在IDE配置,这需要指向第三方组件的正确版本,如果你检查出的旧版本。 我听到的唯一的解决办法是针对不同的产品发布配置使用不同的注册表分支。

这些组件都保存在一个单独的目录结构,并尽可能在目录名称中使用的版本号。 这使得更容易检查出旧版本,并有构建脚本指向正确的版本。

我们现在使用Apache Ant的作为主要构建工具多年,它确实我们需要的一切,包括单元测试调用和Innosetup脚本生成。

包编制只需要你用船的BPLs可执行文件,否则就不是一个构建服务器上的必要。

在IDE中安装组件也没有在生成服务器上必要的。



Answer 4:

您可以使用Owly CI工具。

它允许通过定义清单文件建立简单的方式的项目。 它还允许处理依赖关系 - 你可以在owlyci包包装第三方组件,并将其标记为依赖于主项目。

有一个例子 ,如何与詹金斯CI系统中使用它。



文章来源: Build server: Best practices managing third party components?