參考實作-以Docker架設Drone CI服務

松野先生
8 min readJul 4, 2021

--

撰文動機

在安裝完 Docker 還有 Nginx之後,想說是時候該來學 CI/CD 了🤔,雖然我想當的是後端工程師,但畢竟沒人來幫我做 CI/CD,又不想每次部屬程式都要自己手動,就來自己學學怎麼架 CI/CD服務吧 !

本文參考 Drone CI 官網教學,至於為什麼用 Drone CI 嘛,我喜歡 Golang 是一個原因,再來就是我真的看不懂Jenkins(;´д`)ゞ

安裝步驟

這次的安裝步驟為 :

  1. 設定 GitHub (也可以用其他的版控服務)
  2. 準備 Drone CI 需要的資訊 (Client ID, Client Secret 等…)
  3. 建立 Drone CI Server Container 和 Drone CI Runner Container

設定 GitHub

Drone CI 的流程是在使用者 Push 到 repository 時,告訴 Drone Server 幫我們進行各個已經設定好的任務,所以理所當然的安裝教學也是從設定版控服務的部分開始。

  1. 先點右上自己的頭像,再點 setting 到設定頁面
  2. 在左側欄下方點 Develop settings

3. 點左側欄的 OAuth Apps

4. 點畫面中間的 Register a new application 綠色按鈕

5. 按照下圖把 Application name 改成 Drone 或其他好記的名字方便管理

Homepage URL 改成你打算要給用 Drone CI 的網址

Authorization callback URL 改成 Drone CI 的網址加 /login

按下 Register application 的綠色按鈕

這時再回到 Developer settings / OAuth Apps 的地方就可以看到剛剛註冊的資訊了,這樣 Drone 在我們 Push 的時候就能收到通知,跑 CI/CD 的流程了

準備 Drone CI 需要的資訊

總共會需要用到五個變數,用來建立 Drone CI Server 的 Container

DRONE_GITHUB_CLIENT_ID : 剛剛建立的 OAuth app 的 Client ID

DRONE_GITHUB_CLIENT_SECRET : 剛剛建立的 OAuth app 的 Client Secret

DRONE_SERVER_HOST : 預計給 Drone CI 使用的 Domain name 或 IP Address

DRONE_SERVER_PROTO : 伺服器通訊協議,看伺服器有沒有使用 http 或 https,輸入相對應的值(http or https)。

DRONE_RPC_SECRET : Drone Server 和 Runner 之間用來驗證的共享密碼

DRONE_GITHUB_CLIENT_ID :

  1. 到 Settings / Developer Settings / OAuth Apps (如下圖) 找到剛剛建立給 Drone 使用的 OAuth App

2. 找到 Client ID 的地方,把 Client ID 複製起來。

DRONE_GITHUB_CLIENT_SECRET:

跟 Client ID 在同一個頁面,拉到下方就可以產生一個新的 Client Secret

  1. 點 Generate a new client secret 的按鈕
  2. 把新產生出來的 Client Secret 複製並保存起來。

DRONE_SERVER_HOST :

DRONE_SERVER_HOST 就是剛剛註冊時輸入的 Homepage URL ,如果忘記了可以拉到下面在 Homepage URL 的欄位找到。

DRONE_RPC_SECRET :

這個和前三個不一樣,要自己產生一個密鑰用來給 Server 和 Runner 之間驗證用,輸入指令之後把產生出來的密鑰複製起來。

!! 在 Windows 環境下無法使用這個指令

$ openssl rand -hex 16
3ef16ea733dab3ea41c1ad3a786094ff

建立 Drone CI Server Container

官方使用的 Docker run 的指令來建立 container,但這邊我要改用 Docker Compose 的方式來建立,在管理以及使用上都可以保持簡潔且方便管理。

  1. 建立docker-compose.yml檔

用雙尖括號包起來的都請以自己的環境變數替代

version: "3.8"
services:
drone-server:
container_name: drone-server
image: drone/drone
restart: always
volumes:
- <YOUR-PATH-TO-STORE-DRONE-DATA>:/data
environment:
DRONE_GITHUB_CLIENT_ID: <YOUR_GITHUB_CLIENT_ID>
DRONE_GITHUB_CLIENT_SECRET: <YOUR_DRONE_GITHUB_CLIENT_SECRET>
DRONE_RPC_SECRET: <YOUR_DRONE_RPC_SECRET>
DRONE_SERVER_HOST: <YOUR-DOMAIN-NAME>
DRONE_SERVER_PROTO: https
# use port 4000 and 4001 mapping http(80) and https(443) port ports:
- 4000:80
- 4001:443
drone-agent:
image: drone/drone-runner-docker
container_name: drone-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
DRONE_RPC_HOST: <YOUR_GITHUB_CLIENT_ID>
DRONE_RPC_SECRET: <YOUR_DRONE_GITHUB_CLIENT_SECRET>
DRONE_RPC_PROTO: https
DRONE_RUNNER_CAPACITY: 2
ports:
- 3000:3000

2.建立 Container 並確認是否建立成功

在docker-compose.yml在的資料夾輸入下方指令建立 drone server 和docker runner 的 container。

docker-compose up

建立完成後,用下方指令確認是否有安裝成功,出現和圖片一樣的訊息就代表安裝成功了。
(如果幫 runner 設定的別名不同,記得換一下 container 的名字)

docker logs docker-runner
建立成功的訊息

3.最後確認是否成功架設服務

在瀏覽器輸入當初設定的網址 or IP,出現這樣的畫面就是架設成功了!
第一次登入會需要連上 Github 或是其他版控服務,連接完之後就可以開始使用 Drone CI 了~

結語

從教學過程可以感覺得出來,架設 Drone CI 的服務其實不難,但接下來建立測試部屬的流程會不會很難呢..🤔

就等下一篇的基本流程教學吧 ! 😃

實作參考來源

--

--