gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD
持續(xù)集成(Continous Intergration,CI)是一種軟件開發(fā)實(shí)踐,即團(tuán)隊開發(fā)成員經(jīng)常集成它們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發(fā)生多次集成。每次集成都需要通過自動化的編譯、發(fā)布、自動化回歸測試來驗(yàn)證,從而盡快地發(fā)現(xiàn)集成錯誤。而這些自動化的操作則由CI軟件進(jìn)行執(zhí)行。
持續(xù)部署(Continous Delivery,CD)在持續(xù)集成的基礎(chǔ)上,將集成后的代碼部署到真實(shí)運(yùn)行環(huán)境中(本文指部署到kubernetes集群)。交付團(tuán)隊 ->版本控制 ->構(gòu)建和單元測試 ->自動驗(yàn)收測試 -> 發(fā)布
什么是Drone
Drone 是一個基于Docker容器技術(shù)的可擴(kuò)展的持續(xù)集成引擎,用于自動化測試、構(gòu)建、發(fā)布。每個構(gòu)建都在一個臨時的Docker容器中執(zhí)行,使開發(fā)人員能夠完全控制其構(gòu)建環(huán)境并保證隔離。開發(fā)者只需在項目中包含 .drone.yml文件,將代碼推送到 git 倉庫,Drone就能夠自動化的進(jìn)行編譯、測試、發(fā)布。
使用drone實(shí)現(xiàn)CD/CD
首先來看下丑陋的圖
簡單梳理流程:
1、開發(fā)人員向git(gitlab/github/gogs)提交代碼,代碼中必須包含Dockerfile和.drone.yml文件。
2、將代碼commit到遠(yuǎn)程倉庫;發(fā)布應(yīng)用時需要填寫服務(wù)類型、服務(wù)名稱、資源數(shù)量、實(shí)例個數(shù)等信息
3、gogs觸發(fā)drone自動構(gòu)建
4、Drone的CI流水線中包括了自定義腳本,根據(jù)準(zhǔn)備好的kubernetes的YAML模板,將其中的變量替換成用戶輸入的選項
生成應(yīng)用的kubernetes YAML配置文件
5、Drone的CI流水線自動編譯代碼并打包成docker鏡像推送到Harbor鏡像倉庫
6、更新DNS,插入一條DNS記錄,IP地址是ingress節(jié)點(diǎn)的IP地址。
7、Drone的CI流水線中自定義腳本調(diào)用kubernetes的API,部署應(yīng)用;更新Ingress的配置,根據(jù)新部署的應(yīng)用的名稱,在ingress的配置文件中增加一條路由信息
接下來,開始實(shí)戰(zhàn)
部署代碼倉庫gogs
本文使用gogs,當(dāng)然你可以選擇gitlab,github等代碼倉庫
1、創(chuàng)建gogs.yaml
2、執(zhí)行部署并查看結(jié)果
[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=gogs3、瀏覽器打開,并配置gogs,然后就可以登錄gogs了
4、登錄gogs
至此,gogs配置完畢。
Tips:本文的gogs,是測試環(huán)境,使用卷類型為:emptyDir,生產(chǎn)環(huán)境最好單獨(dú)部署或者使用StorageClass保證數(shù)據(jù)持久可用性
接下來部署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: drone2、執(zhí)行部署并查看結(jié)果
[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=drone3、現(xiàn)在就可以用瀏覽器訪問http://192.168.100.181:31681 ,使用gogs的賬號就可以登錄drone了
4、登錄后可以看到,現(xiàn)在并沒有任何項目,后續(xù)再gogs新建項目,就能看到了
部署Drone Runner
Runner的作用是詢問Drone Server,然后執(zhí)行pipeline,更多信息請查看官網(wǎng)
1、編寫drone-runner.yaml
2、執(zhí)行部署并查看結(jié)果
[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至此,實(shí)現(xiàn)CI/CD的環(huán)境都準(zhǔn)備好了,現(xiàn)在來跑一個demo
CI/CD示例
1、gogs新建項目demo
2、drone上點(diǎn)sync,就可以看到demo項目
3、激活demo項目,保存
4、在gogs的demo項目中,添加.drone.yml文件,添加一個pipeline
5、提交代碼,但是不觸發(fā)CI,Commit的時候填寫[CI SKIP]就可以跳過觸發(fā)CI
如果這里直接Commit提交代碼,就直接觸發(fā)CI功能,Drone就開始執(zhí)行這個pipeline了
[CI SKIP]的作用就是如果需要修改多個文件,這時候會很有用;
當(dāng)然在實(shí)際開發(fā)過程中,都是把項目clone到本地,編輯好所有文件,再push到代碼倉庫,這樣就不需要[CI SKIP]了
6、我們這里隨便修改 README,然后知己commit,不是用[CI SKIP]看下效果
7、執(zhí)行結(jié)果,這里失敗了,后面再解決
8、如果您commit以后并沒有觸發(fā)Drone,需要在gogs查看webhooks時候正常,如下圖
9、這里我們來解決pipeline執(zhí)行失敗的問題
我們通過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執(zhí)行兩條輸出語句
kind: pipeline type: kubernetes name: defaultsteps: - name: greetingimage: alpinecommands:- echo hello- echo world但是默認(rèn)情況下,Drone執(zhí)行pipeline之前會克隆項目,url就是gogs的http地址,這里是http://192.168.100.181:3000/scofield/demo.git 因?yàn)槲疫@里測試環(huán)境使用NodePort暴露的服務(wù),Drone需要使用http://192.168.100.181:30526/scofield/demo.git 這個地址才能克隆到項目,如果使用ingress暴露gogs服務(wù),這個url就是域名而不是IP,就不會出現(xiàn)這個問題。
那現(xiàn)在需要解決這個問題,我們就自定義clone,修改默認(rèn)的克隆地址,修改如下,修改完直接commit代碼,觸發(fā)CI
通過drone頁面查看結(jié)果,可以看到clone成功
而且執(zhí)行的echo命令也成功執(zhí)行
至此本文實(shí)戰(zhàn)結(jié)束
總結(jié)
本文是“基于Docker及Kubernetes構(gòu)建的容器云平臺”系列第十篇,也是最后一篇,如果您看完了整個系列文章,在此感謝。
通過這十篇文章,您應(yīng)該可以構(gòu)建出一個測試環(huán)境的容器平臺。關(guān)于容器云平臺更多內(nèi)容,后續(xù)會繼續(xù)分享,盡請持續(xù)關(guān)注。
PS:后續(xù)文章會同步到http://dev.kubeops.net
總結(jié)
以上是生活随笔為你收集整理的gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器手六维坐标怎么定义_工业机器人十万个
- 下一篇: 64位cad commondialog添