分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

CI学习 CCNET Config 第一天

发布时间:2023-09-06 01:30责任编辑:蔡小小关键词:暂无标签

CCNet的整体结构就是一个Xml文档,根元素就是cruisecontrol,具体的代码块如下所示:

[html] view plain copy print?
  1. <cruisecontrolxmlns:cb="urn:ccnet.config.builder">
  2. <projectname="P1">
  3. <othersettings/>
  4. </project>
  5. <projectname="P2">
  6. <othersettings/>
  7. </project>
  8. </cruisecontrol>
<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> ????<project name="P1"> ????????<other settings /> ????</project> ????<project name="P2"> ????????<other settings /> ????</project></cruisecontrol>

其中,命名空间标定了CCNet里面的预处理过程(Preprocessor)。

一、预处理:Preprocessor

预处理里面包含三个主要元素:define、include和scope,define用于定义以后扩展的常量、include用于包含其他文件的类容,而scope用于封装现存的常量的值。

1、define元素

define元素可以用来定义一个预处理(Preprocessor)常量。如下所示:

[html] view plain copy print?
  1. <cb:definefoo="bar"/>
 <cb:define foo="bar" />

也可以在一行中定义多个常量:

[html] view plain copy print?
  1. <cb:definea="1"b="2"c="3"/>
<cb:define a="1" b="2" c="3"/>


还可以定义一个xml段:

[html] view plain copy print?
  1. <cb:definename="baz">
  2. <some_element>
  3. <some_inner_element/>
  4. </some_element>
  5. </cb:define>
<cb:define name="baz"> ?<some_element> ???<some_inner_element/> ?</some_element></cb:define>

任何有效的xml代码元素都可以包含其中,包括元素、属性、文本节点和注释等。

有两种方式来使用定义的常量:文本引用和xml引用

1)、文本引用的方式如下:$(const_name)

如果常量未定义,系统将搜索系统变量来替换;如果系统变量也不存在,将引发错误。

[html] view plain copy print?
  1. <pre><code><span><span><cb:define</span><span>foo</span>=<span><span>"</span><span>bar</span><span>"</span></span><span>/></span></span></code>
<pre><code ><span ><span ><cb:define</span> <span >foo</span>=<span ><span >"</span><span >bar</span><span >"</span></span><span >/></span></span></code>

<somexml attr1="$(foo)"/>

<somexml>$(foo)</somexml>
<env dir="$(PATH)"/>

2)、xml引用的方式如下:

如果常量未定义,系统将搜索系统变量来替换;如果系统变量也不存在,将引发错误。

[html] view plain copy print?
  1. <cb:definefoo="bar"/>
  2. <sample>
  3. <cb:foo/>
  4. </sample>
<cb:define foo="bar"/><sample> ?<cb:foo/></sample>


其效果是直接替换被引用的值,上面结果如下:

[html] view plain copy print?
  1. <sample>
  2. bar
  3. </sample>
<sample> ?bar</sample>

3)、常量的嵌套以及参数

常量引用可以嵌套使用,如下所示:

[html] view plain copy print?
  1. <cb:definealpha="alphaval"/>
  2. <cb:definezed="zedval/$(alpha)"/>
  3. <z>$(zed)</z>
<cb:define alpha="alphaval"/><cb:define zed="zedval/$(alpha)"/><z>$(zed)</z>

在高层次的嵌套时,在cb:varname这种语法中,常量值是可以传递到调用的元素中去的,如下面的例子:

[html] view plain copy print?
  1. <cb:definename="beta">
  2. <hello>
  3. <cb:gamma/>
  4. <hiattr1="$(delta)"/>
  5. </hello>
  6. </cb:define>
<cb:define name="beta"> ?<hello> ???<cb:gamma/> ???<hi attr1="$(delta)"/> ?</hello></cb:define>


此时的gamma和delta都还没有定义

[html] view plain copy print?
  1. <cb:betadelta="deltaval">
  2. <cb:definename="gamma">
  3. <gamma_element>hi</gamma_element>
  4. </cb:define>
  5. </cb:beta>
<cb:beta delta="deltaval"> ?<cb:define name="gamma"> ???<gamma_element>hi</gamma_element> ?</cb:define></cb:beta>

在定义了如下xml段之后,gamma就可以正常被替换了,而且上面没有定义的delta常量,也会通过cb:deta定义的delta常量所替换。最终结果如下:

[html] view plain copy print?
  1. <hello>
  2. <gamma_element>hi</gamma_element>
  3. <hiattr1="deltaval"/>
  4. </hello>
<hello> ?<gamma_element>hi</gamma_element> ?<hi attr1="deltaval" /></hello>


2、Scope元素

Scope用于控制预处理定义中的范围,在同一个范围里面不可以定义相同的常量,但是在嵌套的范围里面,可以覆盖外层定义的常量,这一点和程序里面的代码段很像。

如下定义:

[html] view plain copy print?
  1. <cb:scopea="a_val"b="b_val">
  2. <testattr="$(a)"attr2="$(b)"/>
  3. <cb:scopea="a_val_redefined">
  4. <testattr="$(a)"attr2="$(b)"/>
  5. </cb:scope>
  6. </cb:scope>
<cb:scope a="a_val" b="b_val"> ?<test attr="$(a)" attr2="$(b)"/> ?<cb:scope a="a_val_redefined"> ???<test attr="$(a)" attr2="$(b)"/> ?</cb:scope></cb:scope>

其结果为:

[html] view plain copy print?
  1. <testattr="a_val"att2="b_val"/>
  2. <testattr="a_val_redefined"att2="b_val"/>
<test attr="a_val" att2="b_val"/><test attr="a_val_redefined" att2="b_val"/>

其中就覆盖了外层的a常量。

可以将scope应用于CCNet配置文件的Project元素,示例如下:

[html] view plain copy print?
  1. <cruisecontrolxmlns:cb="urn:ccnet.config.builder">
  2. <cb:defineWorkingMainDir="C:\Integration\"/>
  3. <cb:defineWorkingDir="\WorkingDirectory"/>
  4. <cb:defineArtifactsDir="\Artifacts"/>
  5. <cb:scopeProjectName="Alpha">
  6. <projectname="$(ProjectName)"queue="Q1"queuePriority="1">
  7. <workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory>
  8. <artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory>
  9. </project>
  10. </cb:scope>
  11. <cb:scopeProjectName="Beta">
  12. <projectname="$(ProjectName)"queue="Q1"queuePriority="1">
  13. <workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory>
  14. <artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory>
  15. </project>
  16. </cb:scope>
  17. </cruisecontrol>
<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> ??<cb:define WorkingMainDir="C:\Integration\"/> ??<cb:define WorkingDir="\WorkingDirectory"/> ??<cb:define ArtifactsDir="\Artifacts"/> ???<cb:scope ProjectName="Alpha"> ????<project name="$(ProjectName)" queue="Q1" queuePriority="1"> ??????<workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory> ??????<artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory> ???</project> ?</cb:scope> ?<cb:scope ProjectName="Beta"> ???<project name="$(ProjectName)" queue="Q1" queuePriority="1"> ?????<workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory> ?????<artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory> ???</project> ?</cb:scope></cruisecontrol>

而其结果则为:

[html] view plain copy print?
  1. <cruisecontrol>
  2. <projectname="Alpha"queue="Q1"queuePriority="1">
  3. <workingDirectory>C:\Integration\Alpha\WorkingDirectory</workingDirectory>
  4. <artifactDirectory>C:\Integration\Alpha\Artifacts</artifactDirectory>
  5. </project>
  6. <projectname="Beta"queue="Q1"queuePriority="1">
  7. <workingDirectory>C:\Integration\Beta\WorkingDirectory</workingDirectory>
  8. <artifactDirectory>C:\Integration\Beta\Artifacts</artifactDirectory>
  9. </project>
  10. </cruisecontrol>
<cruisecontrol> ?????<project name="Alpha" queue="Q1" queuePriority="1"> ??????<workingDirectory>C:\Integration\Alpha\WorkingDirectory</workingDirectory> ??????<artifactDirectory>C:\Integration\Alpha\Artifacts</artifactDirectory> ????</project> ?????<project name="Beta" queue="Q1" queuePriority="1"> ?????<workingDirectory>C:\Integration\Beta\WorkingDirectory</workingDirectory> ?????<artifactDirectory>C:\Integration\Beta\Artifacts</artifactDirectory> ???</project></cruisecontrol>

通过scope,一个变通的定义方式如下:

[html] view plain copy print?
  1. <cruisecontrolxmlns:cb="urn:ccnet.config.builder">
  2. <cb:defineWorkingMainDir="C:\Integration\"/>
  3. <cb:defineWorkingDir="\WorkingDirectory"/>
  4. <cb:defineArtifactsDir="\Artifacts"/>
  5. <cb:definename="OurProject">
  6. <projectname="$(ProjectName)"queue="Q1"queuePriority="1">
  7. <workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory>
  8. <artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory>
  9. </project>
  10. </cb:define>
  11. <cb:scopeProjectName="Alpha">
  12. <cb:OurProject/>
  13. </cb:scope>
  14. <cb:scopeProjectName="Beta">
  15. <cb:OurProject/>
  16. </cb:scope>
  17. </cruisecontrol>
<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> ?<cb:define WorkingMainDir="C:\Integration\"/> ?<cb:define WorkingDir="\WorkingDirectory"/> ?<cb:define ArtifactsDir="\Artifacts"/> ??<cb:define name="OurProject"> ???<project name="$(ProjectName)" queue="Q1" queuePriority="1"> ?????<workingDirectory>$(WorkingMainDir)$(ProjectName)$(WorkingDir)</workingDirectory> ?????<artifactDirectory>$(WorkingMainDir)$(ProjectName)$(ArtifactsDir)</artifactDirectory> ??</project> </cb:define> <cb:scope ProjectName="Alpha"> ??<cb:OurProject/> </cb:scope> <cb:scope ProjectName="Beta"> ??<cb:OurProject/> </cb:scope></cruisecontrol>

这样则较大的提高了配置的可维护性。

3、include元素

include元素用来包含其他的文件内容,include中根据ccnet.config文件为基准路径进行相对定位,这样就可以在ccnet.config文件里面调用所有其他文件定义的部分,以提高可维护性。如下所示:

[html] view plain copy print?
  1. <cruisecontrolxmlns:cb="urn:ccnet.config.builder">
  2. <cb:includehref="Definitions.xml"xmlns:cb="urn:ccnet.config.builder"/>
  3. <cb:includehref="CI_Projects.xml"xmlns:cb="urn:ccnet.config.builder"/>
  4. <cb:includehref="QA_Projects.xml"xmlns:cb="urn:ccnet.config.builder"/>
  5. </cruisecontrol>
<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> ???<cb:include href="Definitions.xml" xmlns:cb="urn:ccnet.config.builder"/> ???<cb:include href="CI_Projects.xml" xmlns:cb="urn:ccnet.config.builder"/> ???<cb:include href="QA_Projects.xml" xmlns:cb="urn:ccnet.config.builder"/> ?</cruisecontrol>

其中Definitions.xml文件定义如下:

[html] view plain copy print?
  1. <cb:config-templatexmlns:cb="urn:ccnet.config.builder">
  2. <queuename="Q1"duplicates="UseFirst"lockqueues="Q2,Q4"/>
  3. <cb:definename="EmailPublisher">
  4. <emailfrom="buildmaster@mycompany.com"
  5. mailhost="localhost"
  6. mailhostUsername="TheMailer"
  7. mailhostPassword="JohnWayne"
  8. includeDetails="TRUE">
  9. <users/>
  10. <groups/>
  11. <modifierNotificationTypes>
  12. <NotificationType>Failed</NotificationType>
  13. <NotificationType>Fixed</NotificationType>
  14. </modifierNotificationTypes>
  15. </email>
  16. </cb:define>
  17. <cb:definename="common_publishers">
  18. <artifactcleanupcleanUpMethod="KeepMaximumXHistoryDataEntries"cleanUpValue="500"/>
  19. <xmllogger/>
  20. <statistics/>
  21. <modificationHistoryonlyLogWhenChangesFound="true"/>
  22. <rss/>
  23. </cb:define>
  24. <cb:definename="common_nant">
  25. <executable>c:\nant\nant.exe</executable>
  26. <nologo>true</nologo>
  27. <buildTimeoutSeconds>240</buildTimeoutSeconds>
  28. </cb:define>
  29. <cb:definename="nant_args_CI">
  30. <buildArgs>cleancompile</buildArgs>
  31. </cb:define>
  32. </cb:config-template>
<cb:config-template xmlns:cb="urn:ccnet.config.builder"> ?<queue name="Q1" duplicates="UseFirst" lockqueues="Q2, Q4" /> ?<cb:define name="EmailPublisher"> ???<email from="buildmaster@mycompany.com" ??????????mailhost="localhost" ??????????mailhostUsername="TheMailer" ??????????mailhostPassword="JohnWayne" ??????????includeDetails="TRUE"> ???<users /> ???????<groups /> ???????<modifierNotificationTypes> ?????????<NotificationType>Failed</NotificationType> ?????????<NotificationType>Fixed</NotificationType> ???????</modifierNotificationTypes> ???</email> ?</cb:define> ?<cb:define name="common_publishers"> ???<artifactcleanup cleanUpMethod="KeepMaximumXHistoryDataEntries" cleanUpValue="500" /> ???<xmllogger /> ???<statistics /> ???<modificationHistory ?onlyLogWhenChangesFound="true" /> ???<rss/> ?</cb:define> ?<cb:define name="common_nant"> ??????<executable>c:\nant\nant.exe</executable> ??????<nologo>true</nologo> ???<buildTimeoutSeconds>240</buildTimeoutSeconds> ?</cb:define> ?<cb:define name="nant_args_CI"> ?????<buildArgs>clean compile</buildArgs> ?</cb:define></cb:config-template>


在Definitions.xml文件里面,需要使用db:config-template作为根元素使用。

本文转载自:http://blog.csdn.net/yant255/article/details/43306227

CI学习 CCNET Config 第一天

原文地址:http://www.cnblogs.com/majianchao/p/8024513.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved