前言
正文
gitlab的安裝方式,參考 [[gitlab on GKE 災害還原筆記]]
再來是安裝drone的方式,
這邊之前沒寫文件,重試的時候搞了一陣子。
要先知道 runner分成哪幾種,根據你的環境選擇你要的方式。
在drone畫面,基本上都差不多。
有差異的點是再建置時,就直接看圖吧
Drone Runner分成五種,適用於不同的情境
-
Docker runner :是drone最常見的用法,pineline中的每一個step都起一個獨立的container運行特定任務,本文即是採用docker runner。
在建置時,會在該runner裡面執行docker,所以當下只會看到runner裡面的cpu跟ram使用量上升。
-
Kubernetes runner:跟docker runner 的功能相似,只是改成Kubernetes 版本,如果你的服務要搭建在k8s上,就用這個。
選擇kubernetes的版本,再建置時會在當下的叢集建立一個pod,
然後就會在裡面執行要跑得步驟。 -
Exec runner:用於你的專案不適合跑在容器內的狀況EX:MacOs專案。
-
SSH runner:直接以ssh 連線到遠端以default shell 執行pipeline流程,需要使用openssh 7.9 以上版本。
-
Digital Ocean runner :用於當你的pipeline需要權限可以操作整台虛擬機的情況,且不適合跑在容器內。
角色 | 功能 |
---|---|
用戶 | Gitlab |
Drone Server | Drone 主服務,提供Web界面 |
Drone Runner | 我理解為實現各種操作的適配器,例如ssh、docker、k8s操作 |
Drone Agent | 操作主機 Docker API 的代理程序 |
Docker Server | 主機的 Doker 程序 |
再來就是要佈署 drone server跟 runner了。
Step 1.
首先要到Gitlab,建立oAuth的id 跟token。
切記是在user Setting的 Application,
因為Gitlab是我建的,所以我有另一個Admin的區域,
不是在Admin裡面。
網頁不要關, Application ID 跟 Secret等等會用到。
Step 2. drone Server
將一些參數改成自己的。
yaml欄位 | 對應的欄位 |
---|---|
DRONE_GITLAB_CLIENT_ID | Application ID |
DRONE_GITLAB_CLIENT_SECRET | Secret |
DRONE_SERVER_HOST | Callback URL 的domain |
DRONE_RPC_SECRET | 自行建立,runner的secret需一致 |
apiVersion: apps/v1
kind: Deployment
metadata:
name: gke-drone-server
labels:
app: drone
drone: drone-server
io.kompose.service: drone-server
spec:
selector:
matchLabels:
app: drone
drone: drone-server
io.kompose.service: drone-server
template:
metadata:
labels:
app: drone
drone: drone-server
io.kompose.service: drone-server
spec:
containers:
- env:
- name: DRONE_GITLAB_CLIENT_ID # OAuth 的 Application ID
value: 5b2f90188137bab7b1c6959721feb6e55f1137919e5b4b5ce005bd5e15af536a
- name: DRONE_GITLAB_CLIENT_SECRET # OAuth 的 Secret
value: 4cc261149603b3df864677f5af37b55613f6f4d20dd65fbb3e4f77f0cbca9e15
- name: DRONE_GITLAB_SERVER # Gitlab Server
value: http://35.234.26.234
- name: DRONE_GIT_ALWAYS_AUTH # Drone clone 時,是否每次都驗證
value: "false"
- name: DRONE_LOGS_COLOR # Log 啟用顏色辨識
value: "true"
- name: DRONE_LOGS_DEBUG # 選擇是否開啟 debug 模式
value: "false"
- name: DRONE_LOGS_PRETY
value: "false"
# - name: DRONE_LOGS_TRACE #開啟log追蹤
# value: "true"
- name: DRONE_RUNNER_CAPACITY # 表示一次可執行 n 個 job
value: "3"
- name: DRONE_SERVER_HOST # Drone URL,不能加HTTP,解析會在加上HTTP
value: 14.199.130.26
- name: DRONE_SERVER_PROTO # http 或者 https 連線設定
value: http
- name: DRONE_TLS_AUTOCERT # 自動生成 ssl 證書,並接受 https 連線,末認為false
value: "false"
- name: DRONE_REGISTRATION_CLOSED # 啟用的話,管理員需在用戶登入前創建用戶
value: "false"
- name: DRONE_USER_CREATE # 建立admin權限的使用者 cli登入用
value: username:ezio,admin:true
- name: DRONE_USER_FILTER # 可操作 Drone 的用戶清單
value: root,ezio
- name: DRONE_RPC_SECRET
value: 824de51510f08498fa770c7798e3cc9e
image: drone/drone:2
imagePullPolicy: "Always"
name: drone-server
ports:
- containerPort: 80
resources: {}
volumeMounts:
- mountPath: /data
name: drone-server-claim0
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: drone-server-claim0
persistentVolumeClaim:
claimName: gke-drone-server-claim0
如果要其他git的安裝方式請參考 1. 的官方文件
ref.
Step 3-a. drone Runner - Docker Runner
注意 DRONE_RPC_SECRET需與server一致。
這邊會用到 docker.sock,也是因為這個的關係,
才導致這次重新測試。
k8s即將廢棄 Dockershim,改用containerd,
詳細內容就不多說了,有興趣的可參考 (1) 、 (2)
雖然我實測出來的結果,
在containerd的node是可以用的。
有在想是不是因為核心還是 /var/run/docker.sock 個關係,
但隨著後續研究 docker.sock (3),發覺應該是不能用的才對…
但為什麼能用還是搞不懂。但(4)的官方論壇有說,他不擔心這個問題,
實際上還真的沒問題…
補充,
最近把node的 containerd 版本升到 1.20 後,Docker Runner就真的不能用了。應該是早期還在用舊版的containerd,所以才能跑。
apiVersion: apps/v1
kind: Deployment
metadata:
name: agent
spec:
selector:
matchLabels:
drone: drone-agent
replicas: 1
template:
spec:
containers:
- env:
- name: DRONE_LOGS_DEBUG
value: "false"
# - name: DRONE_LOGS_TRACE #開啟log追蹤
# value: "true"
- name: DRONE_RPC_SECRET
value: 824de51510f08498fa770c7798e3cc9e
- name: DRONE_RPC_HOST
value: 14.199.130.26
- name: DRONE_RPC_PROTO
value: "http"
- name: DRONE_RUNNER_CAPACITY
value: "3"
image: drone/drone-runner-docker:1
imagePullPolicy: ""
name: drone-agent
resources: {}
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-socket
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: docker-socket
hostPath:
path: /var/run/docker.sock
ref.
1. 檢查棄用 Dockershim 對你的影響
2. 棄用 Dockershim 的常見問題
3. [Docker] 掛載 /var/run/docker.sock 的用意?
4. Drone Disscus - Docker plugin & dockershim deprecation // Kubernetes 1.20+
Step 3-b. drone Runner - kubernete Runner
注意 DRONE_RPC_SECRET需與server一致。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: drone
rules:
- apiGroups:
- ""
resources:
- secrets
verbs:
- create
- delete
- apiGroups:
- ""
resources:
- pods
- pods/log
verbs:
- get
- create
- delete
- list
- watch
- update
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: drone
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: Role
name: drone
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gke-drone-agent
labels:
app: drone
drone: drone-agent
io.kompose.service: drone-agent
spec:
replicas: 1
selector:
matchLabels:
app: drone
drone: drone-agent
io.kompose.service: drone-agent
template:
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels:
app: drone
drone: drone-agent
io.kompose.service: drone-agent
spec:
containers:
- name: runner
image: drone/drone-runner-kube:latest
ports:
- containerPort: 3000
env:
- name: DRONE_RPC_SECRET
value: 824de51510f08498fa770c7798e3cc9e
- name: DRONE_RPC_HOST
value: 14.199.130.26
- name: DRONE_RPC_PROTO
value: "http"
- name: DRONE_RUNNER_CAPACITY
value: "3"
ref.
- KUBERNETES Runner
問題排除
- 首先碰到的問題是,drone沒有反應,先檢查webhook
到專案底下的webhook選項,查看錯誤的訊息
因為GKE的防火牆沒開的關係,導致webhook資料丟不過去。
- drone無法連線到gitlab
本來以為是防火牆的關係,但直接連進去pod裡面,呼叫這個網址是正常的。
後來看到 (2) 的討論,我跟他們狀況一樣,應該也是istio造成的。
原以為是 drone server或 runner,有安裝istio的關係,
還特別寫了
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
來阻止 istio的注入(3)。
後來想了又想,才驚覺,我要取消的應該是整個namespace的istio注入,
因為當新的 pipeline建立時,就已經注入了istio的sidecar,
所以要先讓這個namespace通通不能自動注入,
指定其他的deploy會自動注入。
自動注入的規則,請參考 [[istio sidecar 注入規則]]
-
切換namespace,無法佈署
ref.
1. Gitlab Webhooks
2. Drone CI pipeline first step clone failed: Connection refused
3. 安裝 Sidecar
4. istio -Resource Annotations
0 意見:
張貼留言