CI学习 CCNET Config 第一天
CCNet的整体结构就是一个Xml文档,根元素就是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)常量。如下所示:
<cb:define foo="bar" />
也可以在一行中定义多个常量:
<cb:define a="1" b="2" c="3"/>
还可以定义一个xml段:
<cb:define name="baz">
<some_element>
<some_inner_element/>
</some_element>
</cb:define>
任何有效的xml代码元素都可以包含其中,包括元素、属性、文本节点和注释等。
有两种方式来使用定义的常量:文本引用和xml引用
1)、文本引用的方式如下:$(const_name)
如果常量未定义,系统将搜索系统变量来替换;如果系统变量也不存在,将引发错误。
<pre><code class="xml syntaxhl"><span class="CodeRay"><span class="tag"><cb:define</span> <span class="attribute-name">foo</span>=<span class="string"><span class="delimiter">"</span><span class="content">bar</span><span class="delimiter">"</span></span><span class="tag">/></span></span></code>
<somexml attr1="$(foo)"/>
<somexml>$(foo)</somexml>
<env dir="$(PATH)"/>
2)、xml引用的方式如下:
如果常量未定义,系统将搜索系统变量来替换;如果系统变量也不存在,将引发错误。
<cb:define foo="bar"/>
<sample>
<cb:foo/>
</sample>
其效果是直接替换被引用的值,上面结果如下:
[html] view plain copy
- <sample>
- bar
- </sample>
<sample>
bar
</sample>
3)、常量的嵌套以及参数
常量引用可以嵌套使用,如下所示:
<cb:define alpha="alphaval"/>
<cb:define zed="zedval/$(alpha)"/>
<z>$(zed)</z>
在高层次的嵌套时,在cb:varname这种语法中,常量值是可以传递到调用的元素中去的,如下面的例子:
<cb:define name="beta">
<hello>
<cb:gamma/>
<hi attr1="$(delta)"/>
</hello>
</cb:define>
此时的gamma和delta都还没有定义
<cb:beta delta="deltaval">
<cb:define name="gamma">
<gamma_element>hi</gamma_element>
</cb:define>
</cb:beta>
在定义了如下xml段之后,gamma就可以正常被替换了,而且上面没有定义的delta常量,也会通过cb:deta定义的delta常量所替换。最终结果如下:
<hello>
<gamma_element>hi</gamma_element>
<hi attr1="deltaval" />
</hello>
2、Scope元素
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>
其结果为:
<test attr="a_val" att2="b_val"/>
<test attr="a_val_redefined" att2="b_val"/>
其中就覆盖了外层的a常量。
可
<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>
而其结果则为:
<cruisecontrol>
<project name="Alpha" queue="Q1" queuePriority="1">
<workingDirectory>C:IntegrationAlphaWorkingDirectory</workingDirectory>
<artifactDirectory>C:IntegrationAlphaArtifacts</artifactDirectory>
</project>
<project name="Beta" queue="Q1" queuePriority="1">
<workingDirectory>C:IntegrationBetaWorkingDirectory</workingDirectory>
<artifactDirectory>C:IntegrationBetaArtifacts</artifactDirectory>
</project>
</cruisecontrol>
通过scope,一个变通的定义方式如下:
<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文件里面调用所有其他文件定义的部分,以提高可维护性。如下所示:
<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文件定义如下:
<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:nantnant.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>
- 设计模式专题(三)——装饰模式
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件继承时需要注意的问题扩展类型如何修改已有类型
- ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方
- 设计模式专题(四)——代理模式
- Array数组函数(一)
- ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
- 使用 Octave 来学习 Machine Learning(一)
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- 讲真,你该做备份的有效性校验了
- memcache安装方法
- 设计模式专题(五)——工厂方法模式
- ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支持成员功能控制成员脚本控件支持成员ScriptMode和ScriptPathLoadScriptsBeforeU
- SQL Server 2016新特性:动态数据屏蔽(DDM)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 全网首发:12306抢票算法大曝光?(十张图搞定)
- 全网首发:12306抢票算法大曝光?(勘误)
- 新一代垃圾回收器ZGC的探索与实践
- Python GUI项目实战(一)登录窗体的设计与实现
- Python GUI项目实战(二)主窗体的界面设计与实现
- Python GUI项目实战(三)实现信息查询功能
- 在 Kubernetes 上使用 Argo 实现 CI/CD
- 微信小程序:授权登录 + 基于token的身份验证详解
- 「最强」Lettuce 已支持 Redis6 客户端缓存
- Go中校验一个字符串是否是有效的JSON字符串
- 在 Vue 中,如何从插槽中发出数据
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
- 这样的奇技淫巧,劝你不用也罢
- 我服务又双叒叕奔溃了,含泪干货分享
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)