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

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

源碼地址: https://gitee.com/devops-samples/drone-examples

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章