Drone 是我今年主推的 CI/CD 自架服務,詳細可以參考這篇文章,目前在公司內部團隊使用了一年以上,服務相當穩定。Drone 本身可以透過 docker-compose 方式快速在機器上架設完成,但是由於 Kubernetes 的盛行,大家也希望能透過 Kubernetes 來安裝 Drone 服務。本篇會教大家如何在 AWS 上透過 Kubernetes 安裝完成。Drone 預設使用 SQLite 當作資料庫,檔案會直接存放在
/var/lib/drone
路徑底下,但是容器內不支援寫入,所以必須要要額外掛上空間讓 Drone 可以寫入資料。此篇會以 GitHub 認證 + SQLite 來教學。
事前準備
- 在 AWS 上面 建立 kubernets
- 在 AWS 上面建立 EBS 空間存放 SQLite
- 申請 GitHub OAut
- 使用 Minikube (快速在本機端架設出 K8S Cluster)
- Katacoda
- Play with Kubernetes (單次免費四小時)
$ aws ec2 create-volume \ --availability-zone=ap-southeast-1a \ --size=1 --volume-type=gp2注意
availability-zone
區域要跟 K8S 同樣,大小先設定 1G。完成後會看到底下訊息:
{ "AvailabilityZone": "ap-southeast-1a", "Encrypted": false, "VolumeType": "gp2", "VolumeId": "vol-04741f74eb0f6b891", "State": "creating", "Iops": 100, "SnapshotId": "", "CreateTime": "2017-09-23T15:42:24.319Z", "Size": 1 }之後會用到
VolumeId
。假如沒有做此步驟,您會發現 Drone 伺服器是無法啟動成功。最後是請到 GitHub 帳號內建立一個全新 OAuth App,並取得 CLient
跟 Secret
代碼。
安裝 Drone
所有的 Yaml 檔案都可以直接在 appleoy/drone-on-kubernetes,找到。首先打開drone-server-deployment.yaml
,找到 volumeID
取代成上述建立好的結果。
awsElasticBlockStore: fsType: ext4 # NOTE: This needs to be pointed at a volume in the same AZ. # You need not format it beforehand, but it must already exist. # CHANGEME: Substitute your own EBS volume ID here. - volumeID: vol-xxxxxxxxxxxxxxxxx + volumeID: vol-01f13b969e9dabff7再來設定 server 跟 agent 溝通用的 Secret,打開
drone-secret.yaml
data: - server.secret: ZHJvbmUtdGVzdC1kZW1v + server.secret: ZHJvbmUtdGVzdC1zZWNyZXQ=透過 base64 指令換掉上面的代碼。假設密碼設定
drone-test-secret
,請執行底下指令
$ echo -n "drone-test-secret" | base64 ZHJvbmUtdGVzdC1zZWNyZXQ=在 GitHub 上面建立新的 Application,並且拿到 Client ID 跟 Secret Key,修改
drone-configmap.yaml
檔案
server.host: drone.example.com server.remote.github.client: xxxxx server.remote.github.secret: xxxxx接著陸續執行底下指令,新增 Drone NameSpace 並且將 server 及 agent 服務啟動
$ kubectl create -f drone-namespace.yaml $ kubectl create -f drone-secret.yaml $ kubectl create -f drone-configmap.yaml $ kubectl create -f drone-server-deployment.yaml $ kubectl create -f drone-server-service.yaml $ kubectl create -f drone-agent-deployment.yaml完成後,k8s 會自動建立 ELB,透過 kubectl 可以看到 ELB 名稱
$ kubectl --namespace=drone get service -o wide執行後看到底下結果:
NAME CLUSTER-IP EXTERNAL-IP drone-service 100.68.89.117 xxxxxxxxx.ap-southeast-1.elb.amazonaws.com拿到 ELB 網域後,可以直接更新 GitHub 的 application 資料 最後打開瀏覽器,填入上述的網址,會發現直接轉到 GitHub OAuth 認證,點選確認後,Drone 會開始讀取您的個人資料,這樣就代表成功了。
懶人包安裝
上述步驟是不是有點複雜,要執行的 kubectl 指令非常多,所以我提供了另一種安裝方式,就是透過 [install-drone.sh],執行這 Shell Script 檔案前,你必須先做兩件事情。1. 申請 EBS 空間,完成後請修改drone-server-deployment.yaml
內的 volumeID
。2. 申請 [GitHub OAuth Application][42],完成後請修改 drone-configmap.yaml
內的 GitHub 設定。最後執行底下指令
$ ./install-drone.sh
擴展 agent 服務
假設一個 agent 已經不符合團隊需求,在 k8s 內只要一個指令就可以自動水平擴展 agent:$ kubectl scale deploy/drone-agent \ --replicas=2 --namespace=drone其中
replicas
可以改成你要的數字。
如何清除 Drone 服務
我們已經將 Drone 資料庫備份在 EBS,所以隨時都可以移除 Drone 服務,透過簡單的指令就可以清除掉 Drone 所有容器,只要下清除 Namespace 即可$ kubectl delete -f drone-namespace.yaml