從零開始學 DevOps — 那就選擇最簡單的 Drone CI 開始吧!

目前 DevOps 已經是 Backend 或 Frontend 多多少少都會碰到的部份。而 Drone,正可以讓開發者專心開發自己的專案,每個專案獨立設定需要的 CI / CD 流程,解放前端、後端工程師的戰鬥力,將測試與部屬結合在開發流程中,降低手動測試需要的時間。話不多說,趕快開始架設第一個 Drone CI 伺服器吧。

本篇文章分為兩個部分,第一個部分來聊聊,為什麼從 Jenkins -> CircleCI -> Drone ,的過程。第二部分則是架設 Drone 的教學。

為什麼從 Jenkins -> CircleCI -> Drone

第一次接觸 Drone 已經是兩年前,當時的 Drone 是 0.x 版,跟現在的 1.0 版本有不少的差異。那時候玩了一陣子 DroneCI,Docker 化了一些服務,但因為那時對 CI / CD 不甚熟悉,從 Jenkins、DroneCI 與 CircleCI 中選擇。

簡單比較 Jenkins、DroneCI、CircleCI 三套工具

Jenkins 複雜度高,可以操作的東西最多。DroneCI 每個步驟都是由 Docker 產生的環境,高度的容器化,讓每個步驟可以調用不同的 Docker Image 來實現各種測試。

例如:步驟一可以用 nodejs 的 Docker image 測前端的部分,步驟二可以用 golang 的 Docker image 測試後端的框架,然後接著用傳送訊息專用的 Image 傳送 CI / CD 測試結果到 Slack。

重新採用 DroneCI 的原因

這次重新採用 DroneCI 的原因是我們需要大量的 build image,用 CircleCI 來做實在很不划算,因為你用他的雲端空間就是要被吃豆腐。再者,這次已經對 Docker 有很多的熟悉度,也對 CI / CD 流程有更高的理解。

有一點需要特別說明的是,因為我是 Backend 工程師,所以比較喜歡更開發更貼近的工程師的 DroneCI,每個專案底下都有 .drone.yml,負責不同專案的開發者可以輕鬆設計自己需要的 CI/CD 流程。

而 Jenkins 還是 DevOps / SRE 的王者,功能性的強大,幾乎無所不能,不過因為我有圖型介面障礙,每次都會忘記在哪邊按,而且想要把任何東西都進版控,所以我當然是選 DroneCI 囉!

用 DroneCI 就是要自己架

DroneCI 經過 1.0 的改版後已經提供了雲端服務 drone cloud。不過 … 既然都用 Drone 了當然是要自己架!第一種架設方式是開一台機器例如: EC2,在上面安裝好 Docker、Docker Compsoe、然後下載 Drone 的壓縮檔,接著解壓縮, cd 進入資料夾後輸入 docker-compose up,這樣就架設完成囉。

自己架設的好處是,自己開的機器便宜,不想用的時候還可關掉。如果你可以清晰知道需要的 CI / CD 流程的哪些環節,並且可以快速的實作出來,用 Drone 是完全沒有問題的。

用 K8S 架設更好玩

踏進 K8S 是個不小的門檻,不過 K8S 絕對是個值得投資的技術,各大雲端霸主不管是 AWS、GCP、Azure 紛紛支援 K8S,雖然乍看之下沒有顯著的好處,但是光是把所有架構的轉成程式碼 ( Infrastructure as Code ,Iac) 就是讓企業體質變好,無形中增加了許多未來的彈性與爆發力。

既然 K8S 是主流,那當然要用 K8S 來架設 Drone 囉。除了開一台機器以外,Drone 對 K8S 的整合度也是很高的,Helm 有著 Helm Hub ,就像 Docker hub 一樣,你可以在上面找到各式各樣的 Helm Chart 來建置 Drone。建置完成後還可以進入 K8S 中查看 Drone 的各個工作執行的怎麼樣。

該怎麼開始使用 Drone ?

還是回到最簡單的方法,在本機或是雲端機器上安裝 docker 與 docker-compose,我們用 Github 來做為說明的範例。

Step 1 — 安裝 DroneCI

進入官網,點選 Get Started

點選 install

選擇 Github

進入之後開始學習安裝方式,第一個步驟可以跳過,從第二個步驟開始,輸入 docker pull drone/drone:1 拉下來最新的 docker image。

接著,根據官方的 docker 指令來撰寫 docker-compose 檔案,我已經幫大家寫好了,複製貼上即可,儲存成 docker-compose.yml。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '2'

services:
drone-server:
image: drone/drone:1
container_name: drone-server
ports:
- 80:80
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
- DRONE_SERVER_HOST="{YOUR_MACHINE_HOST}"
- DRONE_SERVER_PROTO=http
- DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
- DRONE_GITHUB_CLIENT_ID="{CLIENT_ID}"
- DRONE_GITHUB_CLIENT_SECRET="{CLIENT_SECRET}"

drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_PROTO=http
- DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
- DRONE_RUNNER_CAPACITY=2

接著輸入 docker-compose up 啟動 drone,此時可用 docker ps -a 看看 container 有沒有正常啟動

Step 2 — 用 ngrok 讓 Port 開放 IP 讓外界存取,並加上 https

ngrok 官網註冊帳號,不註冊的話過一段時間就會被斷線

註冊完之後會顯示以下畫面,mac 可以使用 brew install ngrok 安裝 ngrok。安裝完後使用下圖箭頭指示處的,複製貼上,在本機登入你的帳號。

之後就可以開心的使用 ngrok 綁定端口囉!

例如在終端機中輸入 ngrok http 8081,就會把剛剛架設的 drone 伺服器 localhost 的 8081 端口綁定到特定的 ngrok 網址。這邊的網址等下需要複製貼上綁定到 Github OAuth App 上。

Step 3 — Github 設定 OAuth App

選擇螢幕右上方選單的 Settings

進入後選擇左下方的 Developer Settings

點選 OAuth Apps

新增 Oauth 應用程式

將剛剛建立好的 ngrok 網址填入,註冊 OAuth 應用程式。這邊雷的地方,Drone 0.8 的 callback 網址是 authorize,1.0 換成 login,文件上沒有特別著名。

當以上都設定好的時候代表你的 Drone CI 串接完成囉!訪問你的 ngrok 暫時網址,我的是 https://844f00ae.ngrok.io 。還記得 ngrok 是做什麼用的嘛,ngrok 可以讓本地端的端口暴露到網際網路。所以可以在任何地方存取的到。

登入後 drone 已經建立成功囉,紅框的網址可以替代成任何你伺服器上的網址。

我們來開啟監控一個 drone 的 project,如果這專案有改變就會觸發 CI / CD 流程。大家想要一起玩可以到這邊 fork 專案 https://github.com/go-training/drone-nodejs-example

開啟後會顯示專案目前是開啟的狀態。只要有 commit push 即可觸發。

來試試看,加一個 commit 並 push,觸發 Drone CI

果然成功了!

完成之後

Great!我們做出了第一個 CI / CD 系統,好處有什麼呢?今天篇幅有點長,我們留著下次再講吧 :D 下一篇 Drone CI / CD 我們來聊聊 CI / CD 的常見流程!

如果喜歡我寫的文章,歡迎追蹤本人 @LukaJoJoStarBugs Weekly 星巴哥技術週刊🙂

歡迎訂閱,獲取最新資訊、教學文章,一起變強。

評論