天天看點

使用Drone搭建CICD服務

概要

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系統

需求

  1. 開源軟體。可用于商業相關服務的自動化部署
  2. 盡量少一些運維部署操作。我們團隊都是開發人員,沒有專門的運維,開發人員主要工作是編碼而不是其它
  3. 較好的支援k8s微服務。目前使用了比較多服務使用了k8s
  4. 盡量簡單,适合小團隊使用。服務部署完成後,項目組其他成員可以快速掌握使用
  5. 可以與我們搭建的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
如下圖所示:           
使用Drone搭建CICD服務

建立成功頁面如下圖所示:

注意需要記住下面兩個值:
Application ID和Secret的值, 後面會用到           
使用Drone搭建CICD服務

建立共享密鑰

共享密鑰用于在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就算是部署完成...

參考

輕量快速的 CI 工具 Drone 官網