您好,登錄后才能下訂單哦!
如何使用Rancher和DroneCI建立超高速Docker CI/CD流水線,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
在Higher Education,為了構(gòu)建我們的CI/CD流水線,我們測試使用了不少CI/CD工具。Rancher和Drone的使用體驗是至今為止我們覺得最簡單、速度最快、最愉快的。從代碼推送/合并到部署分支的那一刻開始,云托管解決方案中將有約一半的時間在測試、構(gòu)建和部署上---這一過程只需三到五分鐘(有些應(yīng)用程序由于更復(fù)雜的構(gòu)建/測試過程需要更多時間)。
搭建Drone環(huán)境的配置和維護對我們的開發(fā)人員十分友好,在Rancher上安裝Drone就和在Rancher上安裝其他內(nèi)容一樣,非常簡單。
CI/CD流水線的好壞實際上是DevOps體驗的核心,直接影響到我們開發(fā)人員。對開發(fā)人員來說,CI/CD流水線最重要的兩點就是速度和簡易性。
第一點就是速度,畢竟沒有什么比推送一行代碼需要等待20分鐘才能投入運行的體驗更糟的了。還有糟糕的一點是,當(dāng)產(chǎn)品出現(xiàn)問題時,由于速度過慢,開發(fā)者推出的熱修復(fù)程序在通過流水線部署時,只會讓公司的錢損失的更多。
第二點是簡易性,在理想狀態(tài)下,開發(fā)人員可以構(gòu)建和維護他們的應(yīng)用部署配置。這讓他們更易于使用,畢竟你肯定不會希望開發(fā)人員因某些原因搭建失敗而不斷艾特(Slack)你。
盡管使用不可變?nèi)萜鬟h遠優(yōu)于維護有狀態(tài)的服務(wù)器,但它們還是有一些缺陷---其中最大的一點就是部署速度:相比于簡單地將代碼推送至現(xiàn)有服務(wù)器上,構(gòu)建并部署容器鏡像的速度更慢。下圖顯示了Docker部署流水線時需要花費時間的地方:
Docker鏡像倉庫的延遲時間(步驟1,4,5)可能和構(gòu)建Docker時花費的大量時間有關(guān),這取決于應(yīng)用程序的大小和搭建所需要的時間。應(yīng)用程序構(gòu)建時間(步驟2,3)可能是固定量,不過也可能受構(gòu)建過程中可用內(nèi)存或CPU核心的嚴(yán)重影響。
如果你使用的是云托管的CI解決方案,那么你就無法控制CI服務(wù)器運行的位置(鏡像倉庫的延遲可能非常慢),并且可能無法掌握運行服務(wù)器/實例的類型(應(yīng)用程序構(gòu)建可能很慢)。另外每個構(gòu)建過程還將產(chǎn)生大量重復(fù)工作,比如每次構(gòu)建都需要下載基本鏡像。
和Jenkins工具類似,Drone需要運行在你的Rancher基礎(chǔ)設(shè)施上。不同的是,Drone是Docker的原生工具——構(gòu)建過程的每個部分都是一個容器。由于基礎(chǔ)鏡像可以跨搭建甚至跨項目共享,Drone運行在你的基礎(chǔ)架構(gòu)上時就能夠加快構(gòu)建的過程。如果你將Drone推送到自己的基礎(chǔ)架構(gòu)(如AWS的ECR)上的Docker鏡像倉庫,還可以很大程度上地避免延遲。
Drone的Docker本地化還消除了大量的配置兼容問題,配過Jenkins的朋友肯定知道這有多便利。
標(biāo)準(zhǔn)的Drone部署過程如下所示:
運行一個容器,通知Slack構(gòu)建已經(jīng)開始
為“測試”容器配置某個基本鏡像,插入代碼并在容器中測試運行
運行一個容器,構(gòu)建和推送生產(chǎn)鏡像(到 Docker Hub、AWS ECR等)
運行一個容器,告訴Rancher升級服務(wù)
運行一個容器,通知Slack構(gòu)建已經(jīng)完成/失敗
A.drone.yml文件看起來和docker-compose.yml文件非常類似——一個容器列表。因為每個步驟都有專用于該任務(wù)的容器,步驟的配置通常非常簡單。
需要的簡要操作如下:
注冊一個新的Github OAuth app
在Rancher上創(chuàng)建一個Drone環(huán)境
添加一個“Drone Server”主機和一個或多個“Drone Worker”主機
給Drone Server主機添加drone=server標(biāo)簽
運行Drone棧
實例的大小取決于你——在Higher Education,我們傾向于使用更少、更強大的workers,這樣可以加快構(gòu)建的速度。(我們發(fā)現(xiàn)一個強大的worker能夠處理7個團隊的構(gòu)建)
一旦你的drone服務(wù)啟動,請運行這個棧:
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服務(wù),并為你環(huán)境上的其他每一臺主機運行一個drone代理。我們強烈推薦你使用MySQL備份Drone,設(shè)定DATABASE_DRIVER和DATASOURCE值即可實現(xiàn)。在本例中我們使用了一個小的RDS實例。
當(dāng)棧啟動運行后,你可以登錄到Drone服務(wù)的IP地址,打開一個倉庫用于搭建(從賬戶菜單)。這里你會注意到Drone UI的每一個倉庫都沒有配置。這一切都需要一個.drone.yml文件來負(fù)責(zé)。
我們來搭建并測試一個Node.js項目,添加一個.drone.yml文件到你的倉庫,就像這樣:
pipeline: build: image: node:6.10.0 commands: - yarn install - yarn test
文件的內(nèi)容非常簡潔,你只需在搭建步驟設(shè)置放置倉庫代碼的容器鏡像,指定要在該容器中運行的命令即可。
其他的項目也可以由Drone插件管理,這些插件相當(dāng)于針對一個任務(wù)的容器。而且因為插件都在Docker Hub上,你不需要安裝它們,只需將它們添加到.drone.yml文件中即可。
下面是一個詳細使用Slack、ECR和Rancher插件創(chuàng)建.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 ]
盡管上面的代碼已經(jīng)接近40行,但它的可讀性非常強,而且其中80%的代碼是拷貝自Drone插件文檔。(如果你想在云托管的CI平臺中進行這些操作,可能需要一天時間去閱讀文檔)需要注意的是,每個插件實際并不需要繁瑣的配置。如果你要使用Docker Hub而不是ECR,使用Docker插件即可。
在幾分鐘內(nèi),你可以啟動運行具有完整功能的CD流水線。另外,使用Rancher Janitor目錄棧確保你的workers的磁盤空間也是一個好主意,你只需知道的是,清理的次數(shù)越少,構(gòu)建的速度就會越快,因為更多的層已經(jīng)緩存好了。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。