Part Ⅰ:基础篇 1
Chapter 1:软件交付的问题 3
引言 3
一些常见的发布反模式 4
反模式:手工部署软件 5
反模式:开发完成之后才向类生产环境部署 7
反模式:生产环境的手工配置管理 9
我们能做得更好吗 10
如何实现目标 11
每次修改都应该触发反馈流程 13
必须尽快接收反馈/ 14
交付团队必须接收反馈并作出反应 15
这个流程可以推广吗 16
收效 17
授权团队 17
减少错误 18
缓解压力 20
部署的灵活性 21
多加练习,使其完美 22
候选发布版本 22
Every Check-in Leads to a Potential Release 23
软件交付的原则 24
为软件的发布创建一个可重复且可靠的过程 24
将几乎所有事情自动化 25
把所有的东西都纳入版本控制 26
提前并频繁地做让你感到痛苦的事 26
内建质量 27
“DONE”意味着“已发布” 27
交付过程是每个成员的责任 28
持续改进 28
小结 29
Chapter 2:配置管理 31
引言 31
使用版本控制 32
对所有内容进行版本控制 33
频繁提交代码到主干 35
使用意义明显的提交注释 37
依赖管理 38
外部库文件管理 38
组件管理 39
软件配置管理 39
配置与灵活性 40
配置的分类 41
应用程序的配置管理 43
跨应用的配置管理 47
管理配置信息的原则 47
环境管理 49
环境管理的工具 53
变更过程管理 53
小结 54
Chapter 3:持续集成 55
引言 55
实现持续集成 56
准备工作 56
一个基本的持续集成系统 57
持续集成的前提条件 59
频繁提交 59
创建全面的自动化测试套件 60
保持较短的构建和测试过程 60
管理开发工作区 62
使用持续集成软件 63
基本操作 63
铃声和口哨 63
必不可少的实践 66
构建失败之后不要提交新代码 66
提交前在本地运行所有的提交测试,或者让持续集成服务器完成此事 66
等提交测试通过后再继续工作 67
回家之前,构建必须处于成功状态 68
时刻准备着回滚到前一个版本 69
在回滚之前要规定一个修复时间 70
不要将失败的测试注释掉 70
为自己导致的问题负责 70
测试驱动的开发 71
推荐的实践 71
极限编程开发实践 71
若违背架构原则,就让构建失败 72
若测试运行变慢,就让构建失败 73
若有编译警告或代码风格问题,就让测试失败 73
分布式团队 75
对流程的影响 75
集中式持续集成 76
技术问题 76
替代方法 77
分布式版本控制系统 79
小结 82
Chapter 4:测试策略的实现 83
引言 83
测试的分类 84
业务导向且支持开发过程的测试 85
技术导向且支持开发过程的测试 89
业务导向且评价项目的测试 89
技术导向且评价项目的测试 91
测试替身 91
现实中的情况与应对策略 92
新项目 92
项目进行中 94
遗留系统 95
集成测试 96
流程 99
小结 101
Part Ⅱ:部署流水线 103
Chapter 5:部署流水线解析 105
引言 105
什么是部署流水线 106
部署流水线的相关实践 113
只生成一次二进制包 113
对不同环境采用同一部署方式 115
对部署进行冒烟测试 117
向生产环境的副本中部署 117
每次变更都要立即在流水线中传递 118
只要有环节失败,就停止整个流水线 119
提交阶段 120
自动化验收测试之门 122
后续的测试阶段 126
手工测试 128
非功能测试 128
发布准备 128
自动部署与发布 129
变更的撤销 131
在成功的基础上构建 132
实现一个部署流水线 133
对价值流进行建模并创建简单的可工作框架 133
构建和部署过程的自动化 134
自动化单元测试和代码分析 135
自动化验收测试 136
部署流水线的演进 136
度量 137
小结 140
Chapter 6:构建与部署的脚本化 143
引言 143
构建工具概览 144
Make 146
Ant 147
NAnt与MSBuild 148
Maven 149
Rake 150
Buildr 151
Psake 151
构建部署脚本化的原则与实践 152
为部署流水线的每个阶段创建脚本 152
使用恰当的技术部署应用程序 152
使用同样的脚本向所有环境部署 153
使用操作系统自带的包管理工具 154
确保部署流程是幂等的 155
部署系统的增量式演进 157
面向JVM的应用程序的项目结构 157
部署脚本化 160
多层的部署和测试 162
测试环境配置 163
小贴士 164
总是使用相对路径 164
消除手工步骤 165
从二进制包到版本控制库的内建可追溯性 165
不要把二进制包作为构建的一部分放到版本控制库中 166
“test”不应该让构建失败 166
用集成冒烟测试来限制应用程序 167
.NET小贴士 167
小结 168
Chapter 7:提交阶段 169
引言 169
提交阶段的原则和实践 170
提供快速有用的反馈 171
何时令提交阶段失败 172
精心对待提交阶段 172
让开发人员也拥有所有权 173
在超大项目团队中指定一个构建负责人 174
提交阶段的结果 174
提交测试套件的原则与实践 177
避免用户界面 178
使用依赖注入 179
避免使用数据库 179
在单元测试中避免异步 180
使用测试替身 180
最少化测试中的状态 183
最少化测试中的状态 184
蛮力 185
小结 185
Chapter 8:自动化验收测试 187
引言 187
为什么验收测试是至关重要的 188
如何创建可维护的验收测试套件 190
GUI上的测试 192
创建验收测试 193
分析人员和测试人员的角色 193
迭代开发项目中的分析工作 193
将验收条件变成可执行的规格说明书 195
应用程序驱动层 198
如何表述验收条件 200
窗口驱动器模式:让测试与GUI解耦 201
实现验收测试 204
验收测试中的状态 204
过程边界、封装和测试 206
管理异步与超时问题 207
使用测试替身对象 210
验收测试阶段 213
确保验收测试一直处于通过状态 214
部署测试 217
验收测试的性能 218
重构通用任务 219
共享昂贵资源 219
并行测试 220
使用计算网格 220
小结 222
Chapter 9:非功能需求的测试 225
引言 225
非功能需求的管理 226
如何为容量编程 228
容量度量 231
容量测试环境 234
自动化容量测试 238
通过UI的容量测试 240
基于服务或公共API来录制交互操作 241
使用录制的交互模板 241
使用容量测试桩开发测试 244
将容量测试加入到部署流水线中 244
容量测试系统的附加价值 247
小结 248
Chapter 10:应用程序的部署与发布 249
引言 249
创建发布策略 250
发布计划 251
发布产品 252
应用程序的部署和晋级 253
首次部署 253
对发布过程进行建模并让构建晋级 254
配置的晋级 257
联合环境 258
部署到试运行环境 258
部署回滚和零停机发布 259
通过重新部署原有的正常版本来进行回滚 260
零停机发布 260
蓝绿部署 261
金丝雀发布 263
紧急修复 265
持续部署 266
小贴士和窍门 270
真正执行部署操作的人应该参与部署过程的创建 270
记录部署活动 271
不要删除旧文件,而是移动到别的位置 271
部署是整个团队的责任 271
服务器应用程序不应该有GUI 271
为新部署留预热期 272
快速失败 273
不要直接对生产环境进行修改 273
小结 273
Part Ⅲ:交付生态圈 275
Chapter 11:基础设施和环境管理 277
引言 277
理解运维团队的需要 279
文档与审计 280
异常事件的告警 281
保障IT服务持续性的计划 282
使用运维团队熟悉的技术 282
基础设施的建模和管理 283
基础设施的访问控制 285
对基础设施进行修改 287
服务器的准备及其配置的管理 288
服务器的准备 288
服务器的持续管理 290
中间件的配置管理 295
管理配置项 296
产品研究 298
考查中间件是如何处理状态的 298
查找用于配置的API 299
使用更好的技术 299
基础设施服务的管理 300
虚拟化 303
虚拟环境的管理 305
虚拟环境和部署流水线 308
用虚拟环境做高度的并行测试 310
云计算 312
云中基础设施 313
云中平台 314
没有普适存在 315
对云计算的批评 316
基础设施和应用程序的监控 317
收集数据 318
记录日志 320
建立信息展示板 321
行为驱动的监控 323
小结 323
Chapter 12:数据管理 325
引言 325
数据库脚本化 326
增量式修改 327
对数据库进行版本控制 328
联合环境中的变更管理 329
数据库回滚和无停机发布 331
保留数据的回滚 331
将应用程序部署与数据库迁移解耦 333
测试数据的管理 334
为单元测试进行数据库模拟 335
管理测试与数据之间的耦合 336
测试独立性 337
建立和销毁 337
连贯的测试场景 337
数据管理和部署流水线 338
提交阶段的测试数据 338
验收测试中的数据 339
容量测试的数据 341
其他测试阶段的数据 342
小结 343
Chapter 13:组件和依赖管理 345
引言 345
保持应用程序可发布 346
将新功能隐蔽起来,直到它完成为止 347
所有修改都是增量式的 349
通过抽象来模拟分支 349
依赖 351
依赖地狱 352
库管理 354
组件 356
如何将代码库分成多个组件 356
将组件流水线化 360
集成流水线 361
管理依赖关系图 363
构建依赖图 363
为依赖图建立流水线 365
什么时候要触发构建 369
谨慎乐观主义 370
循环依赖 372
管理二进制包 373
制品库是如何运作的 373
部署流水线如何与制品库相结合 374
用Maven管理依赖 375
小结 379
Chapter 14:版本控制进阶 381
引言 381
版本控制的历史 382
C VS/CVS 382
S VN 383
商业版本控制系统 385
放弃悲观锁 386
分支与合并 388
合并 389
分支、流和持续集成 390
DVCS 393
什么是DVCS 393
DVCS简史 395
企业环境中的DVCS 396
使用DVCS 397
基于流的版本控制系统 399
什么是基于流的版本控制系统 399
使用流的开发模型 400
静态视图和动态视图 403
使用基于流的版本控制系统做持续集成 403
主干开发 405
按发布创建分支 408
按功能特性分支 410
按团队分支 412
小结 415
Chapter 15:持续交付管理 417
引言 417
配置与发布管理成熟度模型 419
项目生命周期 421
识别阶段 422
启动阶段 423
初始阶段 424
开发与发布 425
运营阶段 428
风险管理流程 429
风险管理基础篇 429
风险管理时间轴 430
如何做风险管理的练习 431
常见的交付问题、症状和原因 432
不频繁的或充满缺陷的部署 433
较差的应用程序质量 434
缺乏管理的持续集成工作流程 435
较差的配置管理 436
符合度与审计 436
文档自动化 437
加强可跟踪性 438
在筒仓中工作 439
变更管理 440
小结 442
参考文献 443