Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自動化發布和部署(1)
服務器版本 Ubuntu 16.04 LTS。
本篇博文目的:項目中添加Dockerfile文件,使用 CI 腳本構建自定義鏡像,推送到 Docker 私有倉庫,然后在服務器上拉取鏡像并創建相應容器,最后啟動容器,完成發布和部署。
實現上面目的,大概有三種實現方式:
GitLab Runner 不運行在 Docker 容器中:Executor 選擇shell(本地運行),然后在本服務器上安裝 .NET Core 和 Docker 環境,.gitlab-ci.yml中執行dotnet編譯發布和docker構建發布腳本,將構建的鏡像推送到 Docker 私有倉庫,然后 SSH 連接到服務器,拉取鏡像并創建相應容器,最后啟動容器,完成發布和部署。
GitLab Runner 運行在 Docker 容器中:Executor 選擇shell(GitLab Runner 容器中運行),然后進入 GitLab Runner 容器,在上面安裝 .NET Core 和 Docker 環境,.gitlab-ci.yml中執行dotnet編譯發布和docker構建發布腳本,后面同上操作。
GitLab Runner 運行在 Docker 容器中:Executor 選擇docker(指定鏡像容器中運行),需要自定義構建一個包含 .NET Core 和 Docker 環境的鏡像,構建腳本執行在自定義鏡像容器中,.gitlab-ci.yml中執行dotnet編譯發布和docker構建發布腳本,后面同上操作。
上面三種方式,最簡單的是第一種,第二種和第三種比較類似,實現稍微復雜點,我也沒有配置成功,下面分別說下。
1. GitLab Runner 運行在 Docker 容器中
第二種和第三種實現方式,放在一塊說,如果 Executor 選擇shell,然后我們需要在 GitLab Runner 容器中配置編譯環境,但這樣會產生一個問題,就是如果我們是升級 GitLab Runner 的時候,需要重新配置編譯環境,實際情況是,我進入容器docker exec -it gitlab-runner bash,并沒有安裝成功 .NET Core 和 Docker 環境(各種服務器中沒出現的問題,而且速度非常慢),其實,還有一種方式,就是在.gitlab-ci.yml中執行安裝 .NET Core 和 Docker 環境的腳本(檢查是否安裝),不過,編寫是有些問題,這個我沒進行嘗試。
如果 Executor 選擇docker,其實,這樣會嵌套很多容器,首先服務器上運行 GitLab Runner 容器,然后在此容器內,運行另外一個構建容器,然后在此容器內,執行構建和發布操作,因為 GitLab Runner 在每次構建的時候,會創建和運行一個新的構建容器,所以,我們不能直接在這個容器中,配置 .NET Core 和 Docker 環境,也不能在.gitlab-ci.yml中執行安裝,因為每次都會覆蓋之前的操作,唯一的解決方式,就是自定義構建一個包含 .NET Core 和 Docker 環境的鏡像文件,然后每次構建使用它進行創建對應容器,執行構建和發布腳本即可。
這里說下,自定義構建一個包含 .NET Core 和 Docker 環境的鏡像文件,兩種方式:
docker build -t 139.219.65.81:5000/xishuai-gitlab-ci-build .:在Dockerfile文件編寫安裝環境腳本。
docker commit microsoft-aspnetcore 139.219.65.81:5000/xishuai-gitlab-ci-build:使用一個容器,然后在容器中安裝環境,最后基于這個容器,創建一個自定義鏡像文件
第一種方式,我沒有進行嘗試,第二種方式嘗試了下,我使用microsoft/aspnetcore鏡像作為基礎鏡像(800M 左右),然后在其創建的容器中安裝 Docker 環境,速度非常慢,而且有時候報各種奇怪的錯誤,如果安裝成功了,左右構建的自定義鏡像文件,也非常的大。
這兩種方式,我最后都沒有采用,最后使用的是下面最簡單的方式。
2. GitLab Runner 不運行在 Docker 容器中(Executor 選擇 Shell)
如果我們不使用 Docker 安裝和運行 GitLab Runner,就得手動進行安裝和配置下 GitLab Runner。
安裝命令:
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-linux-amd64然后進行給予其權限:
$ sudo chmod +x /usr/local/bin/gitlab-runner接著就可以進行注冊 GitLab Runner 了,命令:
$ sudo gitlab-runner register示例配置:
配置好之后,我們需要添加一個用于跑 GitLab Runner 的gitlab-runner用戶,命令:
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash然后指定 GitLab Runner 執行的用戶和工作目錄,命令:
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner配置好之后,我們可以從配置文件中,查看相關配置信息:
$ cat /etc/systemd/system/gitlab-runner.service [Unit]Description=GitLab RunnerAfter=syslog.target network.targetConditionFileIsExecutable=/usr/bin/gitlab-ci-multi-runner[Service]StartLimitInterval=5StartLimitBurst=10ExecStart=/usr/bin/gitlab-ci-multi-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "gitlab-runner"Restart=alwaysRestartSec=120[Install]WantedBy=multi-user.target上面工作完成之后,就可以啟動 GitLab Runner 了,命令:
$ sudo gitlab-runner start然后,我們就可以在項目中看到 GitLab Runner 了,示例:
另外,我們還需要做一些其他工作,來保證 GitLab Runner 可以正常運行。
兩臺服務器需要配置的環境:
GitLab Runner 服務器:.NET Core 2.0、Docker、Docker 私有倉庫(或者其他服務器)、SSH
測試服務器:Docker
首先,我們需要創建一個 Docker 私有倉庫,用于存放程序生成的鏡像,這個最好是配置在一個單獨的服務器,配置詳見:Ubuntu Docker Registry 搭建私有倉庫
通過下面兩個連接,查看 Docker 私有倉庫中的鏡像:
http://139.219.69.172:5000/v2/_catalog
http://139.219.69.172:5000/v2/hwapp/tags/list
然后,我們需要把 GitLab Runner 服務器中的gitlab-runner賬戶,添加到docker用戶組中,命令:
$ sudo usermod -aG docker gitlab-runner否則會報如下錯誤:
然后,我們在 GitLab Runner 服務器中,切換到gitlab-runner用戶下,配置 SSH,命令:
$ su gitlab-runner $ ssh-keygen -t rsa -P ''$ ssh-copy-id root@139.219.69.172139.219.69.172是測試服務器的 IP 地址,如果不進行這樣配置,SSH 連接的時候,會報如下錯誤:
原因是,GitLab Runner 在執行腳本的時候,會切換到gitlab-runner用戶下,我們在root賬戶下配置 SSH,是無效的。
以上工作完成之后,GitLab Runner 執行編譯腳本,基本上執行是沒有問題了,我們在示例項目中添加.gitlab-ci.yml配置文件,示例:
stages: ?- build ?- deploy_devbuild_job: ?stage: build ?only: ? ?- master ?script: ? ?- dotnet restore ? ?- dotnet builddeploy_dev_job: ?stage: deploy_dev ?environment: ? ?name: development ?only: ? ?- master ?script:# 發布程序并部署運行 ? ?- dotnet publish -c Release --output bin/publish ? ?- docker build -t $GITLAB_SERVER:5000/hwapp . ? ?- docker push $GITLAB_SERVER:5000/hwapp ? ?- ssh root@$DEPLOY_SERVER_DEV "docker pull $GITLAB_SERVER:5000/hwapp && docker run -d -p 5001:5001 $GITLAB_SERVER:5000/hwapp"build_job執行效果:
deploy_dev_job執行效果:
然后,我們在測試服務器上,就可以看到創建和運行的容器了:
瀏覽器打開http://139.219.110.30:5001/api/values,查看效果:
參考資料:
Manual installation and configuration on GNU/Linux
Registering Runners
Using SSH keys
GitLab CI 自動部署 netcore web api 到 Docker
原文地址:http://www.cnblogs.com/xishuai/p/ubuntu-gitlab-ci-docker-aspnet-core-part-2.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio2017 远程
- 下一篇: ASP.NET Core 运行原理解剖[