十分鐘自架 Drone CI
前情提要:之前自架了 Gitea,之後上網查一下,大多數人都是用 Drone CI 與之搭配,所以我也是選用 Drone CI 囉!
Drone CI 分為 Drone server 和 Drone runner,一個是主控機,一個是實際跑 CI 任務的機台,當然想要架多台 runner 也是可以,只要有鈔能力。
不論是 Drone server 還是 Drone runner,一律都是以容器的形式運行,請先搞定 Podman 或 Docker。
另外提醒一下,如果是在公司,又沒有鈔能力的話,不要裝 Docker Desktop,可以改裝 Docker Engine,以免成為盜版軟體的 受益者 受害者。
架設 Drone Server
在把容器跑起來之前,要先在 Gitea 做一下文書作業。
前置作業
在 Gitea 建立 Drone 外部應用程式,在「設定 → 應用程式」,要填入兩個值,範例如下:
- 應用程式名稱
-
drone
- 應用程式 URI
-
http://192.168.0.226:3001/login
這裡的 URI 是 Drone server 的 URI,目前實際上還不存在,這是事先預想好的,謀定而後動,知止而有得。
提交後會產生一對 Client ID 和 Client Secret,請抄錄下來,範例如下:
- Client ID
-
1306e04d-f653
- Client Secret
-
gto_de5nyz
Gitea 的前置作業完畢,可以設置 Drone server 了。
跑 Drone Server 容器
跑 Drone server 的參數頗多,先整理一下:
- DRONE_GITEA_CLIENT_ID
-
1306e04d-f653
- DRONE_GITEA_CLIENT_SECRET
-
gto_de5nyz
- DRONE_GITEA_SERVER
-
http://192.168.0.226:3000
- DRONE_RPC_SECRET
-
super-duper-secret
- DRONE_SERVER_HOST
-
192.168.0.226:3001
- DRONE_SERVER_PROTO
-
http
- DRONE_USER_CREATE
-
username:drone_admin,admin:true
從這邊可以看到我的 Gitea 是跑在 192.168.0.226:3000,而 Drone server 預計是跑在 192.168.0.226:3001,門牌只差一號比較近跑起來會比較快(胡說八道)。
其他大部分參數都可以望文生義,就不解釋了。
這裡我是用 Podman,它的 CLI 用法和 Docker 有九成像。
下載 Drone server image:
$ podman pull docker.io/drone/drone:2
Drone 文件採用的板號是固定主版號 2
,沒有採用 latest
,應該是較為穩健的考量。
跑起來:
$ podman run \ --volume=/var/lib/drone:/data \ --env=DRONE_GITEA_SERVER=http://192.168.0.226:3000 \ --env=DRONE_GITEA_CLIENT_ID=1306e04d-f653 \ --env=DRONE_GITEA_CLIENT_SECRET=gto_de5nyz \ --env=DRONE_RPC_SECRET=super-duper-secret \ --env=DRONE_SERVER_HOST=192.168.0.226:3001 \ --env=DRONE_SERVER_PROTO=http \ --env=DRONE_USER_CREATE=username:drone_admin,admin:true \ --env=TZ=Asia/Taipei \ --publish=3001:80 \ --restart=always \ --detach=true \ --name=drone \ --restart=always \ docker.io/drone/drone:2
執行後用 podman ps
確認一下,沒有死掉就好。
開瀏覽器到 http://192.168.0.226:3001/,應該會到達 Drone server 登陸頁。
依照指示授權、開帳號完畢後,Drone 頁面就會看到 repo 了。
至此 Gitea 的一些動作(例如提交、合併)就會打給 Drone server 的 webhook,而 Drone server 就會把任務派給 runner 做,runner 則會把專案拉下來到一個新容器,Drone server 則負責監控 runner 的任務運行狀況,而具體的任務則由專案內的 .drone.yml 檔案定義,我們可以給它命令讓它跑測試、建置、部署之類的工作。
一些小指令
要看 log,可以執行:
$ podman logs drone
要進入容器:
$ podman exec -it drone /bin/sh
接著來架 Drone runner。
跑 Drone Runner
前面說過,Drone server 是主控,runner 才是跑 pipeline 的人。
Runner 本身也是個容器。
- Image
- Image 真身網址
- docker.io/drone/drone-runner-docker
Drone Runner 在 Podman 上跑失敗,另開一台用純正 Docker 跑。
把 image 抓下來:
$ sudo docker pull docker.io/drone/drone-runner-docker:1
準備參數:
- DRONE_RPC_HOST
-
192.168.0.226:3001
- DRONE_RPC_PROTO
-
http
- DRONE_RPC_SECRET
-
super-duper-secret
跑起來:
$ sudo docker run \ --detach \ --volume=/var/run/docker.sock:/var/run/docker.sock \ --env=DRONE_RPC_PROTO=http \ --env=DRONE_RPC_HOST=192.168.0.226:3001 \ --env=DRONE_RPC_SECRET=super-duper-secret \ --env=DRONE_RUNNER_CAPACITY=2 \ --env=DRONE_RUNNER_NAME=my-first-runner \ # --env=DRONE_UI_USERNAME=root \ # --env=DRONE_UI_PASSWORD=root \ --env=TZ=Asia/Taipei \ --publish=3000:3000 \ --restart=always \ --name=runner \ drone/drone-runner-docker:1
其中兩行被註解掉的是 runner web UI 的帳密,這 runner web UI 有點雞肋,主要的資訊都在 Drone server 的 web,runner 這邊的不開也罷,註解後 runner 就不會啟動 web UI 了。
透過以上的參數 Drone runner 會自行和 Drone server 註冊,不需要再做什麼人工註冊 runner 之類的文書作業了,此後當 Drone server 接到工作時就會分派給 runner。
一般來說到這邊就可以休息一下,後面還有真正的魔王,pipeline 配置等著我們。
同場加映 Drone CLI
Drone CLI 是裝在本機電腦上的,負責和 Drone server 互動,能管理 Drone。
安裝:
$ curl -L https://github.com/harness/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz | tar zx $ sudo install -t /usr/local/bin drone
在 Windows,drone-cli 只能用 Scoop 裝,所以要先裝 Scoop,再裝 drone-cli,這部分請參考下列文件:
裝完後,配置連接到 Drone server 參數,在 ~/.bashrc 加入以下內容:
export DRONE_SERVER=http://192.168.0.226:3001 export DRONE_TOKEN=HnkG4wJYNY6D1VSVpKt1YGJqMVaMbuyf
其中的 token 在 Drone web 個人帳號頁可以看到。
配置後重新登入,試試:
$ drone info
應該會看到自己的帳號資料。
詳細的用法請參閱 Drone CLI 文件。
參考資料
殘留課題
要怎麼讓 Drone server / Drone runner 變成服務,並且自行啟動?
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!