使用Rancher和DroneCI創建超高速Docker CI/CD流水線

Higher Education(highereducation.com)是一個鏈接學生與高校的入學申請平臺,經過引入高意圖和高質量的潛在學生,以及明確、有效的操做,爲網站合做的大學吸引學生入學。每一年Higher Education爲其大學合做夥伴招收超過15000名在線學生入學申請,有7500萬高意圖的用戶經過網站了解大學入學項目。node

本文做者爲Higher Education的架構師Will Stern,他分享了Higher Education使用Rancher和DroneCI創建超高速Docker CI/CD流水線的經驗。mysql

正文

在Higher Education,爲了構建咱們的CI/CD流水線,咱們測試使用了很多CI/CD工具。Rancher和Drone的使用體驗是至今爲止咱們以爲最簡單、速度最快、最愉快的。從代碼推送/合併到部署分支的那一刻開始,雲託管解決方案中將有約一半的時間在測試、構建和部署上---這一過程只需三到五分鐘(有些應用程序因爲更復雜的構建/測試過程須要更多時間)。git

搭建Drone環境的配置和維護對咱們的開發人員十分友好,在Rancher上安裝Drone就和在Rancher上安裝其餘內容同樣,很是簡單。github

CI/CD流水線的最大需求點

CI/CD流水線的好壞其實是DevOps體驗的核心,直接影響到咱們開發人員。對開發人員來講,CI/CD流水線最重要的兩點就是速度和簡易性。web

第一點就是速度,畢竟沒有什麼比推送一行代碼須要等待20分鐘才能投入運行的體驗更糟的了。還有糟糕的一點是,當產品出現問題時,因爲速度過慢,開發者推出的熱修復程序在經過流水線部署時,只會讓公司的錢損失的更多。sql

第二點是簡易性,在理想狀態下,開發人員能夠構建和維護他們的應用部署配置。這讓他們更易於使用,畢竟你確定不會但願開發人員因某些緣由搭建失敗而不斷艾特(Slack)你。docker

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: <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文件到你的倉庫,就像這樣:

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: <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插件便可。

Docker插件地址

以上就是關於搭建CI/CD流水線的介紹。在幾分鐘內,你能夠啓動運行具備完整功能的CD流水線。另外,使用Rancher Janitor目錄棧確保你的workers的磁盤空間也是一個好主意,你只需知道的是,清理的次數越少,構建的速度就會越快,由於更多的層已經緩存好了。

9月27日,北京海航萬豪酒店,容器技術大會Container Day 2017即將舉行。

CloudStack之父、海航科技技術總監、華爲PaaS部門部長、恆豐銀行科技部總經理、阿里雲PaaS工程總監、民生保險CIO······均已加入豪華講師套餐!

11家已容器落地企業,15位真·雲計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊連接請戳 輸入圖片說明

相關文章
相關標籤/搜索