日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

發布時間:2024/9/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是CI/CD

持續集成(Continous Intergration,CI)是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都需要通過自動化的編譯、發布、自動化回歸測試來驗證,從而盡快地發現集成錯誤。而這些自動化的操作則由CI軟件進行執行。

持續部署(Continous Delivery,CD)在持續集成的基礎上,將集成后的代碼部署到真實運行環境中(本文指部署到kubernetes集群)。交付團隊 ->版本控制 ->構建和單元測試 ->自動驗收測試 -> 發布

什么是Drone

Drone 是一個基于Docker容器技術的可擴展的持續集成引擎,用于自動化測試、構建、發布。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境并保證隔離。開發者只需在項目中包含 .drone.yml文件,將代碼推送到 git 倉庫,Drone就能夠自動化的進行編譯、測試、發布。

使用drone實現CD/CD

首先來看下丑陋的圖

簡單梳理流程:

1、開發人員向git(gitlab/github/gogs)提交代碼,代碼中必須包含Dockerfile和.drone.yml文件。
2、將代碼commit到遠程倉庫;發布應用時需要填寫服務類型、服務名稱、資源數量、實例個數等信息
3、gogs觸發drone自動構建
4、Drone的CI流水線中包括了自定義腳本,根據準備好的kubernetes的YAML模板,將其中的變量替換成用戶輸入的選項
生成應用的kubernetes YAML配置文件
5、Drone的CI流水線自動編譯代碼并打包成docker鏡像推送到Harbor鏡像倉庫
6、更新DNS,插入一條DNS記錄,IP地址是ingress節點的IP地址。
7、Drone的CI流水線中自定義腳本調用kubernetes的API,部署應用;更新Ingress的配置,根據新部署的應用的名稱,在ingress的配置文件中增加一條路由信息
接下來,開始實戰

部署代碼倉庫gogs

本文使用gogs,當然你可以選擇gitlab,github等代碼倉庫
1、創建gogs.yaml

--- apiVersion: apps/v1 kind: StatefulSet metadata:name: gogslabels:app: gogs spec:serviceName: gogsreplicas: 1selector:matchLabels:app: gogstemplate:metadata:labels:app: gogsspec:terminationGracePeriodSeconds: 180containers:- name: gogsimage: gogs/gogsimagePullPolicy: Alwaysports:- containerPort: 3000name: port- containerPort: 22name: ssh-portvolumeMounts:- name: volumemountPath: /datavolumes:- name: volumeemptyDir: {} --- apiVersion: v1 kind: Service metadata:name: gogslabels:app: gogs spec:type: NodePortports:- port: 3000targetPort: 3000selector:app: gogs

2、執行部署并查看結果

[root@k8s-node001 gogs]# kubectl apply -f gogs.yaml statefulset.apps/gogs created service/gogs created[root@k8s-node001 gogs]# kubectl get po,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/gogs-0 1/1 Running 0 2m2s 100.68.150.197 k8s-node001 <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/gogs NodePort 10.106.102.74 <none> 3000:30526/TCP 2m3s app=gogs

3、瀏覽器打開,并配置gogs,然后就可以登錄gogs了

4、登錄gogs

至此,gogs配置完畢。

Tips:本文的gogs,是測試環境,使用卷類型為:emptyDir,生產環境最好單獨部署或者使用StorageClass保證數據持久可用性

接下來部署drone

部署CI工具Drone

1、編寫drone.yaml文件

--- apiVersion: apps/v1 kind: StatefulSet metadata:name: dronelabels:app: drone spec:serviceName: dronereplicas: 1selector:matchLabels:app: dronetemplate:metadata:labels:app: dronespec:terminationGracePeriodSeconds: 180containers:- name: droneimage: drone/drone:1imagePullPolicy: Alwaysenv:- name: DRONE_AGENTS_ENABLEDvalue: "true"- name: DRONE_GOGS_SERVERvalue: http://192.168.100.181:30526/ # 注意這里填的是gogs的地址- name: DRONE_RPC_SECRETvalue: qawsedrftg- name: DRONE_SERVER_HOSTvalue: drone.company.com- name: DRONE_SERVER_PROTOvalue: httpports:- containerPort: 80name: port- containerPort: 443name: ssl-portvolumeMounts:- name: volumemountPath: /datavolumes:- name: volumeemptyDir: {} --- apiVersion: v1 kind: Service metadata:name: dronelabels:app: drone spec:type: NodePortports:- port: 80targetPort: 80selector:app: drone

2、執行部署并查看結果

[root@k8s-node001 drone]# kubectl apply -f drone.yaml[root@k8s-node001 drone]# kubectl get po,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/drone-0 1/1 Running 0 4m40s 100.68.150.198 k8s-node001 <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/drone NodePort 10.100.77.138 <none> 80:31681/TCP 4m40s app=drone

3、現在就可以用瀏覽器訪問http://192.168.100.181:31681 ,使用gogs的賬號就可以登錄drone了

4、登錄后可以看到,現在并沒有任何項目,后續再gogs新建項目,就能看到了

部署Drone Runner

Runner的作用是詢問Drone Server,然后執行pipeline,更多信息請查看官網
1、編寫drone-runner.yaml

--- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata:namespace: defaultname: drone rules: - apiGroups:- ""resources:- secretsverbs:- create- delete - apiGroups:- ""resources:- pods- pods/logverbs:- get- create- delete- list- watch- update --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:name: dronenamespace: default subjects: - kind: ServiceAccountname: defaultnamespace: default roleRef:kind: Rolename: droneapiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata:name: drone-runnerlabels:app.kubernetes.io/name: drone-runner spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: drone-runnertemplate:metadata:labels:app.kubernetes.io/name: drone-runnerspec:containers:- name: drone-runnerimage: drone/drone-runner-kube:latestports:- containerPort: 3000env:- name: DRONE_RPC_HOSTvalue: 192.168.100.181:31681 # Drone Server地址- name: DRONE_RPC_PROTOvalue: http- name: DRONE_RPC_SECRETvalue: qawsedrftg # Drone Server部署時候填寫的secret

2、執行部署并查看結果

[root@k8s-node001 drone]# kubectl apply -f drone-runner.yaml[root@k8s-node001 drone]# kubectl get po NAME READY STATUS RESTARTS AGE drone-runner-7c64bffb45-dh2dn 1/1 Running 0 11m

至此,實現CI/CD的環境都準備好了,現在來跑一個demo

CI/CD示例

1、gogs新建項目demo

2、drone上點sync,就可以看到demo項目

3、激活demo項目,保存

4、在gogs的demo項目中,添加.drone.yml文件,添加一個pipeline

5、提交代碼,但是不觸發CI,Commit的時候填寫[CI SKIP]就可以跳過觸發CI

如果這里直接Commit提交代碼,就直接觸發CI功能,Drone就開始執行這個pipeline了

[CI SKIP]的作用就是如果需要修改多個文件,這時候會很有用;

當然在實際開發過程中,都是把項目clone到本地,編輯好所有文件,再push到代碼倉庫,這樣就不需要[CI SKIP]了

6、我們這里隨便修改 README,然后知己commit,不是用[CI SKIP]看下效果

7、執行結果,這里失敗了,后面再解決

8、如果您commit以后并沒有觸發Drone,需要在gogs查看webhooks時候正常,如下圖

9、這里我們來解決pipeline執行失敗的問題

我們通過drone界面可以看到項目pipeline報錯如下,顯示runner clone代碼失敗了

Initialized empty Git repository in /drone/src/.git/ + git fetch origin +refs/heads/master: fatal: unable to access 'http://192.168.100.181:3000/scofield/demo.git/': Failed to connect to 192.168.100.181 port 3000: Connection refused

首先看下這個pipeline,很簡單,使用鏡像alpine執行兩條輸出語句

kind: pipeline type: kubernetes name: defaultsteps: - name: greetingimage: alpinecommands:- echo hello- echo world

但是默認情況下,Drone執行pipeline之前會克隆項目,url就是gogs的http地址,這里是http://192.168.100.181:3000/scofield/demo.git 因為我這里測試環境使用NodePort暴露的服務,Drone需要使用http://192.168.100.181:30526/scofield/demo.git 這個地址才能克隆到項目,如果使用ingress暴露gogs服務,這個url就是域名而不是IP,就不會出現這個問題。
那現在需要解決這個問題,我們就自定義clone,修改默認的克隆地址,修改如下,修改完直接commit代碼,觸發CI

通過drone頁面查看結果,可以看到clone成功

而且執行的echo命令也成功執行

至此本文實戰結束

總結

本文是“基于Docker及Kubernetes構建的容器云平臺”系列第十篇,也是最后一篇,如果您看完了整個系列文章,在此感謝。
通過這十篇文章,您應該可以構建出一個測試環境的容器平臺。關于容器云平臺更多內容,后續會繼續分享,盡請持續關注。

PS:后續文章會同步到http://dev.kubeops.net

總結

以上是生活随笔為你收集整理的gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。