撰文動機
接著上一篇的參考實作-以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: backendsteps:
- 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
在這個範例中有幾個重點:
- 當一個 yml 檔內有多個 pipeline 時,要用三個 Dash(-) 把 pipeline分開。
- 再來就是這兩個 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 架構上的兼容性。
但總而言之,multiple pipeline 的寫法就是這樣,還是可以好好參考,並且自己嘗試一下 !
結語
以前曾經碰過 Jenkins,但是一跳脫新手教學的話,我連看著教學文都沒辦法把自己的 Code 給建立 CI的流程,但這次嘗試 Drone 的體驗非常好,以下列出幾個優缺
優點:
- Drone 的 UI 非常好看,符合當今產品設計風格。
- 設定頁面相較 Jenkins 來說更為簡單明瞭。
- 語法簡單且容易理解,對新手來說學習曲線低很多。
缺點
- 目前對新手而言沒看到甚麼明顯的缺點
這次把 Drone CI 的流程給簡單跑了一下,接下來想把部屬以及其他更為複雜的語法也做成筆記記錄起來,待我這幾天好好研究流程之後就會把相關的筆記放上來 !