11.23 Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

一、介紹

Drone是一個用GO語言編寫的基於Docker的持續集成、持續交付平臺,所有的編譯、測試的流程都在Docker容器中執行。Drone使用簡單的YAML配置文件來定義和執行Docker容器中的Pipelines,開發人員只需要在項目中包含.drone.yml文件,將代碼推送到Git版本控制倉庫中,Drone就能夠自動化的進行編譯、測試和發佈。

Drone可以無縫集成多個源碼管理的平臺,包括Github、GitLab、Bitbucket、Gitea、Gogs等,如果企業是基於上面幾個搭建的源碼管理平臺,可以和Drone無縫集成。Drone原生就是跨平臺的,支持多種操作系統和架構,包括Linux x64、ARM、ARM64和Windows x64。Drone是在Docker容器裡執行流水線,所以Drone支持任意編程語言、數據庫和服務。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

二、特性

1、配置文件即代碼

Drone中定義Pipeline(流水線)都是通過命名為.drone.yml的配置文件來定義的。這個配置文件是以簡單、易讀的YAML格式編寫,如下圖所示。這個.drone.yml文件需要和代碼一起提交到Git版本控制倉庫中,納入版本管理方便變更記錄的跟蹤和回溯。每條流水線的執行都是在一個獨立的Docker容器中執行,在執行時自動下載需要的組件。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

2、插件體系

Drone是通過插件體系兼容多方平臺和提供強大的功能。Drone在執行時,使用容器將預先配置好的步驟加入到Pipeline中,然後從現有的插件體系中選擇需要的插件,或者可以創建自己的插件。這裡需要提到的是已經和釘釘、微信等通信工具集成。

在Drone裡使用插件不會像Jenkins裡那樣,Jenkins是在自己的平臺裡管理自己的插件,插件和流水線構建是集成在一起的,每次進去都會看到升級的提示。但在Drone裡,插件管理和流水線是分開的,在Pipeline裡聲明一下,只要有網絡連接能訪問到就可以,究竟插件是如何管理,如何升級的都可以不用管。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

3、獨立的構建環境

因為每次構建都運行在獨立的Docker容器裡,不用擔心由於構建環境共用導致的問題。同時,也解決了企業內部多種開發語言,構建工具版本的不同的問題,準備一個鏡像就可以解決。基於Docker的構建環境的創建同樣也能夠加入到Git版本控制倉庫,也能對構建環境的版本進行管理和追溯。

4、構建環境的自動擴縮容

首先,基於Docker容器的構建環境本身就具有自動擴縮容的能力。每次都是通過構建一下新的容器環境來執行流水線任務,只要資源足夠,可以支持無限制的構建任務。

Drone提供了一個Autoscaler的組件,是一個獨立運行的後臺進程,需要安裝在宿主機上,而且不同的雲平臺安裝方式也不一樣。這個組件能夠根據構建任務的數量自動創建和終止服務器的實例,從而實現構建環境的自動擴縮容的目標。

三、安裝

Drone的安裝包含Server端和一個或多個Runners。一個runner是一個安裝在遠端服務器上的獨立的後臺進程,它通過輪詢服務器上的負載決定是否執行,將runner安裝在許多個服務器上來創建分佈式的網絡。

1、Server端

上面提到,Drone可以無縫集成多種源碼管理平臺,在進行Server端安裝時,需要與源碼管理平臺進行集成,這裡以GitHub為例進行說明:

第一步:準備工作

創建一個OAuth應用程序,在Github設置裡創建一個OAuth應用程序,Key和Secret用於授權訪問Github上的資源。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

創建一個共享的Secret,這個Secret用於Server和Runner之間的通信,可以使用openssl生成一個共享的Secret。

$ openssl rand -hex 16 bea26a2221fd8090ea38720fc445eca6

第二步,下載Drone鏡像

Drone是以一個輕量級的Docker鏡像分發的,這個鏡像是自包含的,不需要任何其他的外部依賴。

$ docker pull drone/drone:1

第三步,配置Server

Drone Server採用環境變量的方式進行配置。這裡需要設置的變量有:

DRONE_GITHUB_CLIENT_ID:github oauth Client ID

DRONE_GITHUB_CLIENT_SECRET:github oauth Client Secret

DRONE_GIT_ALWAYS_AUTH:clone時是否每次都需要授權,只在Github Enterprise私有模式下生效

DRONE_RPC_SECRET:通過RPC連接到server的授權Secret

DRONE_SERVER_HOST:提供外部主機名或IP地址

DRONE_SERVER_PROTO:http或https協議,當使用ssl或acme配置時默認是https。

第四步,啟動服務器

通過如下的命令啟動服務端容器,配置需要的參數通過環境變量,這是使用docker run方式啟動。

docker run \\
--volume=/var/lib/drone:/data \\
--env=DRONE_AGENTS_ENABLED=true \\
--env=DRONE_GITHUB_SERVER=https://github.com \\
--env=DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} \\
--env=DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} \\
--env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \\
--env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST} \\
--env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} \\
--publish=80:80 \\
--publish=443:443 \\
--restart=always \\
--detach=true \\
--name=drone \\
drone/drone:1

基於Github的Server就啟動了,其他的源碼控制管理平臺的安裝也是一樣。

2、Runner安裝

一旦Server端安裝完畢後,就需要安裝Runner來執行Pipelines。Drone支持多種形式的Runner,下面單獨介紹:

Docker Runner:當在Docker容器裡執行構建流水線時安裝此Runner。

Kubernetes Runner:當Drone運行在Kubernetes上時,該Runner在Pods裡執行構建流水線。

Exec Runner:當直接在宿主機上執行構建流水線時安裝此Runner,通常都是採用shell腳本。

SSH Runner:當需要在遠程服務器上執行構建流水線時,通過SSH協議直接調用執行。

Digital Ocean Runner:這個Runner使用SSH協議在一臺專用的Droplet上執行,這個Droplet在每個流水線執行時創建,完成後銷燬。

四、配置

一個項目以配置即代碼的方式存儲配置文件,在項目的根目錄下添加一個.drone.yml文件,這個文件和代碼庫一起加入版本控制,並遵循相同的分支結構。每次推送代碼、創建或更新一個Pull Request、或者推送一個Tag時,系統將獲取這個yaml配置文件並執行這個Pipeline。主要配置以下幾個資源:

1、Pipeline

一個Pipeline為這個項目定義了一個持續集成和持續交付的過程,可以認為是一個工作流,定義瞭如何構建、測試和部署等步驟。pipeline配置樣例:

---
kind: pipeline
type: docker
name: default

steps:
- name: build

image: golang
commands:
- go build
- go test

....

Drone支持不同類型的執行環境,每種類型的環境都有自定義的yaml規範。kind和type屬性定義了pipeline的類型和目標執行環境。根據上面Runner類型的不同,這裡的yaml文件的配置也是不一樣的,通過type這個字段進行區分,每種類型的Runner支持的Yaml文件的規範也是不一樣的,特殊類型要特殊對待。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

2、Secrets

Secret用戶存儲和管理敏感信息,有下面幾種級別的設置。

代碼庫級別:

代碼庫的Secrets用於存儲和管理敏感信息,如密碼、令牌和ssh密鑰。將此信息存儲在Secrets中比純文本的配置文件更加安全。

組織級別:

組織級別的Secrets可以用於這個組織下的任意代碼庫。

加密Secrets:

加密Secrets用於存儲敏感信息,如密碼、令牌和ssh密鑰,將此信息作為加密的字符串存儲在配置文件中。可以使用命令行工具加密Secrets,每個代碼庫都單獨加密,這個Key從不離開服務器環境。

External

外部的Secrets用於從外部的Secrets存儲裡獲取敏感信息,如密碼、令牌和ssh密鑰。

3、Signature簽名

可以選擇對配置文件進行簽名,以驗證其真實性並防止篡改。這個簽名在代碼庫是公共的,並且需要防止對配置進行未經授權的更改時會很有用。如果用戶修改配置並且簽名驗證失敗,流水線將被阻止,需等待對代碼庫具有寫權限或管理權限的用戶手動批准。

4、Cron定時調度

可以使用Cron jobs來執行基於時間的調度,可以在代碼庫的Settings界面上創建和管理cron job或使用命令行工具。

表達式

cron表達式代表了任務執行的時間集合,包含6個字段,各字段說明如下:

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

Drone內部已經定義了一些調度的cron表達式,如@yearly、@monthly、@weekly、@daily、@hourly。

五、試用

在Drone Cloud平臺上,可以與Github集成,構建Github上的代碼倉庫,這裡我選擇了一個SpringBootTest的代碼庫,使用Github的頁面編輯新增.drone.yml文件,如下:

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

提交之後就會觸發Drone流水線構建

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

點擊進入到流水線詳情頁面。第一步是clone代碼庫階段,clone不需要在yml文件內聲明。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

第二步是test階段,這一步是.drone.yml文件中聲明的,通過日誌可以看出,該步驟是先拉取了gradle:jdk8的鏡像,然後在該容器內部執行的流水線步驟。

Jenkins是否還要繼續用?介紹一款基於容器的CICD平臺Drone

六、總結

如今,越來越多的企業開始重視軟件研發的效率和質量,也有越來越多的企業開始採用DevOps理念來提升效率和質量。在整個軟件研發全生命週期中,CICD是非常重要並且提升效率最為明顯的階段。通過實現自動化,能夠大幅縮短從開發到測試到部署的時間。

隨著Docker、Kubernetes等容器技術的成熟,特別是一線互聯網公司已經將自己的業務部署在雲端。在不遠的未來,雲計算必將成為軟件系統運行的基礎設施環境,就像如今的水和電一樣想用就用。雲計算的普遍使用,也催生了雲原生技術的發展,同時也催生了雲原生下的CICD平臺的崛起,Drone就是其中一員。

Jenkins在一段時期內是CICD的代名詞,界面化的操作和配置根本無法談增效,Jenkins 2.0後,通過配置即代碼的最佳實踐,將流水線的構建過程配置到jenkinsfile裡,提交到代碼倉庫下也納入到了版本控制下,但真正用起來的並不多見。Jenkins X是下一代基於雲原生的CICD框架,以Docker和Kubernetes容器生態為基礎組件,通過命令行的方式實現CICD的所有功能。

JenkinsX和Drone都屬於雲原生下的CICD框架,都能充分利用容器的天然優勢,提高CICD的靈活性和效率,JenkinsX目前仍在開發中,Drone目前來看已經在多個案例使用。如果打算構建容器環境的CICD平臺,Drone可以是個不錯的選擇。


分享到:


相關文章: