前言
公司設計的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這個庫,可以解決該問題