DevOps Drone 利用Docker自架一個 CI CD Server

最近再練習CI CD的自動化部署流程,再網路上看到Drone基於Docker的CI CD Server,有不少的擴充Drone plugin來做使用,介面及學習曲線上也比Jenkins 簡易許多

1. 在官方安裝文件中 Drone CI / CD | Drone第一步是要根據Repo的類型來做安裝,再本文章使用github來做範例,但官方文件中也有其他像是Gitlab、GitGogs等其他倉庫的設定方式

 

2. 在Github設立應用程式的OAuth Developer applications (github.com)

Homepage URL為Drone的網址

Authorization callback URL為Drone的網址加上/login

 

3. 建立完成後會有一個Client Id 跟 Client Secret等等會用到,還會需要一個Shared Secret 用於跟runner匹配

Shared Secret 可以使用openssl 來產生或是透過這個網址隨機產出random.org/cgi-bin/randbyte?nbytes=16&format=h

 

 

4. 使用Docker 運行Drone Image,記得DRONE_USER_CREATE跟DRONE_USER_FILTER要做設定,不然誰都能進入此CICD來使用,後續都權限管理能透過admin來管控

docker run
  -v /var/lib/drone:/data \
  -e DRONE_GITHUB_CLIENT_ID=your-id \
  -e DRONE_GITHUB_CLIENT_SECRET=super-duper-secret \
  -e DRONE_RPC_SECRET=super-duper-secret \
  -e DRONE_SERVER_HOST=drone.company.com \
  -e DRONE_SERVER_PROTO=https \
  -e DRONE_USER_CREATE=username:root,admin:true \
  -e DRONE_USER_FILTER=root,organize \
  -p 80:80 \
  -p 443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  "drone/drone:2"

每個設定解釋如下

docker run \
  -v /var/lib/drone:/data \ 對應本機位置
  -e DRONE_GITHUB_CLIENT_ID=your-id \ github CLIENT_ID
  -e DRONE_GITHUB_CLIENT_SECRET=super-duper-secret \ github CLIENT_SECRET
  -e DRONE_RPC_SECRET=super-duper-secret \ 剛剛產出的secret runner 跟這個必須一致
  -e DRONE_SERVER_HOST=drone.company.com \ drone的對外網址
  -e DRONE_SERVER_PROTO=https \ 用http or https
  -e DRONE_USER_CREATE=username:root,admin:true \ 初始的admin
  -e DRONE_USER_FILTER=root,organize \ 可用此CICD的授權者,也可以是組織
  -p 80:80 \ server 80 對容器 80
  -p 443:443 \ server 443 對容器 443
  --restart=always \ 掛掉自動重啟
  --detach=true \ 背景運行
  --name=drone \ 名稱
  "drone/drone:2"

 

5. 使用Docker 運行Drone Runner Image 這邊的DRONE_RPC_SECRET需跟上面Drone一致

docker run --detach \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=https \
  -e DRONE_RPC_HOST=drone.company.com \
  -e DRONE_RPC_SECRET=super-duper-secret \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=drone-runner \
  -p 3000:3000 \
  --restart=always \
  --name=drone-runner \
  "drone/drone-runner-docker:1"

每個設定解釋如下

docker run --detach // 背景運行
  -v /var/run/docker.sock:/var/run/docker.sock \ 對應本機位置 這個不能隨意更動
  -e DRONE_RPC_PROTO=https \ 用http or https
  -e DRONE_RPC_HOST=drone.company.com \ drone 主機的網址
  -e DRONE_RPC_SECRET=super-duper-secret \ 剛剛產出的secret runner 跟這個必須一致
  -e DRONE_RUNNER_CAPACITY=2 \ 同時運行的task數量
  -e DRONE_RUNNER_NAME=drone-runner \ RUNNER_NAME
  -p 3000:3000 \
  --restart=always \
  --name=drone-runner \
  "drone/drone-runner-docker:1"

 

可以根據文件Reference | Drone設立以下環境變數,以免跑CICD吃掉過多資源導致其他服務被影響

DRONE_CPU_PERIOD = 100000 使用1CPU

DRONE_MEMORY_LIMIT = 3000000000 使用3GB記憶體

 

5. 進入後台就能看到倉庫底下的所有repo

 

6. 倉庫底下需配置一個.drone.yaml的CICD工作腳本,簡單的範例如下,每個步驟都需要有個image當基底

kind: pipeline
name: default
workspace:
  base: /src
  path: drone_test
steps:
  - name: install-package
    image: node:16
    commands:
      - echo install package
      - npm ci
  - name: test
    image: node:16
    commands:
      - echo install Chrome
      - apt-get update -qq && apt-get install -qq --no-install-recommends chromium && apt-get clean && rm -rf /var/lib/apt/lists/* && ln -s /usr/bin/chromium /usr/bin/google-chrome
      - echo test
      - npm run test-ci
  - name: build
    image: node
    commands:
      - echo build
      - npm run build
trigger:
  branch:
  - master
  event:
  - push

 

7. 設定對應Repo的Drone後台,這邊能設定觸發及CICD後台公開私密,以及CICD腳本的密鑰等等,畢竟像是連線字串這種比較隱密的環境變數,還是不合適放在程式碼腳本當中

 

8. 建立保存後,之後的每個hook都會透過github 配合你CICD的腳本來做條件觸發,可以去github repo的webhooks設定發現會多了一個通知設定到你的CICD Server

 

Copyright © 2025 - All right reserved