资讯专栏INFORMATION COLUMN

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

dreamtecher / 543人阅读

摘要:本文作者为的架构师,他分享了使用和建立超高速流水线的经验。月日,北京海航万豪酒店,容器技术大会即将举行。

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部署流水线时需要花费时间的地方:

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服务启动,请运行这个栈:

version: "2"
services:
  drone-server:
    image: drone/drone:0.5
    environment:
      DRONE_GITHUB: "true"
      DRONE_GITHUB_CLIENT: 
      DRONE_GITHUB_SECRET: 
      DRONE_OPEN: "true"
      DRONE_ORGS: myGithubOrg
      DRONE_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: 
      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文件到你的仓库,就像这样:

pipeline:
  build:
    image: node:6.10.0
    commands:
      - yarn install
      - yarn test

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

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

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

pipeline:
  slack:
    image: plugins/slack
    webhook: 
    channel: deployments
    username: drone
    template: "<{{build.link}}|Deployment #{{build.number}} started> on  by {{build.author}}"
    when:
      branch: [ master, staging ]
  build:
    image: 
    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: 
    dockerfile: Dockerfile
    storage_path: /drone/docker
  rancher:
    image: peloton/drone-rancher
    url: 
    access_key: ${RANCHER_ACCESS_KEY}
    secret_key: ${RANCHER_SECRET_KEY}
    service: core/platform
    docker_image: 
    confirm: true
    timeout: 240
  slack:
    image: plugins/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场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册链接请戳

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26996.html

相关文章

  • 如何使用GitLabRancher构建CI/CD水线 – Part 2

    摘要:第一部分的内容介绍了如何部署配置和确保在的运行。这一部分中,我们将介绍如何使用构建容器,以及如何使用容器配置项目。除此之外,我们还将涉及如何用建立容器并部署到上。 这是我们使用GitLab和Rancher构建CI/CD流水线系列教程的第二部分。第一部分的内容介绍了如何部署、配置和确保GitLab在Rancher的运行。这一部分中,我们将介绍如何使用GitLab CI Multi-Run...

    maybe_009 评论0 收藏0
  • 如何使用GitLabRancher构建CI/CD水线–Part 1

    摘要:主机端口非常昂贵,因此稍后我们会使用一个负载均衡器。注册完成后,将的配置添加到负载均衡器上。部署负载均衡器在栈中,单击添加服务旁边的下拉菜单,然后选择添加负载均衡器。如果你收到状态或的错误报告,那么需要检查负载均衡器配置,确认设置无误。 介绍 GitLab核心是集成管理Git存储库的工具。比如你希望创建一个提供服务的平台,那么GitLab将提供强大的身份验证和授权机制、工作组、问题跟踪...

    macg0406 评论0 收藏0
  • Rancher upgrade webhook之CI/CD

    摘要:应用镜像示例应用基于官方镜像,修改了页面信息应用镜像推送应用镜像到指定的远程镜像仓库创建通过创建,,命令行如下验证服务打开浏览器,访问服务,确认应用的内容。验证更新打开浏览器,访问服务,验证服务升级内容是否正常。 概述 结合大家CI/CD的应用场景,本篇Blog旨在介绍如何通过Rancher的webhook微服务来实现CI/CD的联动。 流程介绍 本次实践的主要流程如下: CI/CD...

    sf_wangchong 评论0 收藏0
  • 超长干货:基于Docker的DevOps CI/CD实践——来自iHealth的分享

    摘要:在猫屎氤氲的雾气里角仰望天花板,手机微信提醒这次构建成功或失败,并附带污言秽语。这时他可以开始往工位走,坐下时,微信又会提醒本次部署到成功或失败。与企业微信的集成在决定使用之前,需要知道的是,是一个高度依赖社区的项目。 前言 相信我,一切事情的发生都是赶鸭子上架,没有例外。人类所有伟大的变革都是迫不得已,可又是那么顺其自然。比如容器(docker)技术的诞生,比如箭在弦上的创业,比如野...

    Dongjie_Liu 评论0 收藏0
  • 如何使用DockerDocker-ComposeRancher搭建部署Pipeline(四)

    摘要:注册器监视每个守护进程的事件,并在生命周期事件期间自动更新。条件可以包括亲和规则否定至软强制意味着尽可能地避免。当使用通用标记如或部署服务时,可能会出现意外的后果。月日,北京海航万豪酒店,容器技术大会即将举行。 在这篇文章中,我们将讨论如何用Rancher实现consul的服务发现。 如果你还没有准备好,推荐你阅读本系列中先前的文章:第一篇:CI /CD和Docker入门第二篇:使部署...

    13651657101 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<