自動化部署是我們在做 DevOps 不可或缺的流程,而 Drone 是一個輕量的部署工具,本篇文章能夠讓你了解 Drone CI 如何部署,讓你很快就能把後端服務架起來!
如果你已經知道如何部署 Drone,文末提供 GIthub 連結,讓你馬上快速部署!
為什麼要自動化部署?
想像一下,你正在開發一個專案,每次要部署時都需要:
- 手動建置程式
- 執行測試
- 上傳到伺服器
- 重新啟動服務
是不是覺得要考慮的太多、太麻煩?那麼 Drone CI 就是用來解決這個問題的完美工具!
為什麼選擇 Drone CI?
- 輕量級:相比 Jenkins,安裝和配置更簡單
- 支援 Docker:每個建置步驟都在隔離的容器中執行
- 支援各種部署場景,包含 Docker、Kubernetes、SSH
- 設定檔基於 YAML:易讀易懂,方便維護
自動化流程
大致上的流程就是我們將程式碼推到 Github,然後觸發 Webhook 啟動 Drone 去跑我們自定義的指令,可以是運行單元測試,或是程式碼檢查。

Docker
Docker 是一個開源的容器化平台,用於自動化應用程式的部署、運行和管理,使用前需要先下載桌面版。
如果還不太懂 Docker 概念的可以先看 這支影片,解釋的蠻清楚的。
GitHub Webhook
Webhook 是 GitHub 提供的一種自動化機制,可以用來在每次系統事件發生時向指定的 Endpoint(端點)發送一個 http 請求。例如下列事件:
- Push
- Pull Request
當程式碼有更新時自動通知 Drone,並觸發自動化流程,實現排檢查版、安全檢測到最後部署的自動化流程。
由於 GitHub 需要一個公開的 URL 來發送 Webhook 通知,所以我們需要使用像 Ngrok 的工具,將本機的服務暴露到公網上。
Ngrok
我們可以使用 Ngrok 在本機開發和測試 CI/CD 流程,等到需要部署時再使用生產環境的 IP 即可。
如果還沒有安裝過的夥伴可以參考【部署利器】3 分鐘搞定!新手必學 Ngrok 快速入門指南。
啟動 Ngrok
ngrok http http://localhost:8080建立 Github OAuth Application
1. 登入 Github 帳號,Profile > Settings > Develop settings > OAuth Apps > New OAuth App
2. 輸入 Ngrok 的 URL,注意 “Authorization callback” 需加上 /login

3. 點擊 “Register application”,你會得到 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET,記錄下來下一步會用到。

建立 Github Repository
1. 建立一個 Github repository,名稱我取作 drone-ci-demo,並新增一個 .env 檔案,設定參數如下:
GITHUB_CLIENT_ID= # Github client ID
GITHUB_CLIENT_SECRET= # Github client secret
DRONE_DATA=./drone # Volume mapping path
DRONE_SERVER_HOST=89ae-211-22-119-160.ngrok-free.app # Ngrok Domain name
ADMIN= # your github username
DRONE_RPC_SECRET= # Random secret key- 注意
DRONE_SERVER_HOST不需要https
DRONE_RPC_SECRET 可以請 GPT 產生給你。
2. 再新增 docker-compose.yml,貼上下面的程式碼:
version: '2'
services:
drone-server:
image: drone/drone:2
ports:
- "8080:80"
volumes:
- ${DRONE_DATA}:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
- DRONE_SERVER_PROTO=https
- DRONE_USER_CREATE=username:${ADMIN},admin:true
- DRONE_RUNNER_CAPACITY=2
- DRONE_GIT_ALWAYS_AUTH=true
# Github Config
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
- DRONE_GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
- DRONE_LOGS_DEBUG=true
- DRONE_LOGS_TEXT=true
drone-runner:
container_name: drone-runner
image: drone/drone-runner-docker:1
restart: unless-stopped
depends_on:
- drone-server
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RUNNER_NAME="drone-test-runner"
- DRONE_RUNNER_CAPACITY=1
- DRONE_DEBUG=true
- DRONE_TRACE=false
ports:
- "3000:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock建立 Drone Pipeline
Drone 的 Pipeline 就是根據 .drone.yml 檔案設定的,它特別的地方是每個 Pipeline 都是在不同的 Container 上執行的,環境完全獨立。
我們先建立它,這邊我們用個簡單的範例,使用 Flake8 這個套件,他是 Python 的程式碼檢查工具,可以幫助我們檢測程式碼的排版。
kind: pipeline
name: drone-test
platform:
os: linux
arch: arm64
steps:
- name: setup-python
image: python:3.8.7
commands:
- python -m venv /drone/src/venv
- . /drone/src/venv/bin/activate
- pip install -U pip setuptools flake8
volumes:
- name: venv_cache
path: /drone/src/venv
- name: lint
image: python:3.8.7
commands:
- . /drone/src/venv/bin/activate
- cd src
- flake8 .
volumes:
- name: venv_cache
path: /drone/src/venv
when:
event:
- push
- pull_request
volumes:
- name: venv_cache
host:
path: /tmp/cache/drone/venv我們先建立一個虛擬環境,並安裝要用到的套件,Lint 的觸發條件是我們將程式碼推送 (Push) 或 PR Merge 的時候,而 main.py 就是我們要檢查的檔案。
先推送到 Github。
git init
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/<your_username>/<your_repo_name>.git
git push -u origin main
啟動 Drone Server
1. 推送成功後讓我們啟動 Docker 運行指令:
docker compose up -d2. 這時候我們在網站上輸入 Ngrok URL,可以看到 Drone 已經啟動成功了。

3. 點擊 CONTINUE,來到登入畫面,Email 可以隨意輸入,Full Name 必須輸入擁有 admin 帳號的使用者名稱 ( 也就是剛剛 .env 輸入的 ADMIN 參數 ),才會看到後面要設定的選項。

4. 登入成功後,在 Build 頁面可以看到我們剛剛建立的 Github Repo,如果沒有的話可以點選右上角的「Sync」。

5. 點擊 “ACTIVATE REPOSITORY”,這個步驟就是建立 Drone 和 Github 的 Webhook。

Drone 設定
將 Project Settings 設定為 Trusted,以防 Drone 在運行的時候權限不足。

我們在專案裡建立 main.py 檔案,貼上程式碼。
mkdir src # Create a directory
touch src/main.py # Create file# src/main.py
def test(a,b):
return a+b先來確定一下專案結構,避免推送後檢測不到程式碼。
├── src/
│ └── main.py
├── docker-compose.yml
├── .drone.yml
└── .env將 main.py 推送到 Github。
git add .
git commit -m "add main file"
git push觸發 Webhook 後,Drone 就可以看到這此推送的結果顯示失敗,代表 flake8 檢查沒有通過。

於是我們修改 main.py 讓他符合格式,再 Push 一次:
def test(a, b):
return a + b可以看到這次通過了!

總結
今天我們完成了 Drone CI 的基礎程式碼檢查配置,其實 Drone 還提供了許多功能,例如:
- 資料庫整合測試自動化
- 單元測試與整合測試的並行執行
- Pipeline 快取機制,保存 Drone 的運行環境,不需要每次 Push 都建立一次環境
如果你想要更快建立,可以到我的 Github 複製下來直接使用喔!



