概要
Drone是Go語言編寫的,基于容器技術的CI/CD系統。它具有以下幾個關鍵特性:
Everything is a Docker Container
對Docker原生支援使的: drone無需在建構腳本中額外增加 docker 相關的指令就能:
1. 使用Docker化的內建環境友善的實作對多語言編譯
2. 利用內建Docker環境的優勢: 環境隔離、标準化鏡像
利益于: 對原生 Docker 支援
Any Source Code Manager
Any Platform
Any Language
One Server, Multiple Agents
Server與git平台互動, 提供web服務
Agents具體負責相關的編譯、部署等操作
當使用使用者多、load高時可以擴充Agents來實作水準擴容
在 1.0 版本之後,隻需要一個 drone 服務
裡面面就内建了 server 及 agent,這很适合用非常小團隊快速安裝 drone
Configuration as a code
使用.drone.yml檔案來設定測試及部署流程
Pipelines被配置成你送出到git倉庫的簡單、易讀的檔案
Pipeline的每一步驟都自動運作在獨立的Docker容器中
豐富的插件:
建構後發送消息: DingTalk, Wechat, Gtalk, Email
建構成功後釋出: npm, docker, github release, google container...
建構成功後部署: Kubernetes, rsync, scp, ftp...
調研其他CI/CD系統
需求
- 開源軟體。可用于商業相關服務的自動化部署
- 盡量少一些運維部署操作。我們團隊都是開發人員,沒有專門的運維,開發人員主要工作是編碼而不是其它
- 較好的支援k8s微服務。目前使用了比較多服務使用了k8s
- 盡量簡單,适合小團隊使用。服務部署完成後,項目組其他成員可以快速掌握使用
- 可以與我們搭建的gitlab私有倉庫配合使用
常用的CI/CD系統
CI/CD已經形成了一套标準流程,有多個開源不開源的工具可以實作。常用的CI/CD工具有:
CI系統 | 是否開源 | 授權協定 | 開發語言 |
---|---|---|---|
Jenkins | MIT | Java | |
gitlab-ci | Golang | ||
prow | Apache-2.0 | ||
Strider | JavaScript | ||
Travis | 商業軟體 | Ruby | |
teamcity | Java .NET | ||
Codeship | 未知 |
這其中:
1. Travis、Codeship、teamcity使用商用協定
2. Strider不适用k8s環境的自動化部署
3. prow是專用于k8s項目,是Kubernetes測試架構test-infra的一部分,而且目前好像隻适用于github平台
隻剩下Jenkins和gitlab-ci适合我們目前開發團隊的使用
優點:
功能完善、插件豐富: 有1000多個插件可供選擇
權限控制粒度高: 可以精确控制每個使用者的權限
穩定性高、文檔豐富、使用人數多: 出現問題好解決
缺點:
複雜: 1000多個插件, 不下大功夫, 如何知道應該用哪個插件
權限控制複雜: 精确控制每個使用者的權限, 但需要花大量時間配置
需要對配置檔案單獨進行版本控制(實作還比較麻煩)
執行步驟在沒有大的中, 自帶版本控制
與gitlab高度整合
配置複雜
與gitlab耦合緊密
開發語言ruby
drone安裝
說明
drone支援各git倉庫平台, 如github, gitlab, gogs, gitea等。使用不同的倉庫平台,安裝方式稍有不同。本文以gitlab為例進行說明,其他倉庫平台請看
文檔在Gitlab上建立OAuth應用
打開Application頁面:
右上角頭像 -> 設定(setting) -> 應用(Application)
輸入框輸入下面2個參數:
1. Application名: 這個可以随便輸入為可識别的名字
2. Redirect URI: 回調位址, 注意這個位址與後面啟動服務的位址+/login
如下圖所示:

建立成功頁面如下圖所示:
注意需要記住下面兩個值:
Application ID和Secret的值, 後面會用到
建立共享密鑰
共享密鑰用于在Drone Server與各Drone Runner間通信認證時使用, 本篇使用内建的Server, 此值暫時用處不大, 不明白的可以先記住有這麼一個事。
可用如下指令生成:
$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6
服務啟動
服務啟動指令如下:
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GIT_ALWAYS_AUTH=false \
--env=DRONE_GITLAB_SERVER=http://gitlab.com \
--env=DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID} \
--env=DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET} \
--env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \
--env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST} \
--env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} \
--env=DRONE_TLS_AUTOCERT=false \
--env=DRONE_USER_CREATE=username:zhaoweiguo,admin:true \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
環境變量參數說明
DRONE_GITLAB_SERVER:
gitlab服務位址
DRONE_GIT_ALWAYS_AUTH:
可選bool型
用于在clone公共項目時認證
此項隻有在自托管的Gitlab且啟用私有模式時才啟用
DRONE_GITLAB_CLIENT_ID:
前面生成Application時得到的Application ID
DRONE_GITLAB_CLIENT_SECRET:
前面生成Application時得到的Secret
DRONE_RPC_SECRET:
Drone Server與各Drone Runner間通信所需要的認證密鑰, 即前面使用openssl指令得到的那串32字串
DRONE_SERVER_HOST:
Drone Server服務的啟動位址
DRONE_SERVER_PROTO
Drone Server服務的協定
DRONE_TLS_AUTOCERT:
Drone服務預設
DRONE_USER_CREATE:
設定 Drone 的管理者,格式為:username:<username>,admin:true
本執行個體中:
<username> 的值 zhaoweiguo 就是我在gitlab上的使用者名
admin: 指定此使用者名的使用者為管理者使用者
docker run啟動成功後, 一個單節點的Drone就算是部署完成...