前言
公司設計的RDMS挺好用的,我也照貓畫虎簡單的設計一個DevOps系統,與大家分享,不足之處歡迎拍磚,以免誤人子弟
前置條件
gitlab
gitlab-runner
k8s
1. gitlab創建群組
創建群組的好處是,對項目進行分組,群組內的資源可以共享,這里創建了一個tibos的群組
2. 在群組創建一個項目
這里創建一個空白項目,項目名為Gourd.Test,將項目克隆到本地,然后在該目錄下創建一個.net core3.1的webapi項目,並推送到gitlab
3.編寫dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
LABEL applabel=tibos
FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.sdk:3.1 AS build
WORKDIR ../Gourd.Test
COPY . .
WORKDIR "/Gourd.Test"
RUN dotnet publish "Gourd.Test.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=build /app .
RUN rm -rf appsettings.Development.json
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["dotnet", "Gourd.Test.dll","-b","0.0.0.0"]
這里給鏡像加了一個標簽(LABEL applabel=tibos),方便清理
4.編寫 gitlab-ci.yml
variables:
PROJECT_NAME: gourd.test
WEBAPI_DOCKERFILE_PATH: ./Gourd.Test/dockerfile
stages:
- build
- deploy
build:
stage: build
script:
- echo "登錄私有倉庫"
- docker login --username=${DOCKER_REPOSTORY_USERNAME} -p ${DOCKER_REPOSTORY_PASSPORD} ${DOCKER_REPOSTORY_ADDRESSURL}
- imageversion=$CI_PIPELINE_ID
- echo "開始構建鏡像:${PROJECT_NAME}.${imageversion}"
- docker build -t ${PROJECT_NAME}.${imageversion} .
- echo "打標簽:${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}"
- docker tag ${PROJECT_NAME}.${imageversion} ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
- echo "推送到中央倉庫"
- docker push ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
- echo "清理未使用的鏡像"
- docker image prune -a -f --filter="label=applabel=tibos"
- docker rmi $(docker images | grep "none" | awk '{print $3}')
only:
- main
白話文翻譯ci配置
定義了兩個變量,項目名稱與dockerfile相對地址,然后執行構建步驟,構建腳本如下
- 登錄docker私有倉庫,這里是bp的阿里雲的docker倉庫,后文會講如何bp
- 定義鏡像版本號,這里直接取gitlab-ci內置的流水線編號作為版本號,gitlab-ci內置了很多環境變量,可以查閱文檔
- 構建鏡像
- 鏡像打標簽
- 推送到阿里雲docker倉庫
- 清理未使用且包含tibos標簽的鏡像
5.敏感信息,使用ci的變量進行保護
6.bp阿里雲鏡像倉庫
先創建一個名稱空間,然后根據自己的項目名稱創建對應的倉庫即可,也可以把外網的一些鏡像打個標簽,推送到自己的鏡像倉庫,這樣從自己的鏡像倉庫拉取,速度會快很多
在鏡像版本里查看自己推送的鏡像,這些都是gitlab-ci 構建成功,推送過來的
7.注冊runner
我這里是創建的團隊runner,這樣團隊項目可以共享該runner,注冊好后編輯runner,勾選運行未標記的作業,怎么注冊gitlab-runner網上有很詳細的教程,這里就不多贅述了
gitlab-runner job如下,可以看到.net core 構建還是挺快的
- 做到這里ci部分就完成了,當我們提交代碼的時候,會自動觸發gitlab-ci,然后docker構建,並推送到鏡像倉庫,接下來是cd 部分
8.開啟gitlab webhooks功能,將事件消息推送給指定的服務
這里寫一個服務,用來接收gitlb webhooks 通過post發送的http請求,下面有它的發送記錄,方便我們查找問題,我們根據請求詳情,通過vs輔助功能把json一鍵轉換成實體,作為vo,並把數據持久化到數據庫,它的狀態變化為 created->pending->running->success,可以根據自己的業務進行定制
9.發布到k8s
發布到k8s有兩種途徑,1.通過k8s代理,直接調用k8s api, 2.通過shell直接執行k8s命令, 這個根據自己的業務來定制,我這里采用了shell的方式,因為簡單方便
- k8s api如下
10. netcore 使用supversior托管后,無法執行shell的問題
去官網轉了一圈,沒找到有用信息,大概意思是子進程下無法獲取宿主全部環境,僅僅是拷貝幾個環境到子流程環境,所以導致shell無法執行........ 換成pm2來托管程序,可以正常執行shell
能執行shell那就好辦了,基本上可以通過shell完成所有k8s功能, 比如 發布,回滾,擴容,修改配置,查詢容器日志.......
11. 設置部署環境
我們可以根據項目分支或者tag來對應不同的環境,如develop,test,pre,prod..... 比如pre環境只能發布master分支的構建記錄
12. 通過網頁顯示容器日志
通過k8s api 或者shell 都可以查詢日志, linux服務端日志一般采用ANSI編碼,部分內容展示會出現亂碼,這里我們用ansi_up.js這個庫,可以解決該問題