1. 介紹
Drone by Harness? 是一個(gè)基于Docker容器技術(shù)的可擴(kuò)展的持續(xù)集成引擎啄育,用于自動(dòng)化測(cè)試酌心、構(gòu)建、發(fā)布挑豌。每個(gè)構(gòu)建都在一個(gè)臨時(shí)的Docker容器中執(zhí)行安券,使開發(fā)人員能夠完全控制其構(gòu)建環(huán)境并保證隔離。開發(fā)者只需在項(xiàng)目中包含 .drone.yml文件氓英,將代碼推送到 git 倉庫侯勉,Drone就能夠自動(dòng)化的進(jìn)行編譯、測(cè)試铝阐、發(fā)布址貌。可以與Docker完美集成徘键。
https://docs.drone.io/
特點(diǎn)
- Drone引入了Pipelnes的概念练对,管道可幫助我們自動(dòng)化軟件交付過程中的步驟,例如啟動(dòng)代碼構(gòu)建吹害,運(yùn)行自動(dòng)化測(cè)試以及部署到暫存或生產(chǎn)環(huán)境锹淌。
- 通過將.drone.yml文件放在git信息庫的根目錄中來配置管道。 yaml語法旨在易于閱讀和表達(dá)赠制,以便查看存儲(chǔ)庫的任何人都可以理解工作流程赂摆。
- Drone通過多個(gè)step來完成一系列的指令。
為什么選擇Drone?
和 Jenkins 相比钟些, Drone 就輕量的多了烟号,從應(yīng)用本身的安裝部署到流水線的構(gòu)建都簡(jiǎn)潔的多。由于是和源碼管理系統(tǒng)相集成政恍,所以 Drone 天生就省去了各種賬戶權(quán)限的配置汪拥,直接與 gitlab 、 github 篙耗、 Bitbucket 這樣的源碼管理系統(tǒng)操作源代碼的權(quán)限一致
Drone 與流行的源代碼管理提供商無縫集成迫筑,支持github、gitlab宗弯、gogs脯燃、gitea、gitee蒙保、bitbucket server/cloud辕棚, 這是使用Drone的第一印象,可以實(shí)行快速打造GitOps場(chǎng)景
流水線插件是執(zhí)行預(yù)定義任務(wù)的 Docker 容器,通過將它們配置為Pipeline中的步驟逝嚎。插件可用于部署代碼扁瓢、發(fā)布工件、發(fā)送通知等补君。
2. 部署Gogs-極易搭建的自助 Git 服務(wù)
安裝MySQL
docker run --name gogs-mysql --restart=always -v /opt/mysql/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.19
創(chuàng)建Gogs及drone數(shù)據(jù)庫
#mysql -uroot -p123456 -h 127.0.0.1
CREATE DATABASE IF NOT EXISTS gogs CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
create database drone;
# Pull image from Docker Hub.
$ docker pull gogs/gogs
# Create local directory for volume.
$ mkdir -p /var/gogs
運(yùn)行Gogs
docker run --name=gogs --restart=always --link gogs-mysql:db -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs
賬號(hào):admin
密碼:123456
打開頁面繼續(xù)配置Gogs
3. 部署Drone-Server
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://192.168.31.112:10080 \
--env=DRONE_RPC_SECRET=123456 \
--env=DRONE_SERVER_HOST=192.168.31.112 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_LOGS_TRACE=true \
--publish=801:80 \
--publish=4431:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2.0.2
- DRONE_GOGS_SERVER:這里使用的是gogs作為git倉儲(chǔ)引几,當(dāng)然drone也支持github,gitlab等一些主流的源碼管理平臺(tái),不同的平臺(tái)需要設(shè)置不同的環(huán)境變量
- DRONE_RPC_SECRET:與agent之間通信的密鑰挽铁,一定要配置
- DRONE_SERVER_HOST:設(shè)置drone server使用的host名稱伟桅,可以是ip地址加端口號(hào)
- DRONE_SERVER_PROTO:使用的協(xié)議http/https
- DRONE_USER_CREATE:設(shè)置初始的管理員,這個(gè)是超級(jí)管理員
- DRONE_LOGS_TRACE:?jiǎn)?dòng)日志屿储,默認(rèn)是關(guān)閉的
- DRONE_OPEN 開啟注冊(cè)贿讹,此配置允許任何人自注冊(cè)和登錄系統(tǒng)
4. 激活倉庫配置Webhook
- 1 登錄drone激活倉庫
- 2 在倉庫創(chuàng)建.drone.yml文件
- 3 檢查倉庫的webhooks配置是否正常
激活之后,自動(dòng)就會(huì)在gogs倉庫的Web設(shè)置中創(chuàng)建鉤子
當(dāng)不存在.drone.yml文件或者倉庫沒有在drone激活够掠,測(cè)試返回的報(bào)文可能是dial tcp連接失敗民褂。
5. 部署Drone-Runner
Drone CI提供了多種runtime,可以利用docker方式運(yùn)行疯潭,也可以通過傳統(tǒng)ssh方式運(yùn)行赊堪,也可以采用k8s作為runtime;Drone CI實(shí)現(xiàn)了一個(gè)可拓展的runner架構(gòu),方便實(shí)現(xiàn)各種runner竖哩。Drone Runner是獨(dú)立的守護(hù)程序哭廉,用于輪詢服務(wù)器以執(zhí)行掛起的Pipeline。有不同類型的Runner針對(duì)不同的用例和運(yùn)行時(shí)環(huán)境進(jìn)行了優(yōu)化相叁。成功安裝Drone Server后遵绰,必須安裝一個(gè)或多個(gè)運(yùn)行器。
使用ssh-runner
用 SSH 協(xié)議在靜態(tài)遠(yuǎn)程服務(wù)器上執(zhí)行管道命令增淹。管道命令直接在遠(yuǎn)程服務(wù)器上執(zhí)行椿访,沒有隔離,使用默認(rèn) shell虑润。出于安全原因成玫,此運(yùn)行器不適合不受信任的工作負(fù)荷。
docker run -d \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.31.112:801 \
-e DRONE_RPC_SECRET=123456 \
-p 4001:3000 \
--restart always \
--name runner-ssh \
drone/drone-runner-ssh
使用 docker runner
針對(duì)可以在無狀態(tài)容器中運(yùn)行測(cè)試和編譯代碼的項(xiàng)目進(jìn)行了優(yōu)化; 不太適合無法在容器內(nèi)運(yùn)行測(cè)試或編譯代碼的項(xiàng)目拳喻,包括面向 Docker 不支持的操作系統(tǒng)或體系結(jié)構(gòu)(如 macOS)的項(xiàng)目哭当。Docker 運(yùn)行器也不太適合需要在管道執(zhí)行之間在主機(jī)上存儲(chǔ)文件或文件夾的有狀態(tài)管道
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.31.112:801 \
-e DRONE_RPC_SECRET=123456 \
-e DRONE_RUNNER_CAPACITY=10 \
-e DRONE_RUNNER_NAME=${HOSTNAME} \
-p 4002:3000 \
--restart always \
--name runner-docker \
drone/drone-runner-docker:1
- DRONE_RPC_HOST:上面啟動(dòng)server時(shí)配置的host
- DRONE_RPC_SECRET:跟server配置的要保持一致
- DRONE_RUNNER_CAPACITY:可以同時(shí)執(zhí)行的任務(wù)數(shù)
- DRONE_RUNNER_NAME:一般設(shè)置為主機(jī)名
6. 配置.drone.yml運(yùn)行Pipeline
要使用 Drone 只需在項(xiàng)目根創(chuàng)建一個(gè) .drone.yml 文件即可,這個(gè)是 Drone 構(gòu)建腳本的配置文件冗澈,它隨項(xiàng)目一塊進(jìn)行版本管理钦勘,開發(fā)者不需要額外再去維護(hù)一個(gè)配置腳本。其實(shí)現(xiàn)代 CI 程序都是這么做了, 包括 gitlab-ci, jenkinsfile, tekton等渗柿。
源碼地址: https://gitee.com/devops-samples/drone-examples
7 . Drone的場(chǎng)景使用
1) 啟動(dòng)新build
支持選擇git 分支个盆, 以及設(shè)置啟動(dòng)參數(shù)脖岛, 這個(gè)功能在大部分構(gòu)建平臺(tái)都有體現(xiàn)
2) 同步-SYNC
點(diǎn)擊 SYNC 按鈕朵栖,就會(huì)和代碼倉庫進(jìn)行同步颊亮,如果有倉庫刪除或者增加,就會(huì)同步進(jìn)行更新
3) 定時(shí)觸發(fā)器-Cron jobs
幾乎所有的構(gòu)建平臺(tái)都會(huì)提供類似的觸發(fā)器陨溅,比如 git web hook, 時(shí)間定時(shí)器等
4) 加密參數(shù) - Secrets
流水線執(zhí)行過程中會(huì)涉及很多和服務(wù)交互终惑,所以需要提供各種憑證,比如密碼门扇,token 等雹有,所以Secrets也是流水線中的一個(gè)重要元素。
5) 版本部署/回滾 -Promote/Rollback
僅僅完成制品的構(gòu)建是遠(yuǎn)遠(yuǎn)不夠的臼寄,Drone也考慮到了部署和回滾的問題霸奕,所以提供了promote/rollbakc事件, 針對(duì) 某個(gè)成功版本進(jìn)行部署或者回滾,和條件判斷when一起使用吉拳。
6)步驟間順序依賴- 有向無環(huán)圖
Drone 通過 **kind:pipeline **對(duì)步驟進(jìn)行組織质帅,支持并行流水線,同時(shí)通過 **depends_on **對(duì)流水線的先后順序進(jìn)行限制留攒, 如圖所示煤惩。
7 )上下游流水線間調(diào)用
參考
- drone pipeline - https://docs.drone.io/pipeline/overview/
- drone 流水線配置 - https://docs.drone.io/pipeline/docker/syntax/
- drone yaml元素 - https://docs.drone.io/yaml/docker/
總結(jié)
- Drone與代碼管理平臺(tái)(e.g. gitlab, gogs)是強(qiáng)綁定關(guān)系,如果代碼管理平臺(tái)不能訪問炼邀,Drone就無法登錄魄揉,這個(gè)在Drone-Server的啟動(dòng)命令就可以看出來。
- Drone 學(xué)習(xí)成本低拭宁,語法簡(jiǎn)潔洛退,如果你接觸過其他構(gòu)建平臺(tái),特別是云原生的杰标,基于YAML進(jìn)行編排的CI引擎兵怯,都是類似的。
- Drone是GitOps實(shí)踐額典型工具在旱,通過和代碼倉庫進(jìn)行深度融合摇零,做到了隨時(shí)提交,隨時(shí)構(gòu)建桶蝎,很多能力都是通過容器插件實(shí)現(xiàn)驻仅,這也是有別于傳統(tǒng)構(gòu)建系統(tǒng)的重要特點(diǎn)
- 從能力上,Drone本身就是輕量級(jí)的登渣, 所以相對(duì)比較單一噪服,可能無法滿足復(fù)雜的業(yè)務(wù)場(chǎng)景。目前Drone已經(jīng)被收購胜茧,成為harness**平臺(tái)的重要一部分粘优, **在該平臺(tái)上也可以看到Drone的身影仇味。
Harness CDaaS平臺(tái)為應(yīng)用程序交付提供了一種更加無縫的方法,該方法可以自動(dòng)檢測(cè)GitHub雹顺,Bamboo丹墨,Jenkins,Artifactory或Nexus存儲(chǔ)庫或任何Git存儲(chǔ)庫中的新版本嬉愧。一旦DevOps團(tuán)隊(duì)收到警報(bào)贩挣,他們可以使用圖形工具不僅使用YAML文件自動(dòng)化構(gòu)建管道的過程,還可以利用機(jī)器學(xué)習(xí)算法評(píng)估部署的質(zhì)量没酣,然后在必要時(shí)通過從工具訪問數(shù)據(jù)自動(dòng)回滾例如AppDynamics王财,New Relic,Splunk裕便,Elastic Search和Sumologic绒净,并添加了Habib。
<img src=https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b698f953b07d4ccfb29bfa2e13545acd~tplv-k3u1fbpfcp-zoom-1.image width=500 height=350 />