来自《实例化 DevOps 原则》
《凤凰项目》中的三步工作法:
《DevOps 实践指南》 对应的示例:
来源:(《Effective DevOps》)
来自《实例化 DevOps 原则》
效能提升过程:
一切从需求出发,再回归到需求
我们的诸多软件实践,只是在正确的做事情。取而代之的,我们要去做正确的事情,即有价值的。
看板三原则:
看板的六个实践:
示例
应对变化
待办 | 分析 | 开发 | 测试 | 完成 | |
---|---|---|---|---|---|
紧急工作 |
软件开发的 7 种消费
Jira、Trello 等以特定的数据结果存储在数据库中,那么必然可以从代码中回溯出来。
Bill Wake 提出了一个好用户故事的验收标准——INVEST 模型,它由六个单词的首字母组成,分别是
# language: zh-CN
场景大纲: 用户查看 “我的” 页面未读消息数量提示
Given 我收到消息
When 我在“我的”页面
Then 我可以看到未读消息计数
Note
1. 后端记录用户设备 ID 和用户 ID,记录每种消息的最近查看时间,根据此时间后的消息数量计算未读消息数量;
2. 超过 99 未读显示省略图标;
3. 时间展示规则:
1). 一小时内,显示为 xx 分钟前
2). 小于 24 小时,显示为 xx 小时前
3). 间隔超过 24 小时且小于 48 小时,显示:昨天
4). 间隔超过 48 小时,显示:MM-DD
5). 间隔超过一周:YY-MM-DD ( eg: 2019-03-01)
如何检验验收标准(AC)是否写得足够好?
故事地图是一门在需求拆分过程中保持全景图的技术。
来源:Scott Prugh 《Continuous Delivery》
Ron Westrum 组织类型学模型:组织如何处理信息
病态型 | 官僚型 | 生机型 |
---|---|---|
隐瞒信息 | 忽略信息 | 各级探索信息 |
消灭信使 | 不重视信使 | 训练信使 |
逃避责任 | 各自担责 | 共担责任 |
阻碍团队的互动 | 容忍团队的互动 | 鼓励团队间结晶 |
隐瞒事故 | 组织是公道和宽容的 | 调查事故根因 |
压制新想法 | 认为新想法会造成麻烦 | 接纳新想法 |
—— 《DevOps 实践指南》
在 ThoughtWorks 拥有这么一系列的培训(《在 ThoughtWorks 我们如何做内部培训?》
系统化思维
精益思想五大原则:
如《Jenkins 权威指南》一书指出,持续集成需要几个不同的阶段
好的构建工具应该支持以下的特性
形式:
如何选择分支策略:
2B 型软件,采用多分支是难以避免的:
常见的情况是,一个十来个人的团队,一年可能要交付至少 20 个项目。更不用说在电信行业中,需要针对于不同的国家或地区进行定制。
2C 型软件,采用主干开发更有优势。
Pull Request 是一种通知机制。你修改了他人的代码,将你的修改通知原来的作者,希望他合并你的修改,这就是 Pull Request。
自动地 Code Review
在版本控制的分支模型中,开发人员都在同一个被称为“主干“的分支中进行协作,多个开发人员的代码的汇聚在一起,从而避免创建长时间无法合并分支。因此,这种方式避免了合并地狱,也不会破坏构建,并从此让开发人员过上幸福的生活。
基本原则:
开源模式:核心开发人员使用主干,非核心开发人员可以采用 PR 机制。
外包模式:核心开发人员使用主干,非核心开发人员可以采用 PR 机制。
自动化演进路径(《SRE:Google 运维解密》):
公司 | 部署频率 | 部署交付期 | 可靠性 | 客户响应 |
---|---|---|---|---|
Amazon | 23000 次/天 | 分钟 | 高 | 高 |
5500 次/天 | 分钟 | 高 | 高 | |
Netflix | 500 次/天 | 分钟 | 高 | 高 |
1 次/天 | 小时 | 高 | 高 | |
3 次/周 | 高 | 高 | ||
普通企业 | 9 个月/次 | 月或季度 | 低/中 | 低/中 |
—— 《凤凰项目》
来自《Java 持续交付》中对不同策略的特点及代码总结:
单目标部署 | 一次性全部部署 | 最小服务部署 | 滚动部署 | 蓝/绿部署 | 金丝雀部署 | |
---|---|---|---|---|---|---|
整体复杂度 | 低 | 低 | 中 | 中 | 中 | 高 |
服务中断 | 是 | 是 | 否 | 否 | 否 | 否 |
新旧版本混合 | 否 | 否 | 是 | 是 | 否 | 是 |
回滚过程 | 重新部署之前的版本 | 重新部署之前的版本 | 停止更新,重新部署之前的版本 | 停止更新,重新部署之前的版本 | 将流量切回原来的版本 | 停止金丝雀实例 |
部署中的基础设施支持 | 健康检查 | 健康检查 | 路由变更、健康检查 | 路由变更、健康检查 | 路由变更、健康检查 | 路由变更、加权路由、健康检查 |
监控要求 | 基础 | 基础 | 简单 | 简单 | 简单 | 高级 |
见测试
如(《SRE:Google 运维解密》)一书中介绍的『服务可靠度层级模型』:
每个 DevOps 阶段需要版本化的对象(《DevOps 最佳实践》)
阶段 | 版本化的对象 | 工具化 |
---|---|---|
规划 | 主题、史诗、特性 | 需求管理工具 |
编码 | S-CI、基线、数据模型 | 软件管理工具 数据建模工具 |
构建 | 构建 ID | 构建服务器工具 |
测试 | 测试数据 、测试用例、测试集、测试运行 | 测试管理 测试自动化工具 |
发布 | 发布说明、部署脚本、配置文件 | 发布工具 |
运维 | 数据文件、协议 | 数据文件管理工具 |
监控 | 监控配置文件 | 监控系统 |
基础设施即代码是一种基于从软件开发实践的基础设施自动化的方法。它强调系统及其配置的日常置备和变更具有一致性和可重复性。 —— 《基础设施即代码:云服务器管理》
流水线即代码 (Pipeline as Code) 通过编码而非配置持续集成 / 持续交付 (CI/CD) 运行工具的方式定义部署流水线。
Jenkinsfile 最佳实践(来源:《Pipeline Best Practices》)
Jenkins.getInstance
使用共享库:
示例(来源《流水线即代码》):
node('master') {
stage('Checkout') {…}
stage('Code Analysis') {…}
stage('Unit Test') {…}
stage('Packing') {…}
stage('Archive') {…}
stage('DEV') {…}
}
stage('SIT') {
timeout(time:4, unit:'HOURS') {
input "Deploy to SIT?"
}
node('master') {…}
}
stage('Acceptance Test') {
node('slave') {…}
}
aka Deployment process as code
文档代码化,将文档以类代码的领域特定语言的方式编写,并借鉴软件开发的方式(如源码管理、部署)进行管理。它可以借助于特定的工具进行编辑、预览、查看,又或者是通过专属的系统部署到服务器上。面向非技术人员的文档代码化的一种常见架构模式是:编辑-发布-开发分离』,
它具备以下一些特征(《文档代码化》)
常见的实践有:
对应的系统实践:
实例化需求是一组方法,它以一种对开发开发团队有所帮助的方式(理想情况下表现为可执行的测试)描述计算机系统的功能和行为,让不懂技术的利益相关者也可以理解,即使客户的需求在不断变化,它也具有很好的可维护性,可以保持需求的相关性。 从而帮助团队交付正确的软件产品。
来源:《验收测试驱动开发介绍(ATDD)》
or 强化反馈环
TDD 是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD 的原理是在开发功能代码之前,先编写测试用例代码,通过测试代码确定编写什么产品代码。
—— 《测试驱动的面向对象软件开发》
如 Robert C. Martin 在《代码整洁之道》所说的那样,好的测试应该是:
要我说的话,它应该还有:
测试代码应该遵循生产代码的质量标准。
来源:《深入核心的敏捷开发》
PS:时间视真实的团队而定,如果不能每天进行代码回顾,时间一般控制在 0.5 ~ 1 小时内。
基于:Java Code Review Checklist 和 《Java 持续交付》
包含以下几点
基本过程:
实践:
回顾的方式:
不能按时回顾时:
小步前进是一系列步骤的集合,其目的是:集成越早问题越小。
Git 钩子列表:
applypatch-msg post-merge pre-auto-gc prepare-commit-msg
commit-msg post-receive pre-commit push-to-checkout
post-applypatch post-rewrite pre-push update
post-checkout post-update pre-rebase
post-commit pre-applypatch pre-receive
Commit Hook 示例:
Push Hook 示例:
提交信息规范(《如何写好一个 Git 提交信息及几种不同的规范》):
出自《DevOps 最佳实践》一书:
Dashing: http://dashing.io/
如 RedHat 官方在 DevOps 文件 所讲述:
DevOps 十分依赖重视开放性和透明度的协作文化。实施 DevOps 就等于应用开源原则和实践,因为 DevOps 的文化价值观与开源社区和敏捷性工作方法的价值观紧密交融。
or 持续实验文化
诀窍(《练习技术的诀窍》
建议:
精通 one,学习 another,关注 next。 —— justjavac
高产策略(《如何高产》
持续交付是一组实践规范和指导原则,能够让软件交付团队在短时间内产生有价值的、稳定的软件。
持续部署的发布工程哲学:
——《Java 持续交付》
『单元测试是可执行的文档』
童子军有一条规则:“永远保持离开时的露营地比你发现它时更整洁”。
提交的代码要比检出的更好
破窗效应:及时矫正和补救正在发生的问题。
以一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。最终他们甚至会闯入建筑内,如果发现无人居住,也许就在那里定居或者纵火。又或想像一条人行道有些许纸屑,如果无人清理,不久后就会有更多垃圾,最终人们会视若理所当然地将垃圾顺手丢弃在地上。因此破窗理论强调着力打击轻微罪行有助减少更严重罪案,应该以“零容忍”的态度面对罪案。
此理论描述了社区失序的五个阶段:
对应的软件开发失序:
技术债治理的四条原则(《技术债治理的四条原则》):
对于一个新项目来说,我们可以从下述的四个维度来检查项目的准备情况:
来源:构建可信软件系统