使用Rancher和DroneCI建立超高速Docker CI/CD流水线

简介:

Higher Education(highereducation.com)是一个连接学生与高校的入学申请平台,通过引入高意图和高质量的潜在学生,以及明确、有效的操作,为网站合作的大学吸引学生入学。每年Higher Education为其大学合作伙伴招收超过15000名在线学生入学申请,有7500万高意图的用户通过网站了解大学入学项目。


本文作者为Higher Education的架构师Will Stern,他分享了Higher Education使用Rancher和DroneCI建立超高速Docker CI/CD流水线的经验。


正文


在Higher Education,为了构建我们的CI/CD流水线,我们测试使用了不少CI/CD工具。Rancher和Drone的使用体验是至今为止我们觉得最简单、速度最快、最愉快的。从代码推送/合并到部署分支的那一刻开始,云托管解决方案中将有约一半的时间在测试、构建和部署上---这一过程只需三到五分钟(有些应用程序由于更复杂的构建/测试过程需要更多时间)。


搭建Drone环境的配置和维护对我们的开发人员十分友好,在Rancher上安装Drone就和在Rancher上安装其他内容一样,非常简单。


CI/CD流水线的最大需求点


CI/CD流水线的好坏实际上是DevOps体验的核心,直接影响到我们开发人员。对开发人员来说,CI/CD流水线最重要的两点就是速度和简易性。


第一点就是速度,毕竟没有什么比推送一行代码需要等待20分钟才能投入运行的体验更糟的了。还有糟糕的一点是,当产品出现问题时,由于速度过慢,开发者推出的热修复程序在通过流水线部署时,只会让公司的钱损失的更多。


第二点是简易性,在理想状态下,开发人员可以构建和维护他们的应用部署配置。这让他们更易于使用,毕竟你肯定不会希望开发人员因某些原因搭建失败而不断艾特(Slack)你。


Docker CI/CD流水线的速度痛点


尽管使用不可变容器远远优于维护有状态的服务器,但它们还是有一些缺陷---其中最大的一点就是部署速度:相比于简单地将代码推送至现有服务器上,构建并部署容器镜像的速度更慢。下图显示了Docker部署流水线时需要花费时间的地方:


wKioL1mYOeiQ_TB8AAKypH1wdsk229.jpg


Docker镜像仓库的延迟时间(步骤1,4,5)可能和构建Docker时花费的大量时间有关,这取决于应用程序的大小和搭建所需要的时间。应用程序构建时间(步骤2,3)可能是固定量,不过也可能受构建过程中可用内存或CPU核心的严重影响。


如果你使用的是云托管的CI解决方案,那么你就无法控制CI服务器运行的位置(镜像仓库的延迟可能非常慢),并且可能无法掌握运行服务器/实例的类型(应用程序构建可能很慢)。另外每个构建过程还将产生大量重复工作,比如每次构建都需要下载基本镜像。


开始Drone CI


和Jenkins工具类似,Drone需要运行在你的Rancher基础设施上。不同的是,Drone是Docker的原生工具——构建过程的每个部分都是一个容器。由于基础镜像可以跨搭建甚至跨项目共享,Drone运行在你的基础架构上时就能够加快构建的过程。如果你将Drone推送到自己的基础架构(如AWS的ECR)上的Docker镜像仓库,还可以很大程度上地避免延迟。


Drone的Docker本地化还消除了大量的配置兼容问题,配过Jenkins的朋友肯定知道这有多便利。


标准的Drone部署过程如下所示:


  • 运行一个容器,通知Slack构建已经开始

  • 为“测试”容器配置某个基本镜像,插入代码并在容器中测试运行

  • 运行一个容器,构建和推送生产镜像(到 Docker Hub、AWS ECR等)

  • 运行一个容器,告诉Rancher升级服务

  • 运行一个容器,通知Slack构建已经完成/失败


A.drone.yml文件看起来和docker-compose.yml文件非常类似——一个容器列表。因为每个步骤都有专用于该任务的容器,步骤的配置通常非常简单。


启动并运行Drone


需要的简要操作如下:


  • 注册一个新的Github OAuth app

  • 在Rancher上创建一个Drone环境

  • 添加一个“Drone Server”主机和一个或多个“Drone Worker”主机

    • 给Drone Server主机添加drone=server标签

  • 运行Drone栈


实例的大小取决于你——在Higher Education,我们倾向于使用更少、更强大的workers,这样可以加快构建的速度。(我们发现一个强大的worker能够处理7个团队的构建)


一旦你的drone服务启动,请运行这个栈:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version:  '2'
services:
   drone-server:
     image: drone/drone: 0.5
     environment:
       DRONE_GITHUB:  'true'
       DRONE_GITHUB_CLIENT: <github client>
       DRONE_GITHUB_SECRET: <github secret>
       DRONE_OPEN:  'true'
       DRONE_ORGS: myGithubOrg
       DRONE_SECRET: <make up a secret!>
       DRONE_GITHUB_PRIVATE_MODE:  'true'
       DRONE_ADMIN: someuser,someotheruser,
       DRONE_DATABASE_DRIVER: mysql
       DRONE_DATABASE_DATASOURCE: user:password @tcp (databaseurl: 3306 )/drone?parseTime= true
     volumes:
     - /drone:/var/lib/drone/
     ports:
     80 : 8000 /tcp
     labels:
       io.rancher.scheduler.affinity:host_label: drone=server
   drone-agent:
     image: drone/drone: 0.5
     environment:
       DRONE_SECRET: <make up a secret!>
       DRONE_SERVER: ws: //drone-server:8000/ws/broker
     volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     command:
     - agent
     labels:
       io.rancher.scheduler.affinity:host_label_ne: drone=server
       io.rancher.scheduler.global:  'true'

这将在你的drone=server主机上运行一个Drone服务,并为你环境上的其他每一台主机运行一个drone代理。我们强烈推荐你使用MySQL备份Drone,设定DATABASE_DRIVER和DATASOURCE值即可实现。在本例中我们使用了一个小的RDS实例。


当栈启动运行后,你可以登录到Drone服务的IP地址,打开一个仓库用于搭建(从账户菜单)。这里你会注意到Drone UI的每一个仓库都没有配置。这一切都需要一个.drone.yml文件来负责。


添加搭建配置


我们来搭建并测试一个Node.js项目,添加一个.drone.yml文件到你的仓库,就像这样:

1
2
3
4
5
6
pipeline:
   build:
     image: node: 6.10 . 0
     commands:
       - yarn install
       - yarn test

文件的内容非常简洁,你只需在搭建步骤设置放置仓库代码的容器镜像,指定要在该容器中运行的命令即可。


其他的项目也可以由Drone插件管理,这些插件相当于针对一个任务的容器。而且因为插件都在Docker Hub上,你不需要安装它们,只需将它们添加到.drone.yml文件中即可。


下面是一个详细使用Slack、ECR和Rancher插件创建.drone.yml的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
pipeline:
   slack:
     image: plugins/slack
     webhook: <your slack webhook url>
     channel: deployments
     username: drone
     template: "<`build`.`link`|Deployment #`build`.`number` started> on <http: //github.com/
`repo`.`owner`/`repo`.`name`/tree/`build`.`branch`|`repo`.`name`:`build`.`branch`> by `build`.`author`"
     when:
       branch: [ master, staging ]
   build:
     image: <your base image, say node: 6.10 . 0 >
     commands:
       - yarn install
       - yarn test
     environment:
       - SOME_ENV_VAR=some-value
   ecr:
     image: plugins/ecr
     access_key: ${AWS_ACCESS_KEY_ID}
     secret_key: ${AWS_SECRET_ACCESS_KEY}
     repo: <your repo name>
     dockerfile: Dockerfile
     storage_path: /drone/docker
   rancher:
     image: peloton/drone-rancher
     url: <your rancher url>
     access_key: ${RANCHER_ACCESS_KEY}
     secret_key: ${RANCHER_SECRET_KEY}
     service: core/platform
     docker_image: <image to pull>
     confirm:  true
     timeout:  240
   slack:
     image: plugins/slack
     webhook: <your slack webhook>
     channel: deployments
     username: drone
     when:
       branch: [ master, staging ]
       status: [ success, failure ]

尽管上面的代码已经接近40行,但它的可读性非常强,而且其中80%的代码是拷贝自Drone插件文档。(如果你想在云托管的CI平台中进行这些操作,可能需要一天时间去阅读文档)需要注意的是,每个插件实际并不需要繁琐的配置。


如果你要使用Docker Hub而不是ECR,使用Docker插件即可。


以上就是关于搭建CI/CD流水线的介绍。在几分钟内,你可以启动运行具有完整功能的CD流水线。另外,使用Rancher Janitor目录栈确保你的workers的磁盘空间也是一个好主意,你只需知道的是,清理的次数越少,构建的速度就会越快,因为更多的层已经缓存好了。


9月27日,北京海航万豪酒店,容器技术大会Container Day 2017即将举行。


CloudStack之父、海航科技技术总监、华为PaaS部门部长、恒丰银行科技部总经理、阿里云PaaS工程总监、民生保险CIO······均已加入豪华讲师套餐!


11家已容器落地企业,15位真·云计算大咖,13场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册链接请戳

wKioL1nAdcrSf2B0AAgMYxVaxjM783.png



本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1957921


相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
496 2
|
11月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
1258 2
|
存储 测试技术 持续交付
Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用
本文探讨了Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用。首先介绍了CI/CD的基本概念,接着阐述了Docker在环境一致性、快速部署、资源隔离和轻量化方面的优势。文章还详细讨论了构建、测试和部署阶段的具体集成方法,以及集成后带来的效率提升、可靠性增强、加速交付和易于管理等好处。最后,通过案例分析展示了集成的实际效果,强调了Docker与CI/CD结合的重要性和未来前景。
434 2
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
1124 5
|
11月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
936 115
|
11月前
|
缓存 前端开发 Docker
Docker Layer Caching:加速你的容器构建
Docker Layer Caching:加速你的容器构建