Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

[用 Drone 建立自動部署] 01 基本服務建置及串接 GitHub

透過 Drone 建立自動部署流程,基本服務建置及串接 GitHub

Ray

使用 Drone 建立自己的自動部署服務
Drone 是一套以 Golang 開發的一套 CI/CD 系統工具
本篇進行基礎服務啟動設定,以及串接 GitHub

為什麼使用 drone

  1. 支援各大 git repository:github、gitlab、bitbucket、gittea 等等
    只要你的專案是使用 git 版控,你就可以輕鬆整合 drone
  2. ci 流程是以 yml 檔描述的,非常好理解,且可以靈活調整
    只要有使用過 docker-compose 的經驗應該都可以快速上手
  3. 本身是以 Go 語言打造的,服務啟動速度非常快
  4. 是一個 docker base 的服務,可以快速移植到不同平台上運行
    尤其非常適合在 k8s 叢集的環境中運行
  5. 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

ngrok result

STEP 3 - 設定 Github 的 OAuth App

進入 github 的 OAuth App 設定頁面新增 OAuth 應用程式
右上個人大頭貼->settings->左邊頁籤 Developer settings->OAuth Apps
github oauth app page

開始新建 OAuth App
填入剛剛建立好的 ngrok 網址,註冊 OAuth 應用程式
callback 網址設為 /login
new oauth application

建立後就要開始串接 Drone CI 到 Github 了

STEP 4

修改 Drone 設定

點開剛剛建立的 github APP 設定
github app settings

修改剛剛 docker-compose.yml DRONE_GITHUB_CLIENT_IDDRONE_GITHUB_CLIENT_SECRET
對應頁面上的 Client IDClient secrets 內容

完成後重啟 drone 的 docker-compose.yml 服務,訪問你的 ngrok 網址查看
github authorize page

驗證登入後代表你的 Drone CI 串接完成!可喜可賀!可喜可賀!

STEP 5

啟用服務

依照剛剛的步驟,應該可以開啟 ngrok 網址看到 Drone 的後台
一進去是你所有的 Repository
隨便點一個進去之後按下正中央的 ACTIVAE REPOSITORY 就可以在專案中啟用 webhook 啦
drone panel

如果想要確認的話,可以打開 Github 上剛剛的 Repository->Settings->Webhooks 應該會看到如圖上的畫面
有一個 Webhook 正在使用中
點進去可以看到更多設定,或是查看 Webhook 發送過的請求
github webhooks page

最新文章

Category

Tag