Docker是CI/CD的早期采用者,通过利用如GIT等源代码控制机制的正确集成,Jenkins可以在开发者每次提交代码时启动构建过程,此过程生成新的Docker镜像,可以在整个环境中立即生效,因此团队可以快速构建共享和部署应用。
$ ]3 c( G3 S4 H4 u1 M% c
* K8 j6 s: T4 I; N用途:根据开发需求,自动配置环境及基础设施,并配备拥有自助服务的自动化工具。
; H9 A- V9 g D5 L( }8 o企业所面临的挑战: # ^5 z9 I$ e5 W& [
) @7 n0 D8 H3 e4 U4 }- U
什么是CI(持续集成) ▼
& G5 ^$ }8 D. yCI是一种开发实践,开发者每天将代码集成到共享存储库中几次,支持将新功能与现有代码集成在一起,此集成的代码还可以确保运行时环境中没有错误,允许检查它与其他变更的反应。1 i8 M: g: M) w6 e- B' N
: u+ s* g# M# F- z. E" Y" f7 M
目前用于CI最流行的工具是“Jenkins”,GIT用于源代码控制存储库,Jenkins可以从GIT存储库中提取最新的代码修订,并生成可以部署到服务器上的构建版本。 * }2 e; _0 i' Y, k# X6 O! i
什么是持续交付 ▼
z' R7 p4 [/ d- H0 q) c, O8 R持续交付是指在给定的时间内将软件部署到任何环境的能力,包括二进制文件、配置和环境变更。
; s. z+ U2 d+ `7 B! x9 R `$ r4 F什么是持续部署(CD) ▼
# I* ^ b5 s) \% f持续部署是开发团队在短周期内发布应用的一种方法,开发人员所做的任何变更都会被部署到生产环境中。 1 \, d4 f4 V8 _- M0 L3 ~
什么是Docker? ▼ : O' y' V- ]2 |" T) x6 z# c
Docker是一个容器化平台,以容器的形式将应用及所有依赖项打包在一起,确保应用能够在任何环境中无缝地工作。
; Y/ s# D8 v# FDocker如何帮助CI/CD ▼ 6 M! N) Z$ {' C/ O r' V
Docker可以帮助开发者构建代码并在任何环境中进行测试,以便尽早地在开发生命周期中获取BUG。Docker的优势在于:帮助简化流程、节省构建时间、并允许开发者并行地运行测试。
. l" M9 G" @' E4 {/ rDocker还可以集成源代码控制管理工具,如GitHub和Jenkins等集成工具,开发者将代码提交到GitHub,测试使用Jenkins创建影响自动触发构建的代码,可以将此影响添加到Docker registry,以处理不同环境类型之间的不一致。
( v2 W! T6 ]/ N* e! ~技术解决方案 ▼
" v4 w$ k# y! x2 e没有Docker参与的典型CI:
9 U; @' g0 e5 J# i p* I开发者将代码提交到存储库,这些代码通常会在持续集成服务器上触发构建,构建过程可能会根据所构建的应用而不同,一般情况下,可以进行编译、运行测试用例、构建应用,然后将应用部署到服务器中。
5 Y1 l( w7 Z2 `1 b通过Docker进行的CI: 3 S0 u- `& x# l( `* l
在CI过程中安装Docker的方法是让CI服务器在构建应用后再构建Docker镜像,应用进入镜像内部,将镜像推到Docker Hub,在另一台主机上或QA/DEV/生产环境,从Docker Hub提取即将完成的构建,并运行应用的容器,在CI服务器中,甚至可以将编译和测试作为镜像构建的一部分运行。 ; z% R* v }7 F: m2 l3 Y8 L
好处:$ M, d' E, X/ B$ O! U! a2 ~
▼ # Q1 f7 L/ P8 U- ?8 Q" q
! D6 o: L: o0 C+ ?5 V
本文作者有多年的持续部署(CD)经验,帮助很多公司实践及优化CD,以下是一些关于CI/CD的经验及建议:
1 f+ C1 |. f- O+ ~7 f- Y' hNo.1 使用工具:) |& e$ n3 y2 Y) x, q) r
▼
% k& a+ a0 R/ s: D. ?! b: m- \4 V6 \虽然使用工具听起来很平常,但仍有一些公司没有使用工具,这对公司或个人没有益处,推荐使用Circle类似的工具,工作流方面也应该有一定的工具使用规划。
' p' ^9 y- p8 g: |! g c 1 ~1 }0 B% U$ N4 I1 A9 J
No.2 做单元测试:
- R3 o# B6 N5 v* W# y ▼
; B1 k, r% O, k& d& G+ N* A需时刻提醒团队成员,持续部署只是应用于部署的持续集成,因此需要良好的单元测试覆盖率,如果还没有一个坚实的单元测试和持续集成的基础,那就是准备尚不完善。4 p+ i% X7 @. R* j3 l. a
% G3 `* Q2 | \
No.3 做好监控:
8 G d: C6 y* E/ M2 w) @- K; P ▼ 6 U* E/ O* L0 L) y0 S% ]' g9 R8 J' i
BUG和回滚是不可避免的,通过查看生产中的数据,将系统放在适合的位置,可以知道何时进行了回滚或BUG传递,将其绑定到自动化回滚,因此如果有关键功能或指标出错,那么CD系统会自动回滚到稳定版本。 ( ~" ]( \* f2 s- e) e8 _
No.4 团队信任: ▼
C5 {2 R8 m, f0 f- {+ a- ]选择相信团队成员,容忍开发人员的错误,在认为合适的时候进行部署,并互相检查代码,将持续部署与分层权限的区域性结合在一起。
; ]1 ?+ D4 Q8 z- [% nNo.5 简化代码评审过程: ▼ " n$ i2 e5 M8 }) e0 f& F
与上面所说的团队信任类似,团队应该检查代码变更,选择最有资格和洞察力的人去检查开发人员的代码。" {' I! k$ J' r* m; ]! D$ S
5 y# g* D6 z# R1 @: |! \7 p7 K; M6 nNo.6 让开发人员紧密参与生产操作: ▼
K. B) [5 P1 V; s w2 h没有成功地过度到持续部署的公司最常见的问题是开发团队是独立的,开发和运维应该在适合的时候互相参与到对方的工作当中,要让开发团队深入参与CD基础设施的建设和规划。 ' b0 T- C' r- i0 S1 Y- @ ?
No.7 尽早测试: ▼
. v$ T4 j- g7 i4 f; I$ _团队需要不断地反馈,把测试目标看做是在正确的时间获得正确的反馈,因此在部署时才能知道什么是有效或错误的,越早发现BUG,就越容易修复,持续部署做的极好的公司都会有全面的单元测试和集成测试覆盖率。
+ X# L# C3 V. d/ h9 d8 l 5 |! K4 ]7 U$ C7 }
结论: ▼ & v- Y6 B! c: D0 A' }% W( G3 e
持续测试也是一种开发实践,在一天的测试计划中,开发需要不断地将代码集成到共享存储库中,为了让开发团队能够检测出问题,自动化构建可以用来验证每个测试,若不遵循连续的方式,那么集成和修复BUG会消耗更长的时间。
9 E1 K$ k3 n8 r& [8 R$ R: c+ T 0 Z w9 M) n# ^. @3 P! K
为了提高应用开发过程的敏捷性,在企业中使用Docker简化和稳定了CI/CD,Docker容器的轻量级特性使其快速运转,并有助于快速测试,并且可以使用可重复的流程,创建类似环境产品。
# e# F$ |2 ]9 X, T' E7 J
来自:数人云 ) l( i6 I" ]" F( O/ i
|