[用 Drone 建立自動部署] 01 基本服務建置及串接 GitHub
透過 Drone 建立自動部署流程,基本服務建置及串接 GitHub
使用 Drone
建立自己的自動部署服務
Drone 是一套以 Golang 開發的一套 CI/CD 系統工具
本篇進行基礎服務啟動設定,以及串接 GitHub
為什麼使用 drone
- 支援各大 git repository:github、gitlab、bitbucket、gittea 等等
只要你的專案是使用 git 版控,你就可以輕鬆整合 drone - ci 流程是以 yml 檔描述的,非常好理解,且可以靈活調整
只要有使用過 docker-compose 的經驗應該都可以快速上手 - 本身是以 Go 語言打造的,服務啟動速度非常快
- 是一個 docker base 的服務,可以快速移植到不同平台上運行
尤其非常適合在 k8s 叢集的環境中運行 - drone 的社群上已經有各種插件可以使用,也可以用各種語言自製客製化插件
只要包裝成 image 就能輕鬆加入 ci 流程當中,非常方便
分為 server 和 runner,server 負責收集 git repo 的事件,當偵測到 pipeline 中定義好的條件時
比如說某個 branch push,就會觸發pipeline 的流程,分派給不同種類的 runner 執行
常見有 Docker runner、Kubernetes runner, SSH runner 等
基礎建置
在本機環境使用 docker-compose 建立 Drone1.10 服務(因為 1.0 版沒有 ssh runner)
並使用 ngrok 讓外部網路可以連線進入本機 8089 port,作為 github 的 webhook 的 callback 網址
附註:中間 ngrok 重啟好幾遍,有些截圖的 ngrok 的網址可能會不同
文章中只要是 ngrok.io
結尾的網址都是 ngrok 服務開通的對外網址
STEP 1
docker-compose.yml
version: '3.7'
services:
drone-server:
container_name: drone_server
image: drone/drone:1.10
ports:
- 8089:80
volumes:
- /var/lib/drone:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
- DRONE_AGENTS_ENABLED=true
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
- DRONE_TLS_AUTOCERT=${DRONE_TLS_AUTOCERT}
- DRONE_CRON_INTERVAL=1m
- DRONE_USER_CREATE=${DRONE_USER_CREATE}
- DRONE_USER_FILTER=${DRONE_USER_FILTER}
drone-ssh-runner:
container_name: drone-runner-ssh
image: drone/drone-runner-ssh
depends_on:
- drone-server
environment:
- DRONE_RPC_HOST=${DRONE_SERVER_HOST}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RPC_PROTO=${DRONE_SERVER_PROTO}
- DRONE_RUNNER_CAPACITY=${DRONE_RUNNER_CAPACITY}
drone-docekr-runner:
container_name: drone_runner_docker
image: drone/drone-runner-docker:1
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_HOST=${DRONE_SERVER_HOST}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RPC_PROTO=${DRONE_SERVER_PROTO}
- DRONE_RUNNER_CAPACITY=${DRONE_RUNNER_CAPACITY}
可以在 docker-compose.yml 的同層用 .env
保存一些機密資料
例如 ${DRONE_GITHUB_CLIENT_SECRET}
就可以從出版本控制中抽離
關於設定的參數可以在 官方文件 了解更多
設置 DRONE_CRON_INTERVAL=1m
讓 drone server 每一分鐘都去偵測有沒有需要執行的 cron
預設是 30m,所以有人會遇到服務啟動之後 cron 延後被執行
其實不是延後執行,而是 drone server 偵測未執行 cron 的行為還沒被觸發:參考資料
而在 .env
裡就直接定義名稱就好
注意的是 DRONE_SERVER_HOST
不需要加上 protocol
.env
# GITHUB OAuth App 的設定
DRONE_GITHUB_CLIENT_ID=
DRONE_GITHUB_CLIENT_SECRET=
# 管理員帳號設定
DRONE_USER_CREATE=username:ray247k,admin:true
# 具有存取權限的人,如果是 github 的話可以使用組織做設定。bitbucket 不行
DRONE_USER_FILTER=ray247k,lemon
# Drone Server 的網址,這邊用 ngrok 開做範例
DRONE_SERVER_HOST=56662cd578da.ngrok.io
# 如果沒有獨立網址,而是使用反向代理與自簽憑證的話,可能會因為驗證網域失敗報錯,這時候要改為 http 與 false
DRONE_SERVER_PROTO=https
DRONE_TLS_AUTOCERT=true
# 隨便開心亂設定的密碼
DRONE_RPC_SECRET={亂數密碼}
# 一次可以執行幾個 JOB,不可為 0
DRONE_RUNNER_CAPACITY=3
# 偵測未執行排程的間隔時間
DRONE_CRON_INTERVAL=1m
DRONE_RPC_SECRET 可以使用指令來產生
openssl rand -hex 16
STEP 2
如果你本身有網址可以使用就不需要進行此步驟
Ngrok 開放 IP 讓外部連線
把剛剛架設的 drone 伺服器 localhost 的 8089 端口綁定到特定的 ngrok 網址
這邊的網址等下需要複製貼上綁定到 Github OAuth App 上
ngrok http 8089
STEP 3 - 設定 Github 的 OAuth App
進入 github 的 OAuth App 設定頁面新增 OAuth 應用程式
右上個人大頭貼->settings->左邊頁籤 Developer settings->OAuth Apps
開始新建 OAuth App
填入剛剛建立好的 ngrok 網址,註冊 OAuth 應用程式
callback 網址設為 /login
建立後就要開始串接 Drone CI 到 Github 了
STEP 4
修改 Drone 設定
點開剛剛建立的 github APP 設定
修改剛剛 docker-compose.yml DRONE_GITHUB_CLIENT_ID
和 DRONE_GITHUB_CLIENT_SECRET
對應頁面上的 Client ID
和 Client secrets
內容
完成後重啟 drone 的 docker-compose.yml 服務,訪問你的 ngrok 網址查看
驗證登入後代表你的 Drone CI 串接完成!可喜可賀!可喜可賀!
STEP 5
啟用服務
依照剛剛的步驟,應該可以開啟 ngrok 網址看到 Drone 的後台
一進去是你所有的 Repository
隨便點一個進去之後按下正中央的 ACTIVAE REPOSITORY
就可以在專案中啟用 webhook 啦
如果想要確認的話,可以打開 Github 上剛剛的 Repository->Settings->Webhooks
應該會看到如圖上的畫面
有一個 Webhook 正在使用中
點進去可以看到更多設定,或是查看 Webhook 發送過的請求