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流水線的好壞其實是DevOps體驗的核心,直接影響到咱們開發人員。對開發人員來講,CI/CD流水線最重要的兩點就是速度和簡易性。web
第一點就是速度,畢竟沒有什麼比推送一行代碼須要等待20分鐘才能投入運行的體驗更糟的了。還有糟糕的一點是,當產品出現問題時,因爲速度過慢,開發者推出的熱修復程序在經過流水線部署時,只會讓公司的錢損失的更多。sql
第二點是簡易性,在理想狀態下,開發人員能夠構建和維護他們的應用部署配置。這讓他們更易於使用,畢竟你確定不會但願開發人員因某些緣由搭建失敗而不斷艾特(Slack)你。docker
儘管使用不可變容器遠遠優於維護有狀態的服務器,但它們仍是有一些缺陷---其中最大的一點就是部署速度:相比於簡單地將代碼推送至現有服務器上,構建並部署容器鏡像的速度更慢。下圖顯示了Docker部署流水線時須要花費時間的地方:緩存
Docker鏡像倉庫的延遲時間(步驟1,4,5)可能和構建Docker時花費的大量時間有關,這取決於應用程序的大小和搭建所須要的時間。應用程序構建時間(步驟2,3)多是固定量,不過也可能受構建過程當中可用內存或CPU核心的嚴重影響。服務器
若是你使用的是雲託管的CI解決方案,那麼你就沒法控制CI服務器運行的位置(鏡像倉庫的延遲可能很是慢),而且可能沒法掌握運行服務器/實例的類型(應用程序構建可能很慢)。另外每一個構建過程還將產生大量重複工做,好比每次構建都須要下載基本鏡像。架構
和Jenkins工具相似,Drone須要運行在你的Rancher基礎設施上。不一樣的是,Drone是Docker的原生工具——構建過程的每一個部分都是一個容器。因爲基礎鏡像能夠跨搭建甚至跨項目共享,Drone運行在你的基礎架構上時就可以加快構建的過程。若是你將Drone推送到本身的基礎架構(如AWS的ECR)上的Docker鏡像倉庫,還能夠很大程度上地避免延遲。
Drone的Docker本地化還消除了大量的配置兼容問題,配過Jenkins的朋友確定知道這有多便利。
標準的Drone部署過程以下所示:
A.drone.yml文件看起來和docker-compose.yml文件很是相似——一個容器列表。由於每一個步驟都有專用於該任務的容器,步驟的配置一般很是簡單。
須要的簡要操做以下:
實例的大小取決於你——在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插件便可。
以上就是關於搭建CI/CD流水線的介紹。在幾分鐘內,你能夠啓動運行具備完整功能的CD流水線。另外,使用Rancher Janitor目錄棧確保你的workers的磁盤空間也是一個好主意,你只需知道的是,清理的次數越少,構建的速度就會越快,由於更多的層已經緩存好了。
9月27日,北京海航萬豪酒店,容器技術大會Container Day 2017即將舉行。
CloudStack之父、海航科技技術總監、華爲PaaS部門部長、恆豐銀行科技部總經理、阿里雲PaaS工程總監、民生保險CIO······均已加入豪華講師套餐!
11家已容器落地企業,15位真·雲計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊連接請戳