1. 介紹
Drone by Harness™ 是一個基于Docker容器技術的可擴充的持續內建引擎,用于自動化測試、建構、釋出。每個建構都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其建構環境并保證隔離。開發者隻需在項目中包含 .drone.yml檔案,将代碼推送到 git 倉庫,Drone就能夠自動化的進行編譯、測試、釋出。可以與Docker完美內建。
https://docs.drone.io/
特點
- Drone引入了Pipelnes的概念,管道可幫助我們自動化軟體傳遞過程中的步驟,例如啟動代碼建構,運作自動化測試以及部署到暫存或生産環境。
- 通過将.drone.yml檔案放在git資訊庫的根目錄中來配置管道。 yaml文法旨在易于閱讀和表達,以便檢視存儲庫的任何人都可以了解工作流程。
- Drone通過多個step來完成一系列的指令。
為什麼選擇Drone?
- 和 Jenkins 相比, Drone 就輕量的多了,從應用本身的安裝部署到流水線的建構都簡潔的多。由于是和源碼管理系統相內建,是以 Drone 天生就省去了各種賬戶權限的配置,直接與 gitlab 、 github 、 Bitbucket 這樣的源碼管理系統操作源代碼的權限一緻
- Drone 與流行的源代碼管理提供商無縫內建,支援github、gitlab、gogs、gitea、gitee、bitbucket server/cloud, 這是使用Drone的第一印象,可以實行快速打造GitOps場景
- 流水線插件是執行預定義任務的 Docker 容器,通過将它們配置為Pipeline中的步驟。插件可用于部署代碼、釋出工件、發送通知等。
2. 部署Gogs-極易搭建的自助 Git 服務
安裝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
建立Gogs及drone資料庫
#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
運作Gogs
docker run --name=gogs --restart=always --link gogs-mysql:db -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs
賬号:admin
密碼:123456
打開頁面繼續配置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倉儲,當然drone也支援github,gitlab等一些主流的源碼管理平台,不同的平台需要設定不同的環境變量
- DRONE_RPC_SECRET:與agent之間通信的密鑰,一定要配置
- DRONE_SERVER_HOST:設定drone server使用的host名稱,可以是ip位址加端口号
- DRONE_SERVER_PROTO:使用的協定http/https
- DRONE_USER_CREATE:設定初始的管理者,這個是超級管理者
- DRONE_LOGS_TRACE:啟動日志,預設是關閉的
- DRONE_OPEN 開啟注冊,此配置允許任何人自注冊和登入系統
4. 激活倉庫配置Webhook
- 1 登入drone激活倉庫
- 2 在倉庫建立.drone.yml檔案
- 3 檢查倉庫的webhooks配置是否正常
激活之後,自動就會在gogs倉庫的Web設定中建立鈎子
當不存在.drone.yml檔案或者倉庫沒有在drone激活,測試傳回的封包可能是dial tcp連接配接失敗。
5. 部署Drone-Runner
Drone CI提供了多種runtime,可以利用docker方式運作,也可以通過傳統ssh方式運作,也可以采用k8s作為runtime;Drone CI實作了一個可拓展的runner架構,友善實作各種runner。Drone Runner是獨立的守護程式,用于輪詢伺服器以執行挂起的Pipeline。有不同類型的Runner針對不同的用例和運作時環境進行了優化。成功安裝Drone Server後,必須安裝一個或多個運作器。
使用ssh-runner
用 SSH 協定在靜态遠端伺服器上執行管道指令。管道指令直接在遠端伺服器上執行,沒有隔離,使用預設 shell。出于安全原因,此運作器不适合不受信任的工作負荷。
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
針對可以在無狀态容器中運作測試和編譯代碼的項目進行了優化; 不太适合無法在容器内運作測試或編譯代碼的項目,包括面向 Docker 不支援的作業系統或體系結構(如 macOS)的項目。Docker 運作器也不太适合需要在管道執行之間在主機上存儲檔案或檔案夾的有狀态管道
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:上面啟動server時配置的host
- DRONE_RPC_SECRET:跟server配置的要保持一緻
- DRONE_RUNNER_CAPACITY:可以同時執行的任務數
- DRONE_RUNNER_NAME:一般設定為主機名
6. 配置.drone.yml運作Pipeline
要使用 Drone 隻需在項目根建立一個 .drone.yml 檔案即可,這個是 Drone 建構腳本的配置檔案,它随項目一塊進行版本管理,開發者不需要額外再去維護一個配置腳本。其實作代 CI 程式都是這麼做了, 包括 gitlab-ci, jenkinsfile, tekton等。
源碼位址: https://gitee.com/devops-samples/drone-examples
7 . Drone的場景使用
1) 啟動新build
支援選擇git 分支, 以及設定啟動參數, 這個功能在大部分建構平台都有展現
2) 同步-SYNC
點選 SYNC 按鈕,就會和代碼倉庫進行同步,如果有倉庫删除或者增加,就會同步進行更新
3) 定時觸發器-Cron jobs
幾乎所有的建構平台都會提供類似的觸發器,比如 git web hook, 時間定時器等
4) 加密參數 - Secrets
流水線執行過程中會涉及很多和服務互動,是以需要提供各種憑證,比如密碼,token 等,是以Secrets也是流水線中的一個重要元素。
5) 版本部署/復原 -Promote/Rollback
僅僅完成制品的建構是遠遠不夠的,Drone也考慮到了部署和復原的問題,是以提供了promote/rollbakc事件, 針對 某個成功版本進行部署或者復原,和條件判斷when一起使用。
6)步驟間順序依賴- 有向無環圖
Drone 通過 **kind:pipeline **對步驟進行組織,支援并行流水線,同時通過 **depends_on **對流水線的先後順序進行限制, 如圖所示。
7 )上下遊流水線間調用
參考
- drone pipeline - https://docs.drone.io/pipeline/overview/
- drone 流水線配置 - https://docs.drone.io/pipeline/docker/syntax/
- drone yaml元素 - https://docs.drone.io/yaml/docker/
總結
- Drone與代碼管理平台(e.g. gitlab, gogs)是強綁定關系,如果代碼管理平台不能通路,Drone就無法登入,這個在Drone-Server的啟動指令就可以看出來。
- Drone 學習成本低,文法簡潔,如果你接觸過其他建構平台,特别是雲原生的,基于YAML進行編排的CI引擎,都是類似的。
- Drone是GitOps實踐額典型工具,通過和代碼倉庫進行深度融合,做到了随時送出,随時建構,很多能力都是通過容器插件實作,這也是有别于傳統建構系統的重要特點
- 從能力上,Drone本身就是輕量級的, 是以相對比較單一,可能無法滿足複雜的業務場景。目前Drone已經被收購,成為harness**平台的重要一部分, **在該平台上也可以看到Drone的身影。
Harness CDaaS平台為應用程式傳遞提供了一種更加無縫的方法,該方法可以自動檢測GitHub,Bamboo,Jenkins,Artifactory或Nexus存儲庫或任何Git存儲庫中的新版本。一旦DevOps團隊收到警報,他們可以使用圖形工具不僅使用YAML檔案自動化建構管道的過程,還可以利用機器學習算法評估部署的品質,然後在必要時通過從工具通路資料自動復原例如AppDynamics,New Relic,Splunk,Elastic Search和Sumologic,并添加了Habib。