本帖最后由 adminlily 于 2018-11-7 16:24 编辑
) }: R6 |0 o+ k! n6 P$ k7 D
/ k1 v* ?) @1 P a" rPart 1:关于持续交付
! r: z9 n$ q6 x4 ~7 o
- t, m1 O7 [! s" w% s5 J* k+ t4 Z% D+ ]# c) c1 {2 e- z: B
Part 2:目标 ?- G; p/ z- r" }
7 c r& D5 E5 I& x! v8 p" h( S9 Q! F4 {/ `: q& w5 y5 E) m, P
Part 3:预备步骤
" a, U% g4 P& S% e/ l" Y 9 c8 n- v# i" X- H5 y5 N7 W% }
Part 4:实现持续交付流水线 * Z4 {7 ?: S) v# n) i K
; W( E; M% U& I/ u, J
: A4 p8 O% _7 k8 H1 t6 x+ h! `- H8 yPart 5:持续交付最佳实践及其他 ~2 L' A1 \+ P
持续交付最佳实践 ! k, X ?; b" ^$ R
9 P- K2 t; h* d, Y& l* l/ Y/ F
一旦基础就绪并建立好交付流水线,你很可能已经从迭代时间以及快速发布中收益。 # e$ ]4 L3 M+ |/ O
1 O+ T- R- ?& k
自动化会取代很多人工任务,环境和发布会变的一致,发布候选者将使用自动路由和自助服务工具在各个流水线阶段中流动。 0 ]4 F, K2 K" a) U
7 d! e9 D) L7 M" r0 s, E9 T1 M
你的软件应该近似于时刻处在生产就绪状态,伴随着发布候选人最后从流水线出来的频率远大于从传统途径的频率。每个发布候选者应该增加一批相对较小的改动。 . o$ I! G" d. y8 n7 y* T) y
+ P8 b$ w8 Y- ~* E" G
一旦你处于这个阶段,那么你会有更多机会去提升和推进更快的发布周期,而这会使得系统的稳定性更强。 6 g' ~9 h: {% K/ v
4 y+ Y% s0 {6 I: N5 o' ?
下面列举了一些最佳实践: $ Z8 y f5 L. j! E; o+ o
8 p2 |- L( }3 C) `
实施监控; K u8 v# T' a0 p Z" G
, m# w" \' |) t8 m M2 N1 a* [
尽管这份文档讨论的所有事情是描述一个严格的过程去帮助你避免在发布产品的时候出现 bug,但是一旦发布结果显示出系统出现了某种故障,那么收到告急同样显得非常重要。
3 g7 P8 J8 x: X, M- v+ ?
1 e+ Z9 L0 h; X) g" m7 b/ k+ k
举个例子,如果你的应用在部署结束之后开始抛出告警和异常,那么被直接告之就显得极其重要,这意味着你可以调查和结局。
& z k) |' w9 |! ^+ y0 E
1 p. z/ u4 d. i( x) Y0 ]$ T
理想情况下,这种警示将会以仪表盘或者监控终端的途径传递,比如邮件,文本消息,Slack,或者功能类似的其他途径。 3 c; P% `* w" a: ~( w
: L* q3 H9 ~& ^3 ?6 L; w0 d
你可能会需要更加深入而不仅仅是简单的检查错误日志,并且开始监视应用程序正在打印出的日志。
8 `6 l ~' E; u% ^' E5 a
. |, t" }6 i( l% B3 Y
比如,如果你的购物车完成了在一个发布后下降了 20%,这预示着上一个发布中,可能存在着一个微妙但是非常严重的错误。诸如 StatsD 和 Graphite 之类的开源工具以及通信和浏览分析工具 Google Analytics 会在此帮助到你。
5 s3 T( D- B8 d( W# @
0 X# R0 q: q" l/ F0 K4 r& A
同样的,这些指标应该在可能的情况下加入到你的监视和警告的仪表盘当中。 6 E s% j* K2 z. E. j
0 J* C) h1 }2 L* F6 y2 ^
有许多有价值的开源和商业工具可以帮助你智能的去监控你的应用。这些都是值得评估作为一个快速和符合成本效益的手段,支持你的持续交付项目。 : d% P, R& W) j
% c; w( `( f; E0 \2 Q9 I
目标: 8 a$ Z4 O9 Z& k1 P3 b- n* T
% C5 R4 W% T6 Q, E7 D4 d; _
| 为了实时监控你的应用,最理想的方法应该是通过可视化的仪表盘 4 }- T, Y1 E; s% Q8 p+ }; z/ Q
; K/ k+ L2 ]; w- I+ F# e( [) G, ?, P
| 追踪应用的关键度量,如果部署出现负面的影响就使其发出警报 9 p6 M/ j/ w- R- f% W4 _# Z
# u9 r p6 m/ v1 S |
. G+ G& E( T2 Q; c& P% M) K5 Q实现回滚
0 ~( t4 C c2 s% J, B6 ^
2 a* L3 O: U0 C1 J2 ~
使你的生产环境具备快速可靠的回滚是最后的安全网。" n# _4 X# ~( u7 c$ L! _( }' Z P
7 n; w. L$ g6 l
3 S; k' l" o O) P' i
如果一个 bug 在你的所有手动和自动的测试中通过,那么回滚将使应用在许多用户受到影响之前快速回到之前可用版本。 % o; b5 Q d3 Y# G0 m' @- f3 r
/ W! I% x) @) R" O
伴随着一个优秀的回滚途径带来的益处,你将在自动交付流水线和打开各个阶段之间的大门变得更加有野心。
+ h F$ e) p& H1 d& Z6 Q
1 `( H6 Y" H6 T. {, e+ K+ w
这种信心会带来更快速度的发布,在发布流程中加入自动化会让你变得更有信心。
* m; c7 U1 b4 F5 z. h8 [& }! ?5 Z
1 t- E/ o4 E' G9 J! ?: J3 j
如果发布流水线实现的非常好,你应该不用花费额外代价就能得到这种回滚能力。如果版本9发生了故障,部署版本8就好了,它应该同样可用,所有签署和准备重新部署在您的流水线末端。 ; q, ?, K9 J+ ^% L
0 w. c* H8 l1 C/ j) f
目标:
: x4 b3 ^! J8 m8 g; N
6 Q3 F! U# j2 C! P2 h
| 为快速重复的回滚任何软件提供一种机制 . h: W {( t6 v9 O' I
: e7 {+ O/ l; }7 t- q0 ~' m) s
| 将其构建在流水线流程中,以减少开发者显示的为回滚编码 6 V% e9 j) N+ [9 t
3 T. o4 W) c1 B9 A& B
| 定义的去测试你的回滚机制,作为测试流水线的一部分,以保持你对流程的信心 / u0 z! s0 e9 q& k& o
| 9 V6 j# P' j! M2 S- }
提取特异于环境的配置
& J* D* p) g( j5 \
6 |2 O2 Z6 T9 u/ K
在流水线中正确并且一致的去使用二进制包和产品是很重要的。如果 QA 和 UAT 在开展工作的过程中不同的二进制包,那么你的测试完全是无效的。
; u& u- Z; E) ]/ E0 p8 J `
8 Z* F9 T/ _1 v7 ^% \' T
基于这个理由,你需要获得将同样的应用二进制包推进任意环境的能力,接着分开发布环境特异的配置。这种配置应该像其他任何代码一样进行版本控制,这使得你获得更多的复用和更好的审计。
?# `; X/ l- W- e
5 ^# ]' N ?" J l
确实,这样做最大的阻碍是拥有环境特异的配置会和实际的二进制包紧密的耦合在一起。 " h- T( n3 v! T7 Q. F" M5 p# N
: _" R- c3 P& }& F$ l% W% o
将这些环境特异的配置提取出来,放到额外的属性文件或者其它配置源会使你获得对待此类阻碍更大的敏捷性。
+ ?" l' {/ D1 u8 }6 w$ u8 m% V
$ ^2 b/ A$ w+ S目标:
; C$ ^/ I/ G5 d0 g C1 I) S$ E
1 Q) I6 A! j( Y& y4 ~8 x
| 在你的交付流水线中使用同样的二进制包,避免重新构建源或者以任何方式处理二进制文件,即便你觉得这样做是安全的
e5 b* n7 X8 \: U/ Q2 m
2 Z* Q/ Z+ ~2 j
| 将环境特异的信息提取到版本控制的配置,这会使其从主要的发布产品中分开 : A# A* O- \3 I$ c
|
A/ B- i2 \4 O: X4 F4 A执行金丝雀发布+ L5 N0 Q+ ]4 _1 H. q4 }
2 i3 F m& w1 J# \; L9 Q7 f
一个增加产品环境稳定性的有用的技术是金丝雀发布。这个概念涉及到将你的软件的下个版本发布到生产中,但是只将其暴露给你的用户的一小部分。这可以实现,例如,使用一个负载均衡器仅仅将一小部分比例的信号量定向到新的版本。 : D& j) s8 `# {" g; P
- [8 [% A. f* O. z2 m7 B2 k
尽管我们的目的从来都不是将任何 bug 引入到生产环境中,很明显,你更愿意将大部分用户与任何问题隔离起来。 4 [, |/ a6 u }$ j/ Z. D6 u
! Z+ C1 O7 P7 Z. _& K+ x, h( |
当你在发布过程中建立了信心,随后你可以增加新版本对用户的暴露的数量,知道完全取代旧版本。
7 F& o& M* A0 S( i/ ]
; N4 D; z+ k7 t+ K6 {2 Y) v0 Z: T
金丝雀发布在持续交付的一个重大的胜利,但它需要更多额外的工作和应用架构上的变化。
; a; m1 x; R# ~: \ v
8 ]9 V- `; ?3 a
目标:
Q" [+ B' s: \2 Y
W& V& {+ h& T* N5 L6 G
| 进行金丝雀发布,同时不影响生产版本被用户正常使用 % Z& C5 ^6 B! |! _0 t
|
捕捉构建审计信息
6 D( m: f$ Z% u5 S* |3 U9 O1 n( Q
5 M1 u" Y+ N" E! O! |
理想情况下,你的持续发布流水线应该会给你带来一个清晰的途径,关于每个发布候选者的变更。手动测试可以特定的去关注改变过的区域,在你知道每个发布的实际范围后你会更有自信的前进。
% P/ W4 Y+ O$ n2 C! v; F4 J' S+ }
4 N* p+ L, {& C( d
通过在持续集成服务器上集成问题追踪软件诸如 Jira 和 Pivotal Tracker,你可以开发高度自动化的系统发,发布说明可以被构建和链接回到个别问题或缺陷。
4 S. G; V, u" u* w
9 z2 |: x5 M0 d
你应该确保为了可追踪性和可调查性去捕捉被发布到某个环境的所有二进制文件,仓库管理工具诸如 Nexus 和 Artifactory 在此非常有用。也有很大一批工具,作为容器镜像作为专门的登记。
4 J* }5 v# h2 x
3 T8 y2 _% x; p5 \% o- {( A
, z7 m: O Q5 e7 b# f目标:
$ w: L1 n; B3 [+ a1 T, f
4 @; Z1 q" z$ o7 _6 q, b
| 集成问题追踪软件或者变更管理软件将会为每个发布候选着定位到详细的问题审计信息
/ ^* c% e+ q% `* E3 O$ j9 n
6 \# V' L: s; I- {8 u) W& `; S
| 变更控制所有相关的代码以及归档所有发布过的二进制文件
+ f$ o+ `3 l# v+ ]& Y |
7 e) L7 k: h: k) Z/ M3 R" p实现功能开关 : r: C+ o8 u* f
# b9 J) Y7 o; G& C% Q
功能开关是一个开发者构建进软件的设施,以获得在一个较高水准的粒度上切换不同特性的能力。这项简单的技术可以通过加大控制如何使新的特性投入生产使用以增加系统的可靠性。
& s1 }# j% h' v( `- k9 `
$ r4 e, U N6 r8 ^+ e
一个优秀的功能开关将会: 8 U7 F1 F; ^+ |
& J- `* b# x: ~/ p
在运行时被管理而不需要重启或者中断用户
2 | [0 z [, g& L 8 C* _3 S: ?7 E9 j
5 y) S7 S" R" G. m
0 A4 F7 f6 b* Y$ g- |简单的特性标志可能看上去会简单的构建自己。你可能会喜欢快速发现,然而,你的功能开关实现所需的功能数量迅速扩展:历史比较,审计跟踪和基于角色的访问控制的名称,但是不多。
' `1 y J& u4 M T" V! t! c
* h( c# C7 l7 _) B, O R5 L
目标:
9 d6 g: M3 _$ M U' g( J6 o
) D/ c- @: u4 _* W6 Y; D
| 实施功能开关,充分了解对质量检查和生产操作的影响 4 {3 z$ w, |& U! W: r. n
7 l+ `# p- r3 d0 z! B% k+ t
|
! l, U! c4 Z: d2 @; i8 K9 l2 [使用基于云和管理的基础设施 & |' Y$ c5 N3 i' w. \
& O& u( c' H: K/ _. x2 t0 e
% U' U2 G% P! s) G) ?在这篇文章的多个地方,很多云和基础管理提供商被提及。这是因为他们代表了一种快速和成本效益的方式,加快您的持续交付成功。 / g6 |! R0 C; e) C
6 h! k8 ~ B, P! N, s. Q
云和管理基础设施即服务在支持在构建和发布基础设施时有诸多需求的团队时显得格外有用。比如你可能会发现在你进行发布时,你需要暂时提升你的容量。
5 z; Z% P4 r) b9 q* r( M
9 k4 E' _/ ^" g3 X8 w$ [
云和自动化基础设施管理的结合是处理 CI 中的变化理想选择。基于这个理由,云托管业务诸如DaoCloud Services,DEV@cloud、Travis CI、CircleCi 是外包您的持续交付基础设施的理想候选人。
7 n' o% S' _5 o9 P p
. R4 c. [: ]! j5 r. s, n) V8 c
' {( m$ R' m( l7 c, Z' I' U目标: , O' T6 }4 L: \9 I% y
6 l2 R; e* X$ e" X- o3 W
| 减少基础设施管理投入,并通过部署到云或基础设施服务使其支持变化的需求 " S+ v5 |7 @9 \
8 {# F! v5 t5 f7 @
| 7 l% F; C G5 q' a
检查列表 7 u# x# ?! E: [3 t6 G9 I8 A( d0 K6 c% h4 `
基础原理 - 发布自动化: ]- K. v$ x( }8 p* A
" S/ ?! v6 M! P7 t8 q5 w1 y
自动化构建和打包
% H" G2 D6 I8 Z- J8 ?7 `* _
' `! [/ N' y$ N' W1 j
自动化持续集成 1 X6 [2 Z5 }5 ]1 _4 w2 P
* T8 R3 @$ ?3 ]& {# O
自动化测试
5 W% r7 P. a! ^( n* h1 P! V, j. b
$ n2 t( J# \- r/ E9 V& Z
自动化部署 ! v6 \ g% x: l& Q
) W4 @2 x( d. E" n& i6 M& c
受管理的基础架构和云 # H& x' c! n- v% E- q
' ~3 R' v, W6 I& P0 M. v
基础架构即代码
3 C5 Z8 @2 r9 j% r7 [
; S! N8 ?5 J& g' U1 l
容器框架 $ f; C5 J- N4 A: z
9 V. y8 y# Z: _$ v( H0 I1 X8 U
自动化生产部署 % b: [, C5 i4 E1 u" F! v
实现一个持续交付流水线
( X" F$ P# [% A' f
流水线建模
8 `% ~# \7 I: O; t, g# X/ \! O# }
& ?0 G# \7 Z. a1 }6 d8 ?
识别非自动化的活动和网关 ( \, @. b$ J7 I: \) G
# G. I* Q2 g3 Y4 `0 i
实现流水线
$ F: ?' c i& G) O0 D V7 v/ G
! {4 V3 t) t; ^# L; a3 P I# S
最佳实践 5 G1 o9 I8 C" f3 U6 f
实现监测 : ]5 u2 A' _5 V" [
( P4 g6 L7 j6 E# u) ^" I1 J
实现回滚
* z5 k& t; G8 Q: c& Y/ ~ v8 s
. y a6 Q5 ?6 a9 Y1 H8 A) n- {
提取特定于环境的配置(配置与代码分离)
2 Q7 h1 Y9 Z8 ?& _" H2 X
- V) A0 t' M! ?# [; K
执行金丝雀发布
9 {0 J/ r( f% ]! B! x
! a+ I% C8 V; C* D# g+ ]5 S+ d
记录审计信息 8 F/ L2 ?& m! O! a) i/ L% i
* d2 i3 {& ?9 v" {3 N% y
实现功能开关
: f5 Z* P, U R5 A
1 }; r' ~+ d; Y0 A' n1 e
使用基于云的基础架构 7 {- Z; r* h1 t( K& M; A* @
$ g; m+ |, \% w* B+ p0 `原创: 云原生转型实验室5 b, K `# y; Q- p$ m4 D _
j( W" u3 K2 W. w |