过去,我曾使用Subversion信息库来存储我的源文档,并遵循了“子项目”约定来进行信息库组织,我发现这种约定对大型和小型组织都非常有效。
我们将构建存储库分支;标签和主干如下:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
在实际的源代码树本身中,我们将使用(类似)以下结构:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct-+
| +-build
| +-doc
| +-test
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
这个想法曾经是(现在仍然是)使用存储库的结构来帮助工程团队之间进行结构化的沟通。业务中面向客户的部分以及其他利益相关者和领域专家。
举例来说:位于“项目”目录之一中的源文档只能使用一次(并赚钱)。位于“ productLines”目录之一中的文档的收入与该特定行中的产品被出售的次数相同。位于“图书馆”目录之一中的文档的收入是使用它们的任何产品售出的收入的多少倍。
它使费用摊销的概念变得明确,并有助于建立对整个企业中源文档重用的支持。
在理想的世界中,面向客户的业务部门也将使用此结构来存储演示文稿和其他销售抵押品,以便开发人员可以在相关产品目录旁边看到已创建的客户期望,并且面向客户的同事可以跟踪发展他们销售的功能和产品方面的进展。
这也意味着我们的构建自动化工具可以在一个通用的结构上运行。(我们的构建脚本会在源代码树中查找“ build”文件夹,在其中找到配置文件,这些文件指定了如何构建每个组件;用于文档生成和测试的过程类似。)同样,在理想情况下,可以以相同的方式构建组织的网站和其他营销材料。
最后一点:持续集成系统知道需要触发构建;静态分析;烟雾测试和单元测试在每次修改主干,每次修改任何“ tag”分支以及每次修改任何“ AUTOMATED”分支时进行。这样,单个开发人员便可以将CI系统及其个人分支(IMHO的一项重要功能)一起使用。