本系列文已經接近尾深,今天分享一個跟前面比較不一樣的主題,Drone CI/CD。分享這個工具的主因,是因為體會過 CI/CD 的美好就回不去了,剛好 Drone 是一套以 golang 編程的 CI/CD 工具,本篇讓我們使用 Github repo 當作目標,實現簡易的 CI testting。
安裝準備分為兩個部分,機器與 Repo Setting。
準備一台 VM,供應商依自己喜歡的選擇即可(筆者使用便宜的 Linode,大家有機器或 GCP 也都可以)。並在機器上安裝 OS, docker, docker-compose,以便在機器上執行 drone image。
> docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
開啟我們的 Github,在開發人員設定裡面新增 OAuth App
將剛剛我們準備好的 Client ID 與 Client Secret,加入啟用 drone 的 docker-compose.yml 中,並在機器上產生 drone-server 與 drone-runner 溝通用的密鑰。
Create DRONE_RPC_SECRET
> openssl rand -hex 16
db242daf100b137d40f7f40f82168b7b //我不是用這組你放心
docker-compose.yml
version: '2'
services:
drone-server:
image: drone/drone:1
container_name: drone-server
ports:
- 80:80
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
- DRONE_SERVER_HOST="{YOUR_MACHINE_HOST}"
- DRONE_SERVER_PROTO=http
- DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
- DRONE_GITHUB_CLIENT_ID="{CLIENT_ID}"
- DRONE_GITHUB_CLIENT_SECRET="{CLIENT_SECRET}"
drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_PROTO=http
- DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
- DRONE_RUNNER_CAPACITY=2
Start
> docker-compose up
drone-server | {"interval":"30m0s","level":"info","msg":"starting the cron s}
drone-server | {"interval":"24h0m0s","level":"info","msg":"starting the zomb}
drone-runner | time="2020-08-12T14:53:37Z" level=info msg="starting the serv"
drone-runner | time="2020-08-12T14:53:37Z" level=info msg="successfully ping"
drone-runner | time="2020-08-12T14:53:37Z" level=info msg="polling the remotr
drone-runner | received signal, terminating process
drone-runner | time="2020-08-30T04:44:49Z" level=error msg="shutting down th"
drone-runner | drone-runner-docker: error: http: Server closed, try --help
drone-runner | time="2020-08-30T04:45:19Z" level=info msg="starting the serv"
drone-runner | time="2020-08-30T04:45:19Z" level=error msg="cannot ping the "
drone-runner | time="2020-08-30T04:45:20Z" level=info msg="successfully ping"
drone-runner | time="2020-08-30T04:45:20Z" level=info msg="polling the remotr
簡單介紹一下最常見的 kind: pipeline
,如其名管道化的流程可分為數個 steps
(步驟),每一個步驟為獨立的 check point,並運行於獨立的 containers 中。每個步驟內由於是啟用獨立的 containers,故可以到皆需設定所需的 image, environment, commands。
以本篇的 .drone.yml 來說,我們便是針對了這個套件,啟用了兩個 containers,分別進行了 golangci-lint
靜態code掃描與 go test
單元測試。
GUI
針對想要進行 CI testting 的專案,於 drone GUI 上啟用
於該專案內增加 drone 描述檔
.drone.yml
workspace:
base: /go
path: src/github.com/WeiWeiWesley/simple_redis
kind: pipeline
name: simple_redis
steps:
- name: golangci-lint
image: golangci/golangci-lint:v1.23.3-alpine
commands:
- golangci-lint run
- name: go_test
image: golang:1.12
environment:
CGO_ENABLED: 0
GO111MODULE: on
commands:
- go get -u --insecure ./...
- go test -cover
Push commit 觸發 drone CI
通過所有步驟會獲得 ✅
每次 commit 都會紀錄檢查結果