參考實作 - Drone CI 基本流程建立

松野先生
8 min readJul 5, 2021

撰文動機

接著上一篇的參考實作-以Docker架設Drone CI服務,這篇參考官方的原文教學把 Drone CI 的基本觀念及語法做筆記,從最基礎的範例開始學習 CI 流程的建立。

這次除了最基本的 Hello World 的範例之外,也會把官方的 GoLang 的 CI 流程跑一遍,這樣應該可以讓這篇文章保持在適當的難度。

在這次的文章中我也是以新手的身分開始跟著教學實作,希望可以幫助到跟我一樣的 CI 新手學習 CI。

名詞介紹

Pipeline : Pipeline 會包含所有從測試、編譯到部屬的步驟,也就是一套完整的 CI/CD 流程,而每個 Pipeline 至少包含一個 Step。

Steps : 在其他的 CI 工具有的被稱為 Stage ,在 Pipeline 裡當然可以把所有流程放在同一個 Step 裡,但是就像是程式要分成一個個的 Function 一樣,分成更多不同功能的 Step可以幫助開發者更好的去設計 CI/CD 的流程。

實作及解說

開始寫 CI 流程之前,在 Drone CI 要做的第一件事,是決定你有哪些repo是需要建立 CI 流程的。

連結 Github 的部分我直接跳過,進到 Dashboard 如果看到一片空白,那就按一下右上方的 SYNC,你的所有 repo 就會顯示在 Dashboard 上。

點一下想要建立 CI 的 repo 前方的減號就會進到那個 repo的設定頁面。

進到 repo 的 setting 頁面之後,點畫面中央的 +ACTIVATE REPOSITORY 就可以開始為這個 repo 建立 CI 的流程。

Hello World Sample

學語言有 Hello World,學 CI/CD 當然也有 Hello World

官方的 Hello World 範例 :

kind: pipeline
type: docker
name: default

steps:
- name: greeting
image: alpine
commands:
- echo hello
- echo world

首先要簡單講解一下前三行

第一行的 kind 是指定這個物件的種類為 Pipeline (暫時用不到就先不說了)。

第二行的 type 是指定這個物件所要用到的運行環境為 Docker,根據個人/專案需求也可以選擇其他容器化工具。

第三行的 name 就是這個物件的名字了 根據自己的專案自行取名就行。

kind: pipeline
type: docker
name: default

再來要講解另外六行關於 Steps 的部分了

在這個範例中,steps 裡只有一個被取名為 greeting 的step,而因為我們用的是 docker 來運行 runner,所以要指定 image 作為 runner 運行的環境。

指定完 image 之後,就要開始在這個 step 裡做我們要做的事了,由於這個範例是為了示範最基礎的 Hello World,所以他只用了兩行 command line 指令用來印出 hello world。

steps:
- name: greeting
image: alpine
commands:
- echo hello
- echo world

建立好 .drone.yml 檔之後,把檔案全都 push 上 Github 之後,打開剛剛開啟 repo 的 Builds 頁面,就可以看到我們剛剛 push 的也被 Drone 抓去跑了,可以看到前面有一個綠勾勾代表這次的 Build 成功了,如果要看這次的詳細記錄,可以直接點擊這次的紀錄。

點進這次的紀錄之後,就可以看到關於這次 Build 的詳細過程,這就是最基本的 CI (還沒有 CD 的部分) 。

GoLang CI Basic Sample

看完 Hello World 的範例之後,可以稍微想像到該怎麼建立 GoLang 的 CI 流程了,我們一樣拿官方的範例程式來講解。

可以看出這個範例基本上都和 Hello World 差不多,所以直接抓出不一樣的地方來講解差異。

首先不一樣的有 pipeline 的 name 不同了,但這個不太重要,我們看下面的 image 被更改為了 golang,因為這邊運行環境需要預先安裝好 GoLang,如果從甚麼都沒有到安裝好 GoLang 並且測試,那要寫的超級超級長的😪

所以這個範例直接選用 GoLang 官方給的 Image 作為本次 CI 的 base image,有了 base image 之後就可以把本機那套流程搬過來了,把 GoLang 的原始碼透過 go build 編譯成可執行檔之後,再用 go test 測試程式是否能夠通過單元測試。

kind: pipeline
type: docker
name: backend
steps:
- name: build
image: golang
commands:
- go build
- go test

於是乎在看完這次的範例之後,再次 push 上 GitHub 就可以在 Drone上面看到新的 Build 結果了,這一次因為 Code 用了最基本的 Hello World,所以也毫不意外的通過測試成功 Build 了 !

我們再次點進本次的 Build log 之後就可以看到這次 build 的詳細過程了。

GoLang CI Sample on Multiple OS

另外在撰寫 yml 檔的時候也可以寫多個 pipeline 來平行處理,前面說的分成多個 step 是為了把每個不同的步驟分開,那 pipeline 就是為了分開不同的場景,假如服務需要在多種容器化服務上部屬,或是需要在多種 OS 上建立服務,就會需要在每個平台都測試一次。

那麼下面就直接上官方的範例

kind: pipeline
type: docker
name: amd64

platform:
arch: amd64

steps:
- name: build
image: golang
commands:
- go build
- go test

---
kind: pipeline
type: docker
name: arm

platform:
arch: arm64

steps:
- name: build
image: golang
commands:
- go build
- go test

在這個範例中有幾個重點:

  1. 當一個 yml 檔內有多個 pipeline 時,要用三個 Dash(-) 把 pipeline分開。
  2. 再來就是這兩個 pipeline 分別要在 arch 以及 arm 的架構下測試,所以這邊就用 platform -> arch 的方式去指定系統的架構,這樣就可以在不同的架構下同時跑兩個CI流程。
kind: pipeline
type: docker
name: amd64

platform:
arch: amd64

steps:
...
---
kind: pipeline
type: docker
name: arm

platform:
arch: arm64

steps:
...

看完了範例以及瞭解這個範例的作用之後一樣把他 push 上 GitHub,接著再次開啟 Drone 的 Build 頁面,就會發現這次的 build 跑不完…欸🤔

下圖是已經被我 Kill 掉的 Build 紀錄,之所以要 Kill 掉是因為 arm 的pipeline根本沒辦法跑,因為按照前一篇安裝教學一步步安裝到現在,只會有 amd64 架構的 linux runner,所以自然就沒辦法測試在 arm 架構上的兼容性。

arm 架構的 pipeline 根本沒有運行

但總而言之,multiple pipeline 的寫法就是這樣,還是可以好好參考,並且自己嘗試一下 !

結語

以前曾經碰過 Jenkins,但是一跳脫新手教學的話,我連看著教學文都沒辦法把自己的 Code 給建立 CI的流程,但這次嘗試 Drone 的體驗非常好,以下列出幾個優缺

優點:

  1. Drone 的 UI 非常好看,符合當今產品設計風格。
  2. 設定頁面相較 Jenkins 來說更為簡單明瞭。
  3. 語法簡單且容易理解,對新手來說學習曲線低很多。

缺點

  1. 目前對新手而言沒看到甚麼明顯的缺點

這次把 Drone CI 的流程給簡單跑了一下,接下來想把部屬以及其他更為複雜的語法也做成筆記記錄起來,待我這幾天好好研究流程之後就會把相關的筆記放上來 !

--

--