設計一個簡單的devops系統


前言


公司設計的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相對地址,然后執行構建步驟,構建腳本如下

  1. 登錄docker私有倉庫,這里是bp的阿里雲的docker倉庫,后文會講如何bp
  2. 定義鏡像版本號,這里直接取gitlab-ci內置的流水線編號作為版本號,gitlab-ci內置了很多環境變量,可以查閱文檔
  3. 構建鏡像
  4. 鏡像打標簽
  5. 推送到阿里雲docker倉庫
  6. 清理未使用且包含tibos標簽的鏡像

5.敏感信息,使用ci的變量進行保護

6.bp阿里雲鏡像倉庫

先創建一個名稱空間,然后根據自己的項目名稱創建對應的倉庫即可,也可以把外網的一些鏡像打個標簽,推送到自己的鏡像倉庫,這樣從自己的鏡像倉庫拉取,速度會快很多

在鏡像版本里查看自己推送的鏡像,這些都是gitlab-ci 構建成功,推送過來的

7.注冊runner

我這里是創建的團隊runner,這樣團隊項目可以共享該runner,注冊好后編輯runner,勾選運行未標記的作業,怎么注冊gitlab-runner網上有很詳細的教程,這里就不多贅述了

gitlab-runner job如下,可以看到.net core 構建還是挺快的
image

  • 做到這里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這個庫,可以解決該問題

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM