文章簡介
-
gitlab & gitlab-runner 簡介
-
基於gitlab & gitlab-runner 的asp.net core webapi 極簡持續集成實踐
gitlab & gitlab-runner 簡介
寫在最前面,文中示例使用到了docker & docker-compose 相關知識,文中的gitlab server 以及 gitlab-runner都是使用docker容器,以及gitlab-runner的執行方式也是docker模式,相關內容不再贅述,但是注意點會在文中標注。
gitlab是一款基於git的代碼管理平台, 可以基於此做代碼管理,以及相關CI-CD操作。gitlab-runner是一個代碼持續集成工具,將其注冊至gitlab后可以基於此做相關的CI-CD。
持續集成流程大致分為三步,1)本地用戶將代碼上傳至gitlab倉庫 2)gitlab-runner接收代碼推送事件,從gitlab拉取相關代碼(需要將runner注冊至gitlab&將創建項目委托給runner) 3)runner執行自動集成腳本(.gitlab.ci.yml),編譯發布服務。如圖所示=》
文檔傳送門=>gitlab https://docs.gitlab.com/ee/README.html gitlab-runner https://docs.gitlab.com/runner/
極簡實踐
- 從dockerhub下載gitlab & gitlab-runner 鏡像
docker pull gitlab/gitlab-ce & docker pull gitlab/gitlab-runner
- 創建gitlab & gitlab-runner容器
docker run -d --hostname localhost -p 10080:80 -p 10443:443 --name gitlab -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-ce:latest
docker run -d --name gitlab-runner --link gitlab -v /var/run/docker.sock:/var/run/docker.sock --restart always gitlab/gitlab-runner:latest -- 這里注意下,runner啟動容器時候需要-v
/var/run/docker.sock:/var/run/docker.sock命令將本地的docker服務套接在runner容器上(直白點就是runner容器可以使用本機docker服務) ;--link將runner容器鏈接到gitlab容器 - 等gitlab啟動幾分鍾,此時我們可以看到現在有兩個正在運行的容器
- 接下來訪問我們本機的10080端口就可以訪問到我們的gitlab了,第一次進入需要初始化密碼。順便我們現在再創建一個叫做tony的用戶。登錄后,是這樣的一個界面=》
-
接下來,我們注冊gitlab-runner。 注冊的目的是將gitlab-runner 與 gitlab綁定起來。回到我們的powershell(命令行)界面,執行命令。我們依次需要填寫我們的gitlab地址,服務token,描述信息,tag標簽(runner會根據tag標簽來決定自動編譯項目的推送也可以修改runner配置執行所有推送),runner執行模式(這里我們選docker),以及默認鏡像。gitlab地址和token我們需要以管理員身份進入gitlab服務,選擇Overview的Runners菜單查看。這里注意,gitlab地址不可以寫localhost,會導致runner找不到gitlab(每一個docker容器相當於獨立的服務器)
docker exec -it gitlab-runner gitlab-runner register
-
runner注冊成功后,我們進入gitlab的的runner頁面會出現我們注冊的runner;此時我們切換tony用戶,創建一個項目(我這里的mywebsite);回到root用戶,將runner分配給這個項目(同時把不需要tag就可以執行編譯的選項選上);這時候,我們的mywebsite項目就托管在了注冊的runner上了。
-
-
然后我們創建一個asp.net core v2.2的webapi項目,並為其編寫dockerfile ,容器編排我們使用docker-compose的方式。主要文件內容
1 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 as build-env 2 # code目錄 3 WORKDIR /code 4 5 #項目拷貝至code 6 COPY *.csproj ./ 7 RUN dotnet restore 8 9 # #代碼拷貝至code 10 COPY . ./ 11 # #發布文件在code/out文件夾 12 RUN dotnet publish -c Release -o out 13 # #找到runtime 14 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 15 # #新建一個目錄app 16 WORKDIR /app 17 # #code目錄發布的代碼文件放到app 18 COPY --from=build-env /code/out ./ 19 # 輸出到80端口 20 EXPOSE 80 21 ENTRYPOINT [ "dotnet","tonywebsite.dll" ]
1 version: '3' 2 services: 3 web: 4 build: . 5 container_name: 'aspnetcore' 6 ports: 7 - '8003:80'
-
然后編寫自動集成腳本
1 build-master: 2 image: docker:19.03.2 3 stage: build 4 5 script: 6 - docker --version 7 8 image: 9 name: docker/compose:1.24.1 #添加docker-compose,使用docker-compose編排鏡像 10 entrypoint: ["/bin/sh", "-c"] 11 12 rtest: 13 script: 14 - docker-compose --version 15 - docker-compose up -d --build --force-recreate
-
此時我們把我們的項目推送至我們的gitlab服務器,就會開始自動構建了;jobs可以看到相關日志
-
我們訪問到我們的8003端口,可以看到控制器返回的內容
-
接下來,我們修改下返回內容,提交至git服務器
-
-
此時,我們再次訪問我們的8003端口可以看到,我們的修改已生效=》
最后寫下注意事項:
- 我們的一整套操作都是基於Docker容器,包括服務的打包,以及交互,大家生產環境使用時候,
- 注意掛載下資料卷;runner是根據tag來編輯提交的代碼,假如想讓runner編譯所有的提交,注意在runner配置中選擇不設置tag也編譯
- runner注冊至gitlab時候,輸入地址注意
也是剛開始了解Gitlab & gitlab-runner的ci 以及pipeline解決方案,假如文中有寫錯的地方歡迎大家批評指正。第一篇僅限極簡的把CI服務搭建起來,並沒有涉及優化點,以及原理性的知識,敬請期待。。
