最近再練習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