在本系列教程中,笔者希望将必要的知识点围绕理论、流程(工作流程)、方法、实践来进行讲解,而不是单纯的为讲解知识点而进行讲解。也就是说,笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中,而不是拿着字典写文章,抱着宝典写代码。至于很多具体的语法、技术细节,除了常用的知识点,笔者更希望大家阅读官方文档——毕竟看官网比看书靠谱多了,官网会一直更新和改进,而书和教程自出版或发布之后,基本上就“死“了。

本系列教程预计全部完成还需要2到3个月的时间。在这个过程中,您可以和我们一起讨论、交流和分享这一块的技术。我们也希望得到大家的支持,请多多点赞,你们的支持是我们前进的最大动力!

Docker和持续集成(CI)

什么是持续集成?

我们先得了解持续集成的相关概念,才能更好地指导开发和使用Docker来改进我们的工作流。和其他教程不一样,笔者更喜欢将必要的知识点围绕理论、流程(工作流程)、方法、实践来进行讲解,而不是单纯的为讲解知识点而进行讲解。也就是说,笔者希望为大家打通任督二脉,能够将理论、知识、思想和指导应用到工作的实际场景和实践之中,而不是拿着字典写文章,抱着宝典写代码。至于很多具体的语法、技术细节,除了常用的知识点,笔者更希望大家阅读官方文档——毕竟看官网比看书靠谱多了,官网会一直更新和改进,而书和教程自出版或发布之后,基本上就“死“了。

好了,我们回到正题。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

徒弟一脸崇拜道:“师父,为什么我做出来的飞剑,一念咒语不是碎了就是爆了呢?”。

师父摸了摸胡子道:“徒儿莫急,冰冻三尺非一日之寒!为师我刻了3年的阵法,练习了3年的咒语,然后又花了3年一起练习,才让第一把飞剑飞上了太空。我看你天资聪慧,顶多20年就够了”。

2年后,徒弟边刻阵法边念咒,突然飞剑的剑身嗖的一下不见了,只余剑柄。

师父:“徒儿,你的飞剑怎么飞了一截出去了!”

徒弟握着剑柄行礼道:“师父勿怪,这段时间我对飞剑的制作过程进行了改良,一边刻阵法一边念咒,现在我对阵法和咒语的掌控都达到了70%,所以只有前半截飞出去了!“

注意:集成软件的过程不是新问题,如果项目开发的规模比较小,比如一个人的项目,如果它对外部系统的依赖很小,那么软件集成不是问题,但是随着软件项目复杂度的增加(即使增加一个人),就会对集成和确保软件组件能够在一起工作提出了更多的要求-要早集成,常集成。早集成,频繁的集成帮助项目在早期发现项目风险和质量问题,如果到后期才发现这些问题,解决问题代价很大,很有可能导致项目延期或者项目失败。

核心价值

要素

1.统一的代码库

2.自动构建

3.自动测试

4.每个人每天都要向代码库主干提交代码

5.每次代码递交后都会在持续集成服务器上触发一次构建

6.保证快速构建

7.模拟生产环境的自动测试

8.每个人都可以很容易的获取最新可执行的应用程序

9.每个人都清楚正在发生的状况

10.自动化的部署

原则

1. 所有的开发人员需要在本地机器上做本地构建,然后再提交的版本控制库中,从而确保他们的变更不会导致持续集成失败。

2. 开发人员每天至少向版本控制库中提交一次代码。

3. 开发人员每天至少需要从版本控制库中更新一次代码到本地机器。

4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构建。

5. 每次构建都要100%通过。

6. 每次构建都可以生成可发布的产品。

7. 修复失败的构建是优先级最高的事情。

8. 测试是未来,未来是测试

持续集成我们就先说到这里,建议大家也可以了解下敏捷开发,毕竟持续集成是敏捷开发的基石,但是敏捷开发是一个大命题,这里我们顺带提一下,然后我们还是先继续本篇教程:

师父:“徒儿,你真的在短短3年就让飞剑飞起来了?”。

徒弟:“弟子愚钝,在刻剑的过程中倍觉无聊,又不喜欢哼歌,于是索性边练咒边刻剑。后面徒儿发现,如果刻错了或者念错了,飞剑就会提前直接爆炸,虽然每次炸的内裤都没了,但是能够尽早发现错误。所以徒弟才能一日千里”。

师父摸了摸胡须道:“然来如此!不过,这就是你大庭广众之下裸奔的借口!!?”

Docker和持续集成(CI)

相比其他技术,Docker在持续集成(CI)这块有着先天的优势。在通常的情况下,我们要实现持续集成往往会遇到以下问题:

复杂的依赖关系

不同的项目环境,不同的语言,不同的程序包依赖,甚至是操作系统的依赖等等,都会影响到我们持续集成的自动化脚本的执行。而且依赖包之间的兼容性,版本的兼容性,间接依赖或者多重依赖等问题等等,对于开发和运维来说,都是一个噩梦。就如以下对话:

徒弟:“师父,我按照您教的方式念咒,为什么飞剑飞起来了之后就收不回来了?”。

师父直接一巴掌,说:“兔崽子,上次就和你说了,咒语现在最低的兼容级别是——普通话二级乙等!谁教你说长沙话的!”

不一致的环境

在通常的环境中,我们需要准备好开发、测试和生产环境,往往开发环境随便开发人员折腾,有时候操作系统或者依赖软件的版本的区别、组件的不同、配置不一样,都足够让开发环境正常运行的程序在测试环境上跑不起来,造成测试人员和开发人员的故意伤害事件,导致“行凶人员”后悔终生,感悟到“冲动就是魔鬼”的箴言。我们还是以对话来阐述这个问题:

徒弟拿出普通话二级乙等证书道:“师父,我苦学普通话,终于达到普通话二级乙等。然后按照您教的方式念咒了,之后为什么飞剑飞起来了之后还是没法收回来?”。

师父又是一巴掌,说:“兔崽子,你没看到下雨了么?”

徒弟弱弱的问:“这个和下雨有关系么?是不是雨天法术受雨滴干扰,咒语的效果受到影响呢?”

师父指着外面道:“瞎了?你丫的不赶紧把被子收回来烘干,你的飞剑就甭想要了!”

应用架构的复杂性和配置的多样性

现在的系统架构越来越复杂,甚至由多种开发语言组成,而且包含前后端等多方面内容。这些可能会导致其部署方式的不同以及配置的复杂性。并且一个系统维护到后面,往往有很多历史遗留问题,比如那各种配置文件和配置方式,各种补丁,各种脚本等等。这些因素会导致自动化流程会非常麻烦和艰难。我们继续来一段对话:

徒弟:“师父,被子收好了,但是飞剑越飞越远了,是不是可以教我收回我的飞剑啦!”。

师父张开一只眼:“小崽子,普通话念完后,用长沙话再念一遍收剑咒!前几天,为师对收剑咒又进行了改造。”

徒弟用长沙话念完,飞剑还是再天空中乱窜,并没有降下来的意思。徒弟赶紧问道:“师父,为啥还是不行呢?”

师父弹了弹手指,远处一根若隐若现的细线展现出来,师父指着那根线说:“看到那边那根线没?还不赶紧去追!”

相比这些问题,Docker实现持续集成(CI)就方便多了。

首先,Docker可以让我们非常容易和方便地以“容器化”的方式去部署应用。它就像集装箱一样,打包了所有依赖,再在其他服务器上部署很容易,不至于换服务器后发现各种配置文件散落一地,这样就解决了编译时依赖和运行时依赖的问题。

其次,Docker的隔离性使得应用在运行时就像处于沙箱中,每个应用都认为自己是在系统中唯一运行的程序,这样就可以很方便地在一个系统中部署多种不同环境来解决依赖复杂度的问题。

正因为Docker是以应用为中心,镜像中打包了应用及应用所需的环境,一次构建,处处运行。这种特性完美解决了传统模式下应用迁移后面临的环境不一致问题。

因此使用Docker实现持续集成,我们可以使用一些简单的免费的工具即可实现,也可以非常方便的自己搭建集成环境或者编写脚本实现。比如Azure DevOps、Tencent Hub、Jenkins和TeamCity,接下来我们会逐步进行介绍。

持续集成工作流程

一般情况下,持续集成的流程如下所示:

下面是一个参考流程:

代码版本管理,我们推荐使用Git。关于git版本库的使用,我这里就不啰嗦了,如果有朋友感兴趣,我也可以分享一些内容。

后续,我们将会分享使用相关工具来实施我们的CI流程。

往期内容链接

 
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1uzymsc0hstza

Docker最全教程——从理论到实战(七)的更多相关文章

  1. Docker最全教程——从理论到实战(八)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  2. Docker最全教程——从理论到实战(六)

    托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅.   自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...

  3. Docker最全教程——从理论到实战(五)

    往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...

  4. Docker最全教程——从理论到实战

    Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) Docker最全教程—— ...

  5. Docker最全教程——从理论到实战(一)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...

  6. Docker最全教程---从理论到实战

    目录 前言 随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google.微软.亚马逊.腾讯.阿里.京东和新浪. 从未来的发展方向来看,容器引擎将 ...

  7. Docker最全教程——从理论到实战(二十二)

    前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...

  8. Docker最全教程——从理论到实战(十五)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  9. Docker最全教程——从理论到实战(四)

    往期内容链接 https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608. ...

随机推荐

  1. Class 和 普通构造函数区别

    1. Class 在语法上更加贴合面向对象的写法 2. Class在实现继承上更加易读.易理解 3. 更易于写java等后端语言 4.本质还是语法糖,使用prototype

  2. tf.contrib.slim.data数据加载(1) reader

    reader: 适用于原始数据数据形式的Tensorflow Reader 在库中parallel_reader.py是与reader相关的,它使用多个reader并行处理来提高速度,但文件中定义的类 ...

  3. JAVA DESIGN PATTERN

    工厂模式(factory) 简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承 ...

  4. js数组基础

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. java拦截处理System.exit(0)

    在使用TestNG做单元测试时,需要测试的代码中出现System.exit(0),导致单元测试还未结束程序就停止了.解决方法如下: public class TestMain { public sta ...

  6. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

  7. 整理SpringMVC

    Spring Web MVC核心架构图: 核心架构图流程如下: 1.首先用户发送请求------->DispatcherServlet(前端控制器),前端控制器收到请求后自己不进行处理,而是委托 ...

  8. python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

    一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...

  9. mysql查看编码格式以及修改编码格式

    1.进入mysql,输入show variables like 'character%';查看当前字符集编码情况,显示如下: 其中,character_set_client为客户端编码方式: char ...

  10. .NET Core 微服务架构 Steeltoe 使用(基于 Spring Cloud)

    阅读目录: 1. Spring Cloud Eureka 注册服务及调用 2. Spring Cloud Hystrix 断路器 3. Spring Cloud Hystrix 指标监控 4. Spr ...