基於Drone+Gogs流水線-全面認識輕量級雲原生CI引擎Drone

DevOps在路上發表於2022-03-20

1. 介紹

image.png
Drone by Harness™ 是一個基於Docker容器技術的可擴充套件的持續整合引擎,用於自動化測試、構建、釋出。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境並保證隔離。開發者只需在專案中包含 .drone.yml檔案,將程式碼推送到 git 倉庫,Drone就能夠自動化的進行編譯、測試、釋出。可以與Docker完美整合。
https://docs.drone.io/image.png

特點

  • 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中的步驟。外掛可用於部署程式碼、釋出工件、傳送通知等。

image.png
image.png

2. 部署Gogs-極易搭建的自助 Git 服務

image.png

安裝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
image.png

image.png

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配置是否正常

image.png
image.png

啟用之後,自動就會在gogs倉庫的Web設定中建立鉤子
當不存在.drone.yml檔案或者倉庫沒有在drone啟用,測試返回的報文可能是dial tcp連線失敗。
image.png

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:一般設定為主機名

image.png

6. 配置.drone.yml執行Pipeline

要使用 Drone 只需在專案根建立一個 .drone.yml 檔案即可,這個是 Drone 構建指令碼的配置檔案,它隨專案一塊進行版本管理,開發者不需要額外再去維護一個配置指令碼。其實現代 CI 程式都是這麼做了, 包括 gitlab-ci, jenkinsfile, tekton等。
image.png
image.png

7 . Drone的場景使用

1) 啟動新build

支援選擇git 分支, 以及設定啟動引數, 這個功能在大部分構建平臺都有體現
image.png

2) 同步-SYNC

點選 SYNC 按鈕,就會和程式碼倉庫進行同步,如果有倉庫刪除或者增加,就會同步進行更新
image.png

3) 定時觸發器-Cron jobs

image.png
幾乎所有的構建平臺都會提供類似的觸發器,比如 git web hook, 時間定時器等
image.png

4) 加密引數 - Secrets

流水線執行過程中會涉及很多和服務互動,所以需要提供各種憑證,比如密碼,token 等,所以Secrets也是流水線中的一個重要元素。
image.png
image.png

5) 版本部署/回滾 -Promote/Rollback

僅僅完成製品的構建是遠遠不夠的,Drone也考慮到了部署和回滾的問題,所以提供了promote/rollbakc事件, 針對 某個成功版本進行部署或者回滾,和條件判斷when一起使用。
image.png

image.png

6)步驟間順序依賴- 有向無環圖

Drone 通過 **kind:pipeline **對步驟進行組織,支援並行流水線,同時通過 **depends_on **對流水線的先後順序進行限制, 如圖所示。
image.png
image.png

7 )上下游流水線間呼叫

image.png

參考

總結

  1. Drone與程式碼管理平臺(e.g. gitlab, gogs)是強繫結關係,如果程式碼管理平臺不能訪問,Drone就無法登入,這個在Drone-Server的啟動命令就可以看出來。
  2. Drone 學習成本低,語法簡潔,如果你接觸過其他構建平臺,特別是雲原生的,基於YAML進行編排的CI引擎,都是類似的。
  3. Drone是GitOps實踐額典型工具,通過和程式碼倉庫進行深度融合,做到了隨時提交,隨時構建,很多能力都是通過容器外掛實現,這也是有別於傳統構建系統的重要特點
  4. 從能力上,Drone本身就是輕量級的, 所以相對比較單一,可能無法滿足複雜的業務場景。目前Drone已經被收購,成為harness**平臺的重要一部分, **在該平臺上也可以看到Drone的身影。



Harness CDaaS平臺為應用程式交付提供了一種更加無縫的方法,該方法可以自動檢測GitHub,Bamboo,Jenkins,Artifactory或Nexus儲存庫或任何Git儲存庫中的新版本。一旦DevOps團隊收到警報,他們可以使用圖形工具不僅使用YAML檔案自動化構建管道的過程,還可以利用機器學習演算法評估部署的質量,然後在必要時通過從工具訪問資料自動回滾例如AppDynamics,New Relic,Splunk,Elastic Search和Sumologic,並新增了Habib。
image.png
image.png

image.png

相關文章