从 《【Hello CC.NET】CC.NET 实现自动化集成》 到 《【Hello CC.NET】自动化发布时 Web.config 文件维护》 ,大神在评论里提到的方案还没有一一去研究对比,调研的 deadline 已经逼近,CC.NET 的落地提上日程。

  经过两周的努力,终于成功部署了两个项目,由于两个项目的人员配置/开发流程/项目架构不一样,部署的方案也有些差异。过程中碰到这样那样的坑,都是用最快想到的笨方法填坑,然后继续往下走。落地的姿势并不完美,但总算有了一些看得到的成果。   

  落地面临的第一个问题是,ccnet.config 配置比较繁复:太多的 hardcode;相同的 xml 节点内容比较多,尤其在配置多个项目的时候,策略变更时,需要改动的地方比较多。本文将讲述 ccnet.config 模板化的思路。

  

  目标

  • 提取全局性的配置,避免到处 Hardcode
  • 简化各个节点的配置,便于维护

  1.全局变量

  1. <cc:define CIWebSite="http://vm-caihaihua/CCNET/"/>
  2. <cc:define CIDirectory="C:\CI\"/>
  3. <cc:define MsBuildPath="C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"/>
  4. <cc:define MsTestPath="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"/>
  5. <cc:define SVNPath="C:\Program Files (x86)\VisualSVN Server\bin\svn.exe"/>
  6. <cc:define FCReplacerPath="C:\CI\Tools\FCReplacer.exe"/>
  7. <cc:define DFCopierPath="C:\CI\Tools\DFCopier.exe"/>
  8. <cc:define name="MsBuildXmlLogger">
  9. <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
  10. </cc:define>

  

变量名称 描述
CIWebSite CC.NET配套网站的地址 http://vm-caihaihua/CCNET/
CIDirectory 工作目录 C:\CI\
MsBuildPath MsBuild 程序的地址 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
MsTestPath MsTest 程序的地址 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe
SVNPath Svn 程序的地址 C:\Program Files (x86)\VisualSVN Server\bin\svn.exe
FCReplacerPath FCReplacer 程序的地址 C:\CI\Tools\FCReplacer.exe
DFCopierPath DFCopier 程序的地址 C:\CI\Tools\DFCopier.exe
MsBuildXmlLogger 日志 Logger 的配置 <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>

 

  2.默认值

  1. <!-- 默认配置 -->
  2. <cc:define QueuePriority="1"/>
  3. <cc:define KeepLastXBuilds="300"/>
  4. <!-- Email 相关 -->
  5. <cc:define EmailDomain="company.com"/>
  6. <cc:define EmailSendHost="smtp.live.com"/>
  7. <cc:define EmailSendPort="25"/>
  8. <cc:define EmailUseSSL="FALSE"/>
  9. <cc:define EmailSendUser="ci"/>
  10. <cc:define EmailSendPassword="********"/>
  11. <cc:define CIEmailUser="ci"/>
  12. <cc:define PMEmailUser="pm_1"/>
  13. <cc:define name="EmailTesterList">
  14. <user group="tester" name="tester_1" address="tester_1@$(EmailDomain)"/>
  15. <user group="tester" name="tester_2" address="tester_2@$(EmailDomain)"/>
  16. </cc:define>
  17. <!-- Trigger 相关 -->
  18. <cc:define ModificationTriggerIntervalSeconds="300"/>
  19. <cc:define ModificationDelaySeconds="60"/>
  20. <cc:define ProjectTriggerIntervalSeconds="30"/>
  21. <cc:define ProjectTriggerStatus="Success"/>
  22. <cc:define DailyBuildTriggerTime="18:00"/>
  23. <!-- SVN 相关 -->
  24. <cc:define SVNUsername="ci"/>
  25. <cc:define SVNPassword="********"/>
  26. <cc:define SvnCleanCopy="FALSE"/>
  27. <cc:define name="SourceControl">
  28. </cc:define>
  29. <!-- Task 相关 -->
  30. <cc:define TestTimeout="1800"/>
  31. <cc:define CopyTimeout="60"/>
  32. <cc:define ReplaceTimeout="60"/>
  33. <cc:define BuildConfiguration="DEBUG"/>
  34. <cc:define PublishConfiguration="RELEASE"/>

    

变量名称 描述
QueuePriority  项目在队列中的优先级  1
KeepLastXBuilds  保留最后的 X 个构建结果  300
EmailDomain  公司邮箱域名  company.com
EmailSendHost  邮箱服务器地址  smtp.live.com
EmailSendPort  邮箱服务器端口  25
EmailUseSSL  是否启用 SSL  TRUE
EmailSendUser  发送邮箱的帐号  ci
EmailSendPassword  发送邮箱账户的密码  ******
 CIEmailUser  CI 维护人员的邮箱账户  ci
 PMEmailUser  部门经理的邮箱账户  pm_1
 EmailTesterList  测试人员邮箱列表

<user group="tester" name="tester_1" address="tester_1@$(EmailDomain)"/>

<user group="tester" name="tester_2" address="tester_2@$(EmailDomain)"/>

 ModificationTriggerIntervalSeconds  源代码监测的频率(秒)  300
 ModificationDelaySeconds  源代码变更触发构建任务的延迟时间(秒)  60
 ProjectTriggerIntervalSeconds  依赖项目的状态监测频率(秒)  30
 ProjectTriggerStatus  依赖项目的设定状态  SUCCESS
 DailyBuildTriggerTime  每日构建的时间点  18:00
 SVNUsername  SVN 帐号  ci
 SVNPassword  SVN 帐号的密码  ******
 SvnCleanCopy  下载源代码前是否先删除本地源代码  FALSE
 SourceControl  源代码管理的配置  
 TestTimeout  运行测试的超时时间(秒)  1800
 CopyTimeout  拷贝文件的超时时间(秒)  60
 ReplaceTimeout  替换文件内容的超时时间(秒)  60
 BuildConfiguration  编译的配置  DEBUG
 PublishConfiguration  发布网站的配置  RELEASE

  

  

  3.通知模板

  1. <cc:define name="EmailPublisher">
  2. <email mailhost="$(EmailSendHost)" mailport="$(EmailSendPort)"
  3. mailhostUsername="$(EmailSendUser)@$(EmailDomain)" mailhostPassword="$(EmailSendPassword)"
  4. from="$(EmailSendUser)@$(EmailDomain)"
  5. useSSL="$(EmailUseSSL)" includeDetails="true">
  6. <!--邮件标题配置-->
  7. <subjectPrefix>$(EmailSubject)</subjectPrefix>
  8. <subjectSettings>
  9. <!-- Success/Broken/StillBroken/Fixed/Exception-->
  10. <subject buildResult="Success" value="${CCNetProject} Build result"/>
  11. <subject buildResult="Fixed" value="${CCNetProject} Build result"/>
  12. <subject buildResult="Broken" value="${CCNetProject} Build result"/>
  13. <subject buildResult="StillBroken" value="${CCNetProject} Build result" />
  14. <subject buildResult="Exception" value="${CCNetProject} Build result" />
  15. </subjectSettings>
  16. <!--收件人配置-->
  17. <converters>
  18. <rcgexConverter find="$" replace="@$(EmailDomain)"/>
  19. </converters>
  20. <modifierNotificationTypes>
  21. <notificationType>Failed</notificationType>
  22. <notificationType>Fixed</notificationType>
  23. </modifierNotificationTypes>
  24. <users>
  25. <user group="pm" name="$(PMEmailUser)" address="$(PMEmailUser)@$(EmailDomain)"/>
  26. <user group="ci" name="$(CIEmailUser)" address="$(CIEmailUser)@$(EmailDomain)"/>
  27. <user group="tl" name="$(TeamLeader)" address="$(TeamLeader)@$(EmailDomain)"/>
  28. <cc:EmailTesterList/>
  29. </users>
  30. <groups>
  31. <group name="pm">
  32. <notifications>
  33. <!--Always/Success/Change/Fixed/Failed/Exception -->
  34. <notificationType>Change</notificationType>
  35. </notifications>
  36. </group>
  37. <group name="ci">
  38. <notifications>
  39. <notificationType>Exception</notificationType>
  40. </notifications>
  41. </group>
  42. <group name="tl">
  43. <notifications>
  44. <notificationType>Success</notificationType>
  45. <notificationType>Fixed</notificationType>
  46. <notificationType>Failed</notificationType>
  47. </notifications>
  48. </group>
  49. <group name="developer">
  50. <notifications>
  51. <notificationType>Success</notificationType>
  52. <notificationType>Fixed</notificationType>
  53. <notificationType>Failed</notificationType>
  54. </notifications>
  55. </group>
  56. <group name="tester">
  57. <notifications>
  58. <notificationType>Fixed</notificationType>
  59. </notifications>
  60. </group>
  61. </groups>
  62. </email>
  63. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
EmailDomain 公司邮箱域名  company.com  N
EmailSendHost 邮件服务器的地址  smtp.live.com  N
EmailSendPort 邮件服务器的端口  25  N
EmailUseSSL 是否使用 SSL(取决于邮件服务器的配置)  TRUE  N
EmailSendUser 邮件通知的发送帐号  CI  N
EmailSendPassword 邮件通知的发送帐号的密码  ******  N
PMEmailUser 部门经理的邮箱帐号  pm_1  N
CIEmailUser CI 环境维护人员的邮箱帐号  ci  N
TeamLeader 项目组负责人的邮箱帐号,各个项目组配置不同    Y
EmailSubject 邮件通知的前缀    Y

  

  例子:  

  1. <publishers>
  2. <!--邮件通知-->
  3. <cc:EmailPublisher/>
  4. </publishers>

  4.触发器模板

  (1)源代码检测:每隔一段时间检查源代码,如果有变更,则触发构建过程

  1. <!-- Triggers:ModificationTrigger/DailyBuildTrigger/ProjectTrigger-->
  2. <cc:define name="ModificationTrigger">
  3. <!--源码修改触发-->
  4. <intervalTrigger seconds="$(ModificationTriggerIntervalSeconds)" buildCondition="IfModificationExists" />
  5. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
ModificationTriggerIntervalSeconds 源码监测频率(秒) 600 N

  

  例子:

  1. <triggers>
  2. <cc:ModificationTrigger/>
  3. </triggers>

  (2)每日构建:每天到设定的时间点触发构建过程

  1. <cc:define name="DailyBuildTrigger">
  2. <!--每日构建-->
  3. <scheduleTrigger time="$(DailyBuildTriggerTime)" buildCondition="ForceBuild">
  4. <weekDays>
  5. <!--<weekDay>Sunday</weekDay>-->
  6. <weekDay>Monday</weekDay>
  7. <weekDay>Tuesday</weekDay>
  8. <weekDay>Wednesday</weekDay>
  9. <weekDay>Thursday</weekDay>
  10. <weekDay>Friday</weekDay>
  11. <!--<weekDay>Saturday</weekDay>-->
  12. </weekDays>
  13. </scheduleTrigger>
  14. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
DailyBuildTriggerTime 每日构建的时间点 18:00 N

  

  例子:

  1. <triggers>
  2. <cc:DailyBuildTrigger/>
  3. </triggers>

  (3)项目依赖:每隔一段时间检查指定项目的构建结果,如果等于指定值,则触发构建过程

  1. <cc:define name="ProjectTrigger">
  2. <projectTrigger serverUri="tcp://vm-caihaihua:21234/CruiseManager.rem" project="$(ListenToProject)">
  3. <triggerStatus>$(ProjectTriggerStatus)</triggerStatus>
  4. <innerTrigger type="intervalTrigger" seconds="$(ProjectTriggerIntervalSeconds)" buildCondition="ForceBuild" />
  5. <!--<triggerFirstTime>True</triggerFirstTime>-->
  6. </projectTrigger>
  7. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
ProjectTriggerIntervalSeconds 监测依赖项目的频率(秒) 30 N
ProjectTriggerStatus 设定的构建结果 SUCCESS N
ListenToProject 依赖的项目名称   Y

  

  例子:

  1. <triggers>
  2. <cc:ProjectTrigger ListenToProject="TestProject-Servcies"/>
  3. </triggers>

  5.源代码管理模板

  1. <!-- SourceControl: SVNSourceControl -->
  2. <cc:define name="SVNSourceControl">
  3. <sourcecontrol type="svn">
  4. <trunkUrl>$(SVNTrunkURL)</trunkUrl>
  5. <executable>$(SVNPath)</executable>
  6. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  7. <username>$(SVNUsername)</username>
  8. <password>$(SVNPassword)</password>
  9. <revert>True</revert>
  10. <cleanCopy>$(SvnCleanCopy)</cleanCopy>
  11. <cleanUp>True</cleanUp>
  12. <deleteObstructions>True</deleteObstructions>
  13. </sourcecontrol>
  14. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
SVNUsername Svn 账户,需要项目的 checkout 权限 ci N
SVNPassword Svn 账户的密码 ****** N
SvnCleanCopy 下载源代码前是否先删除本地源代码 FALSE N
SVNTrunkURL 项目的 Svn 路径
  Y

  例子:

  1. <project>
  2. <cc:SVNSourceControl SVNTrunkURL="https://vm-caihaihua/svn/testproject/services/trunk/"
  3. SvnCleanCopy="False"/>
  4. </project>

  6.任务模板

  (1)文件内容替换

  

  1. <cc:define name="Replace">
  2. <exec>
  3. <executable>$(FCReplacerPath)</executable>
  4. <buildArgs>
  5. <cc:Files/>
  6. <cc:Rules/>
  7. </buildArgs>
  8. <buildTimeoutSeconds>$(ReplaceTimeout)</buildTimeoutSeconds>
  9. <successExitCodes>0</successExitCodes>
  10. </exec>
  11. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
ReplaceTimeout 替换的超时时间(秒) 60 N
Files 需要替换的文件列表   Y
Rules 替换的规则
  Y

  例子:

  1. <tasks>
  2. <!-- Config -->
  3. <cc:Replace>
  4. <cc:define name="Files">
  5. /file=$(CIDirectory)$(WorkingDirectory)WcfService\Web.config
  6. /file=$(CIDirectory)$(WorkingDirectory)ManagerTest\App.config
  7. /file=$(CIDirectory)$(WorkingDirectory)WcfServiceTest\App.config
  8. </cc:define>
  9. <cc:define name="Rules">
  10. /from=Catalog=(?![^;\s']*_log[;\s']+)(=?[^;\s']*)/to=Catalog=testproject_trunk
  11. /from=Source=(=?.*?)(=?[;\s']+)/to=Source=vm-caihaihua$2
  12. /from=http://(=?[^\/]+)/(=?\w+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$2.svc
  13. /from=http://(=?.*?)/(?!SSO)(=?[^\/]+)/(=?\w+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$3.svc
  14. /from=http://(=?.*?)/SSO/(=?\w+).svc/to=http://vm-caihaihua/testproject_trunk_ci/SSO/$2.svc
  15. </cc:define>
  16. </cc:Replace>
  17. </tasks>

  (2)项目编译

  1. <cc:define name="Build">
  2. <msbuild>
  3. <executable>$(MsBuildPath)</executable>
  4. <buildArgs>/t:build /p:configuration=$(BuildConfiguration)</buildArgs>
  5. <cc:MsBuildXmlLogger/>
  6. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  7. <projectFile>$(SolutionPath)</projectFile>
  8. </msbuild>
  9. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
BuildConfiguration 编译的配置 DEBUG N
SolutionPath 项目的相对路径   Y

  例子:

  1. <tasks>
  2. <!-- Build -->
  3. <cc:Build SolutionPath="TestProjectService.sln"/>
  4. </tasks>

  (3)网站发布

  

  1. <cc:define name="Publish">
  2. <msbuild>
  3. <executable>$(MsBuildPath)</executable>
  4. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  5. <projectFile>$(SolutionPath)</projectFile>
  6. <buildArgs>
  7. /t:ResolveReferences;Compile
  8. /t:_CopyWebApplication
  9. /p:Configuration=$(PublishConfiguration)
  10. /p:WebProjectOutputDir=$(CIDirectory)$(To)
  11. /p:OutputPath=$(CIDirectory)$(To)\bin
  12. </buildArgs>
  13. </msbuild>
  14. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
PublishConfiguration 编译的配置 RELACE N
SolutionPath 项目的相对路径   Y
To 目标文件夹的相对路径   Y

  例子:

  1. <tasks>
  2. <!-- Publish -->
  3. <cc:Publish SolutionPath="WcfService\WcfService.csproj"
  4. To="$(PublishDirectory)WcfService" />
  5. </tasks>

  (4)文件拷贝

  1. <cc:define name="Copy">
  2. <exec>
  3. <executable>$(DFCopierPath)</executable>
  4. <buildArgs>
  5. /from=$(CIDirectory)$(From)
  6. /to=$(CIDirectory)$(To)
  7. </buildArgs>
  8. <buildTimeoutSeconds>$(CopyTimeout)</buildTimeoutSeconds>
  9. <successExitCodes>0</successExitCodes>
  10. </exec>
  11. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
CopyTimeout 拷贝的超时时间(秒) 60 N
From 需要拷贝的文件夹的相对路径   Y
To 目标文件夹的相对路径   Y

  例子:

  1. <tasks>
  2. <!-- Copy-->
  3. <cc:Copy From="$(WorkingDirectory)WcfService
  4. To="$(PublishDirectory)WcfService"/>
  5. </tasks>

  (5)自动化测试

  1. <cc:define name="RunTest">
  2. <exec>
  3. <executable>$(MSTestPath)</executable>
  4. <baseDirectory>$(CIDirectory)$(WorkingDirectory)</baseDirectory>
  5. <buildArgs>/testcontainer:$(TestContainerPath)</buildArgs>
  6. <buildTimeoutSeconds>$(TestTimeout)</buildTimeoutSeconds>
  7. </exec>
  8. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
TestTimeout 测试的超时时间(秒) 1800 N
TestContainerPath 测试列表的相对路径   Y

  例子:

  1. <tasks>
  2. <!--Run Test-->
  3. <cc:RunTest TestContainerPath="ManagerTest\bin\Debug\ManagerTest.dll"/>
  4. <cc:RunTest TestContainerPath="WcfServiceTest\bin\Debug\WcfServiceTest.dll"/>
  5. </tasks>

  7.项目模板

  1. <cc:define name="Project">
  2. <project name="$(ProjectName)" queue="$(Queue)" queuePriority="$(QueuePriority)">
  3. <webURL>$(CIWebSite)server/local/project/$(ProjectName)/ViewProjectReport.aspx</webURL>
  4. <!--标签-->
  5. <labeller type="dateLabeller"/>
  6. <artifactDirectory>$(CIDirectory)$(ArtifactDirectory)</artifactDirectory>
  7. <!--项目的目录-->
  8. <workingDirectory >$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  9. <!--自动运行时间间隔-->
  10. <triggers>
  11. <cc:TriggerList/>
  12. </triggers>
  13. <!--对源码修改延迟处理时间间隔-->
  14. <modificationDelaySeconds>$(ModificationDelaySeconds)</modificationDelaySeconds>
  15. <maxSourceControlRetries>5</maxSourceControlRetries>
  16. <!--源代码管理(SVN)-->
  17. <cc:SourceControl/>
  18. <state type="state" directory="$(CIDirectory)$(StateDirectory)"/>
  19. <publishers>
  20. <modificationHistory onlyLogWhenChangesFound="true"/>
  21. <statistics/>
  22. <xmllogger/>
  23. <artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="$(KeepLastXBuilds)" />
  24. <!--邮件通知-->
  25. <cc:EmailPublisher/>
  26. </publishers>
  27. <tasks>
  28. <cc:TaskList/>
  29. </tasks>
  30. </project>
  31. </cc:define>

  模板变量:

变量名称 描述 默认值 是否必填
QueuePriority 项目在队列里的优先级 1 N
KeepLastXBuilds 保存最后的 X 个构建结果 300 N
ModificationDelaySeconds 源代码变更触发构建任务的延迟时间 60 N
SourceControl 源代码配置   N
Queue 项目从属的队列   Y
ProjectName 项目名称   Y
StateDirectory 构建日志的保存目录   Y
WorkingDirectory 项目的工作目录,即源代码的保存路径   Y
ArtifactDirectory 构建结果的存放目录   Y
TriggerList 触发器配置列表   Y
TaskList 任务列表   Y

  

  例子:

  TestProject 包括 Wcf Service 项目和 AdminWeb 项目

  (1)Wcf Service

  a.  自动化部署

    • 自动获取源代码
    • 源代码监测及每日构建
    • 修改配置文件中的数据库连接字符串及服务引用地址
    • Debug 编译整个解决方案
    • Release 发布 Service 到 CI 环境

  b. 自动化测试

    • 与a使用同一个工作目录(即源代码)
    • 监测自动化部署过程,如果成功则触发自动化测试
    • 运行 ManagerTest 和 ServiceTest

  (2) AdminWeb

自动化部署

  • 自动获取源代码
  • 源代码监测及每日构建
  • 修改配置文件中的数据库连接字符串及服务引用地址
  • Debug 编译整个解决方案
  • Release 发布 AdminWeb 到 CI 环境
  1. <!-- TestProject: Service 项目 -->
  2. <queue name="TestProject" duplicates="ApplyForceBuildsReAdd" />
  3. <cc:Project ProjectName="TestProject-Servcies"
  4. Queue="TesProjectt"
  5. WorkingDirectory="TestProject\SourceCode\service_trunk\"
  6. ArtifactDirectory="TestProject\Artifact\service\"
  7. StateDirectory="TestProject\State\"
  8. PublishDirectory="TestProject\Publish\"
  9. EmailSubject="[CI-TestProjectService]"
  10. ModificationDelaySeconds="30"
  11. TeamLeader="caihaihua">
  12. <cc:define name="SourceControl">
  13. <cc:SVNSourceControl SVNTrunkURL="https://vm-caihaihua/svn/testproject/services/trunk/"
  14. SvnCleanCopy="False"/>
  15. </cc:define>
  16. <cc:define name="TriggerList">
  17. <cc:ModificationTrigger/>
  18. <cc:DailyBuildTrigger/>
  19. </cc:define>
  20. <cc:define name="TaskList">
  21. <!-- Config -->
  22. <cc:Replace>
  23. <cc:define name="Files">
  24. /file=$(CIDirectory)$(WorkingDirectory)WcfService\Web.config
  25. /file=$(CIDirectory)$(WorkingDirectory)ManagerTest\App.config
  26. /file=$(CIDirectory)$(WorkingDirectory)WcfServiceTest\App.config
  27. </cc:define>
  28. <cc:define name="Rules">
  29. /from=Catalog=(?![^;\s']*_log[;\s']+)(=?[^;\s']*)/to=Catalog=service_trunk_ci
  30. /from=Source=(=?.*?)(=?[;\s']+)/to=Source=localhost$2
  31. /from=http://(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$2.svc
  32. /from=http://(=?.*?)/(?!SSO)(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$3.svc
  33. /from=http://(=?.*?)/SSO/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/SSO/$2.svc
  34. </cc:define>
  35. </cc:Replace>
  36. <!-- Build -->
  37. <cc:Build SolutionPath="TestProjectService.sln"/>
  38. <!-- Publish -->
  39. <cc:Copy From="$(WorkingDirectory)WcfService"
  40. To="$(PublishDirectory)WcfService"/>
  41. </cc:define>
  42. </cc:Project>
  43. <cc:Project ProjectName="TestProjectServcies-Test"
  44. Queue="TestProject"
  45. QueuePriority="2"
  46. WorkingDirectory="TestProject\SourceCode\service_trunk\"
  47. ArtifactDirectory="TestProject\Artifact\test\"
  48. StateDirectory="TestProject\State\"
  49. EmailSubject="[CI-TestProjectServcie-Test]"
  50. ModificationDelaySeconds="30"
  51. TeamLeader="caihaihua">
  52. <cc:define name="TriggerList">
  53. <cc:ProjectTrigger ListenToProject="TestProject-Servcies"/>
  54. </cc:define>
  55. <cc:define name="TaskList">
  56. <!--Run Test-->
  57. <cc:RunTest TestContainerPath="ManagerTest\bin\Debug\ManagerTest.dll"/>
  58. <cc:RunTest TestContainerPath="WcfServiceTest\bin\Debug\WcfServiceTest.dll"/>
  59. </cc:define>
  60. </cc:Project>
  61.  
  62. <!-- TestProject: AdminWeb 项目 -->
  63. <cc:Project ProjectName="TestProject-AdminWeb"
  64. Queue="TestProject"
  65. WorkingDirectory="TestProject\SourceCode\admin_trunk\"
  66. ArtifactDirectory="TestProject\Artifact\admin\"
  67. StateDirectory="TestProject\State\"
  68. PublishDirectory="TestProject\Publish\"
  69. EmailSubject="[CI-TestProject-AdminWeb]"
  70. TeamLeader="caihaihua">
  71. <cc:define name="SourceControl">
  72. <cc:SVNSourceControl SVNTrunkURL="https://vm-caihaihua/svn/testproject/adminweb/trunk/"/>
  73. </cc:define>
  74. <cc:define name="TriggerList">
  75. <cc:ModificationTrigger/>
  76. <cc:DailyBuildTrigger/>
  77. </cc:define>
  78. <cc:define name="TaskList">
  79. <!-- Config -->
  80. <cc:Replace>
  81. <cc:define name="Files">
  82. /file=$(CIDirectory)$(WorkingDirectory)AdminWeb\Web.config
  83. </cc:define>
  84. <cc:define name="Rules">
  85. /from=http://(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$2.svc
  86. /from=http://(=?.*?)/(?!SSO)(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$3.svc
  87. /from=http://(=?.*?)/SSO/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/SSO/$2.svc
  88. </cc:define>
  89. </cc:Replace>
  90. <!-- Build -->
  91. <cc:Build SolutionPath="AdminWeb.sln"/>
  92. <!-- Publish -->
  93. <cc:Publish SolutionPath="AdminWeb\AdminWeb.csproj"
  94. To="$(PublishDirectory)AdminWeb" />
  95. </cc:define>
  96. </cc:Project>

完整的 ccnet.config:

  1. <cruisecontrol xmlns:cc="urn:ccnet.config.builder">
  2. <!-- 全局配置 -->
  3. <cc:define CIWebSite="http://vm-caihaihua/CCNET/"/>
  4. <cc:define CIDirectory="C:\CI\"/>
  5. <cc:define MsBuildPath="C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"/>
  6. <cc:define MsTestPath="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"/>
  7. <cc:define SVNPath="C:\Program Files (x86)\VisualSVN Server\bin\svn.exe"/>
  8. <cc:define FCReplacerPath="C:\CI\Tools\FCReplacer.exe"/>
  9. <cc:define DFCopierPath="C:\CI\Tools\DFCopier.exe"/>
  10. <cc:define name="MsBuildXmlLogger">
  11. <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
  12. </cc:define>
  13.  
  14. <!-- Publishers:EmailPublisher-->
  15. <cc:define name="EmailPublisher">
  16. <email mailhost="$(EmailSendHost)" mailport="$(EmailSendPort)"
  17. mailhostUsername="$(EmailSendUser)@$(EmailDomain)" mailhostPassword="$(EmailSendPassword)"
  18. from="$(EmailSendUser)@$(EmailDomain)"
  19. useSSL="$(EmailUseSSL)" includeDetails="true">
  20. <!--邮件标题配置-->
  21. <subjectPrefix>$(EmailSubject)</subjectPrefix>
  22. <subjectSettings>
  23. <!-- Success/Broken/StillBroken/Fixed/Exception-->
  24. <subject buildResult="Success" value="${CCNetProject} ${CCNetBuildDate} Build result"/>
  25. <subject buildResult="Fixed" value="${CCNetProject} ${CCNetBuildDate} Build result"/>
  26. <subject buildResult="Broken" value="${CCNetProject} ${CCNetBuildDate} Build result"/>
  27. <subject buildResult="StillBroken" value="${CCNetProject} ${CCNetBuildDate} Build result" />
  28. <subject buildResult="Exception" value="${CCNetProject} ${CCNetBuildDate} Build result" />
  29. </subjectSettings>lo
  30. <!--收件人配置-->
  31. <converters>
  32. <regexConverter find="$" replace="@$(EmailDomain)"/>
  33. </converters>
  34. <modifierNotificationTypes>
  35. <notificationType>Failed</notificationType>
  36. <notificationType>Fixed</notificationType>
  37. </modifierNotificationTypes>
  38. <users>
  39. <user group="pm" name="$(PMEmailUser)" address="$(PMEmailUser)@$(EmailDomain)"/>
  40. <user group="ci" name="$(CIEmailUser)" address="$(CIEmailUser)@$(EmailDomain)"/>
  41. <user group="tl" name="$(TeamLeader)" address="$(TeamLeader)@$(EmailDomain)"/>
  42. <cc:EmailTesterList/>
  43. </users>
  44. <groups>
  45. <group name="pm">
  46. <notifications>
  47. <!--Always/Success/Change/Fixed/Failed/Exception -->
  48. <notificationType>Change</notificationType>
  49. </notifications>
  50. </group>
  51. <group name="ci">
  52. <notifications>
  53. <notificationType>Exception</notificationType>
  54. </notifications>
  55. </group>
  56. <group name="tl">
  57. <notifications>
  58. <notificationType>Success</notificationType>
  59. <notificationType>Fixed</notificationType>
  60. <notificationType>Failed</notificationType>
  61. </notifications>
  62. </group>
  63. <group name="developer">
  64. <notifications>
  65. <notificationType>Success</notificationType>
  66. <notificationType>Fixed</notificationType>
  67. <notificationType>Failed</notificationType>
  68. </notifications>
  69. </group>
  70. <group name="tester">
  71. <notifications>
  72. <notificationType>Fixed</notificationType>
  73. </notifications>
  74. </group>
  75. </groups>
  76. </email>
  77. </cc:define>
  78.  
  79. <!-- Triggers:ModificationTrigger/DailyBuildTrigger/ProjectTrigger-->
  80. <cc:define name="ModificationTrigger">
  81. <!--源码修改触发-->
  82. <intervalTrigger seconds="$(ModificationTriggerIntervalSeconds)" buildCondition="IfModificationExists" />
  83. </cc:define>
  84. <cc:define name="DailyBuildTrigger">
  85. <!--每日构建-->
  86. <scheduleTrigger time="$(DailyBuildTriggerTime)" buildCondition="ForceBuild">
  87. <weekDays>
  88. <!--<weekDay>Sunday</weekDay>-->
  89. <weekDay>Monday</weekDay>
  90. <weekDay>Tuesday</weekDay>
  91. <weekDay>Wednesday</weekDay>
  92. <weekDay>Thursday</weekDay>
  93. <weekDay>Friday</weekDay>
  94. <!--<weekDay>Saturday</weekDay>-->
  95. </weekDays>
  96. </scheduleTrigger>
  97. </cc:define>
  98. <cc:define name="ProjectTrigger">
  99. <projectTrigger serverUri="tcp://Server12:21234/CruiseManager.rem" project="$(ListenToProject)">
  100. <triggerStatus>$(ProjectTriggerStatus)</triggerStatus>
  101. <innerTrigger type="intervalTrigger" seconds="$(ProjectTriggerIntervalSeconds)" buildCondition="ForceBuild" />
  102. <!--<triggerFirstTime>True</triggerFirstTime>-->
  103. </projectTrigger>
  104. </cc:define>
  105.  
  106. <!-- SourceControl: SVNSourceControl -->
  107. <cc:define name="SVNSourceControl">
  108. <sourcecontrol type="svn">
  109. <trunkUrl>$(SVNTrunkURL)</trunkUrl>
  110. <executable>$(SVNPath)</executable>
  111. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  112. <username>$(SVNUsername)</username>
  113. <password>$(SVNPassword)</password>
  114. <revert>True</revert>
  115. <cleanCopy>$(SvnCleanCopy)</cleanCopy>
  116. <cleanUp>True</cleanUp>
  117. <deleteObstructions>True</deleteObstructions>
  118. </sourcecontrol>
  119. </cc:define>
  120.  
  121. <!-- Tasks: Replace/Build/Publish/Copy/RunTest -->
  122. <cc:define name="Replace">
  123. <exec>
  124. <executable>$(FCReplacerPath)</executable>
  125. <buildArgs>
  126. <cc:Files/>
  127. <cc:Rules/>
  128. </buildArgs>
  129. <buildTimeoutSeconds>$(ReplaceTimeout)</buildTimeoutSeconds>
  130. <successExitCodes>0</successExitCodes>
  131. </exec>
  132. </cc:define>
  133. <cc:define name="Build">
  134. <msbuild>
  135. <executable>$(MsBuildPath)</executable>
  136. <buildArgs>/t:build /p:configuration=$(BuildConfiguration)</buildArgs>
  137. <cc:MsBuildXmlLogger/>
  138. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  139. <projectFile>$(SolutionPath)</projectFile>
  140. </msbuild>
  141. </cc:define>
  142. <cc:define name="Publish">
  143. <msbuild>
  144. <executable>$(MsBuildPath)</executable>
  145. <workingDirectory>$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  146. <projectFile>$(SolutionPath)</projectFile>
  147. <buildArgs>
  148. /t:ResolveReferences;Compile
  149. /t:_CopyWebApplication
  150. /p:Configuration=$(PublishConfiguration)
  151. /p:WebProjectOutputDir=$(CIDirectory)$(To)
  152. /p:OutputPath=$(CIDirectory)$(To)\bin
  153. </buildArgs>
  154. </msbuild>
  155. </cc:define>
  156. <cc:define name="Copy">
  157. <exec>
  158. <executable>$(DFCopierPath)</executable>
  159. <buildArgs>
  160. /from=$(CIDirectory)$(From)
  161. /to=$(CIDirectory)$(To)
  162. </buildArgs>
  163. <buildTimeoutSeconds>$(CopyTimeout)</buildTimeoutSeconds>
  164. <successExitCodes>0</successExitCodes>
  165. </exec>
  166. </cc:define>
  167. <cc:define name="RunTest">
  168. <exec>
  169. <executable>$(MSTestPath)</executable>
  170. <baseDirectory>$(CIDirectory)$(WorkingDirectory)</baseDirectory>
  171. <buildArgs>/testcontainer:$(TestContainerPath)</buildArgs>
  172. <buildTimeoutSeconds>$(TestTimeout)</buildTimeoutSeconds>
  173. </exec>
  174. </cc:define>
  175.  
  176. <!-- 通用配置(模板) -->
  177. <cc:define name="Project">
  178. <project name="$(ProjectName)" queue="$(Queue)" queuePriority="$(QueuePriority)">
  179. <webURL>$(CIWebSite)server/local/project/$(ProjectName)/ViewProjectReport.aspx</webURL>
  180. <!--标签-->
  181. <labeller type="dateLabeller"/>
  182. <artifactDirectory>$(CIDirectory)$(ArtifactDirectory)</artifactDirectory>
  183. <!--项目的目录-->
  184. <workingDirectory >$(CIDirectory)$(WorkingDirectory)</workingDirectory>
  185. <!--自动运行时间间隔-->
  186. <triggers>
  187. <cc:TriggerList/>
  188. </triggers>
  189. <!--对源码修改延迟处理时间间隔-->
  190. <modificationDelaySeconds>$(ModificationDelaySeconds)</modificationDelaySeconds>
  191. <maxSourceControlRetries>5</maxSourceControlRetries>
  192. <!--源代码管理(SVN)-->
  193. <cc:SourceControl/>
  194. <state type="state" directory="$(CIDirectory)$(StateDirectory)"/>
  195. <publishers>
  196. <modificationHistory onlyLogWhenChangesFound="true"/>
  197. <statistics/>
  198. <xmllogger/>
  199. <artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="$(KeepLastXBuilds)" />
  200. <!--邮件通知-->
  201. <cc:EmailPublisher/>
  202. </publishers>
  203. <tasks>
  204. <cc:TaskList/>
  205. </tasks>
  206. </project>
  207. </cc:define>
  208.  
  209. <!-- 默认配置 -->
  210. <cc:define QueuePriority="1"/>
  211. <cc:define KeepLastXBuilds="300"/>
  212. <!-- Email 相关 -->
  213. <cc:define EmailDomain="company.com"/>
  214. <cc:define EmailSendHost="smtp.live.com"/>
  215. <cc:define EmailSendPort="25"/>
  216. <cc:define EmailUseSSL="TRUE"/>
  217. <cc:define EmailSendUser="ci"/>
  218. <cc:define EmailSendPassword="******"/>
  219. <cc:define CIEmailUser="ci"/>
  220. <cc:define PMEmailUser="pm_1"/>
  221. <cc:define name="EmailTesterList">
  222. <user group="tester" name="tester_1" address="tester_1@$(EmailDomain)"/>
  223. <user group="tester" name="tester_2" address="tester_2@$(EmailDomain)"/>
  224. </cc:define>
  225. <!-- Trigger 相关 -->
  226. <cc:define ModificationTriggerIntervalSeconds="300"/>
  227. <cc:define ModificationDelaySeconds="60"/>
  228. <cc:define ProjectTriggerIntervalSeconds="30"/>
  229. <cc:define ProjectTriggerStatus="SUCCESS"/>
  230. <cc:define DailyBuildTriggerTime="18:00"/>
  231. <!-- SVN 相关 -->
  232. <cc:define SVNUsername="ci"/>
  233. <cc:define SVNPassword="******"/>
  234. <cc:define SvnCleanCopy="FALSE"/>
  235. <cc:define name="SourceControl">
  236. </cc:define>
  237. <!-- Task 相关 -->
  238. <cc:define TestTimeout="1800"/>
  239. <cc:define CopyTimeout="60"/>
  240. <cc:define ReplaceTimeout="60"/>
  241. <cc:define BuildConfiguration="DEGUB"/>
  242. <cc:define PublishConfiguration="RELEASE"/>
  243.  
  244. <!-- TestProject: Service 项目 -->
  245. <queue name="TestProject" duplicates="ApplyForceBuildsReAdd" />
  246. <cc:Project ProjectName="TestProject-Servcies"
  247. Queue="TesProjectt"
  248. WorkingDirectory="TestProject\SourceCode\service_trunk\"
  249. ArtifactDirectory="TestProject\Artifact\service\"
  250. StateDirectory="TestProject\State\"
  251. PublishDirectory="TestProject\Publish\"
  252. EmailSubject="[CI-TestProjectService]"
  253. ModificationDelaySeconds="30"
  254. TeamLeader="caihaihua">
  255. <cc:define name="SourceControl">
  256. <cc:SVNSourceControl SVNTrunkURL="https://vm-caihaihua/svn/testproject/services/trunk/"
  257. SvnCleanCopy="False"/>
  258. </cc:define>
  259. <cc:define name="TriggerList">
  260. <cc:ModificationTrigger/>
  261. <cc:DailyBuildTrigger/>
  262. </cc:define>
  263. <cc:define name="TaskList">
  264. <!-- Config -->
  265. <cc:Replace>
  266. <cc:define name="Files">
  267. /file=$(CIDirectory)$(WorkingDirectory)WcfService\Web.config
  268. /file=$(CIDirectory)$(WorkingDirectory)ManagerTest\App.config
  269. /file=$(CIDirectory)$(WorkingDirectory)WcfServiceTest\App.config
  270. </cc:define>
  271. <cc:define name="Rules">
  272. /from=Catalog=(?![^;\s']*_log[;\s']+)(=?[^;\s']*)/to=Catalog=service_trunk_ci
  273. /from=Source=(=?.*?)(=?[;\s']+)/to=Source=localhost$2
  274. /from=http://(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$2.svc
  275. /from=http://(=?.*?)/(?!SSO)(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$3.svc
  276. /from=http://(=?.*?)/SSO/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/SSO/$2.svc
  277. </cc:define>
  278. </cc:Replace>
  279. <!-- Build -->
  280. <cc:Build SolutionPath="TestProjectService.sln"/>
  281. <!-- Publish -->
  282. <cc:Copy From="$(WorkingDirectory)WcfService"
  283. To="$(PublishDirectory)WcfService"/>
  284. </cc:define>
  285. </cc:Project>
  286. <cc:Project ProjectName="TestProjectServcies-Test"
  287. Queue="TestProject"
  288. QueuePriority="2"
  289. WorkingDirectory="TestProject\SourceCode\service_trunk\"
  290. ArtifactDirectory="TestProject\Artifact\test\"
  291. StateDirectory="TestProject\State\"
  292. EmailSubject="[CI-TestProjectServcie-Test]"
  293. ModificationDelaySeconds="30"
  294. TeamLeader="caihaihua">
  295. <cc:define name="TriggerList">
  296. <cc:ProjectTrigger ListenToProject="TestProject-Servcies"/>
  297. </cc:define>
  298. <cc:define name="TaskList">
  299. <!--Run Test-->
  300. <cc:RunTest TestContainerPath="ManagerTest\bin\Debug\ManagerTest.dll"/>
  301. <cc:RunTest TestContainerPath="WcfServiceTest\bin\Debug\WcfServiceTest.dll"/>
  302. </cc:define>
  303. </cc:Project>
  304.  
  305. <!-- TestProject: AdminWeb 项目 -->
  306. <cc:Project ProjectName="TestProject-AdminWeb"
  307. Queue="TestProject"
  308. WorkingDirectory="TestProject\SourceCode\admin_trunk\"
  309. ArtifactDirectory="TestProject\Artifact\admin\"
  310. StateDirectory="TestProject\State\"
  311. PublishDirectory="TestProject\Publish\"
  312. EmailSubject="[CI-TestProject-AdminWeb]"
  313. TeamLeader="caihaihua">
  314. <cc:define name="SourceControl">
  315. <cc:SVNSourceControl SVNTrunkURL="https://vm-caihaihua/svn/testproject/adminweb/trunk/"/>
  316. </cc:define>
  317. <cc:define name="TriggerList">
  318. <cc:ModificationTrigger/>
  319. <cc:DailyBuildTrigger/>
  320. </cc:define>
  321. <cc:define name="TaskList">
  322. <!-- Config -->
  323. <cc:Replace>
  324. <cc:define name="Files">
  325. /file=$(CIDirectory)$(WorkingDirectory)AdminWeb\Web.config
  326. </cc:define>
  327. <cc:define name="Rules">
  328. /from=http://(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$2.svc
  329. /from=http://(=?.*?)/(?!SSO)(=?[^\/]+)/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/WcfService/$3.svc
  330. /from=http://(=?.*?)/SSO/(=?[^\/]+).svc/to=http://vm-caihaihua/testproject_trunk_ci/SSO/$2.svc
  331. </cc:define>
  332. </cc:Replace>
  333. <!-- Build -->
  334. <cc:Build SolutionPath="AdminWeb.sln"/>
  335. <!-- Publish -->
  336. <cc:Publish SolutionPath="AdminWeb\AdminWeb.csproj"
  337. To="$(PublishDirectory)AdminWeb" />
  338. </cc:define>
  339. </cc:Project>
  340. </cruisecontrol>

【Hello CC.NET】巧用模板简化配置的更多相关文章

  1. CC.NET模板简化配置

    [Hello CC.NET]巧用模板简化配置 从 <[Hello CC.NET]CC.NET 实现自动化集成> 到 <[Hello CC.NET]自动化发布时 Web.config ...

  2. Spring事务支持:利用继承简化配置

    因为事务代理的实现类是 TransactionProxyFactoryBean . 事务代理Bean必须注入事务管理器. 大部分情况下,每个事务代理的事务属性大同小异,对于这种情况,Spring提供了 ...

  3. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  4. WCF学习之旅—WCF4.0中的简化配置功能(十五)

    六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...

  5. Spring注释与简化配置

      在Spring 2.5及以后的版本中,提供了注释和命名空间来简化Spring的配置.下面是一些常用配置分享. 1.@Autowired注释   以前给一个Bean配置属性时,Bean必须配置< ...

  6. ElasticSearch 模板文件配置

    首先是推荐一下参考资料 中文资料:http://kibana.logstash.es/content/elasticsearch/index.html 官方文档:https://www.elastic ...

  7. maven pom文件简单模板和配置详解

    https://blog.csdn.net/earbao/article/details/49924943 maven pom文件简单模板和配置详解

  8. 7 -- Spring的基本用法 -- 11... 基于XML Schema的简化配置方式

    7.11 基于XML Schema的简化配置方式 Spring允许使用基于XML Schema的配置方式来简化Spring配置文件. 7.11.1 使用p:命名空间简化配置 p:命名空间不需要特定的S ...

  9. smarty模板的配置

    smarty下载: http://www.smarty.net/download   建议使用一个兼容性好的smary版本. 太新的版本往往对php的版本支持不好.   php推荐使用的模板是:sma ...

随机推荐

  1. PHP操作Mongodb之高级查询篇

    本文主要讲解PHP中Mongodb的除了增删改查的一些其他操作. 在PHP操作Mongodb之增删改查篇中我们介绍了PHP中Mongodb的增加.删除.修改及查询数据的操作.本文主要是将查询时用到的高 ...

  2. 如何在Mac OS X中显示隐藏的文件

    打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 显示文件夹中的隐藏文件. defaults write co ...

  3. Java内存与垃圾收集知识总结

    总结一下关于Java内存的知识,今天我不生产知识,我只是知识的搬运工. 1.运行时数据区域 java虚拟机在执行JAVA程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 由所有线程共享的数据 ...

  4. IntelliJ 支持web

  5. 如何在一个div标签里显示出另一个网页? <iframe src=" http://www.baidu.com " width="800px" height="200px" scrolling="no" frameborder="0"> </iframe>

    如何在一个div标签里显示出另一个网页? 用在div里用iframe,就像下面的代码 <iframe src=" http://www.baidu.com " width=& ...

  6. oracle impdp 导入

    用imp语法导入dmp文件: imp mdm/mdm@SYSWARE  file= ‪E:\Product\9y5s\5.MDM\20161024.DMP  full=y 报错 IMP-00002:无 ...

  7. WinForm应用只运行一次

    一.WinForm应用只能运行一次 static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [ST ...

  8. hdu 5795

    A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. session和cookie的简单理解

    0. 引子,我们为什么要cookie和session       因为http请求是无状态的(不能记录用户的登录状态等),所以需要某种机制来保存用户的登录状态等信息,在下次访问web服务的时候,不用再 ...

  10. innodb的存储结构

    如下所示,innodb的存储结构包含:表空间,段,区,页(块),行 innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高 表空间:零散页+段 独立表空间存放的是:数据.索引.插入缓冲 ...