Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自動(dòng)化發(fā)布和部署(1)
服務(wù)器版本 Ubuntu 16.04 LTS。
本篇博文目的:項(xiàng)目中添加Dockerfile文件,使用 CI 腳本構(gòu)建自定義鏡像,推送到 Docker 私有倉(cāng)庫(kù),然后在服務(wù)器上拉取鏡像并創(chuàng)建相應(yīng)容器,最后啟動(dòng)容器,完成發(fā)布和部署。
實(shí)現(xiàn)上面目的,大概有三種實(shí)現(xiàn)方式:
GitLab Runner 不運(yùn)行在 Docker 容器中:Executor 選擇shell(本地運(yùn)行),然后在本服務(wù)器上安裝 .NET Core 和 Docker 環(huán)境,.gitlab-ci.yml中執(zhí)行dotnet編譯發(fā)布和docker構(gòu)建發(fā)布腳本,將構(gòu)建的鏡像推送到 Docker 私有倉(cāng)庫(kù),然后 SSH 連接到服務(wù)器,拉取鏡像并創(chuàng)建相應(yīng)容器,最后啟動(dòng)容器,完成發(fā)布和部署。
GitLab Runner 運(yùn)行在 Docker 容器中:Executor 選擇shell(GitLab Runner 容器中運(yùn)行),然后進(jìn)入 GitLab Runner 容器,在上面安裝 .NET Core 和 Docker 環(huán)境,.gitlab-ci.yml中執(zhí)行dotnet編譯發(fā)布和docker構(gòu)建發(fā)布腳本,后面同上操作。
GitLab Runner 運(yùn)行在 Docker 容器中:Executor 選擇docker(指定鏡像容器中運(yùn)行),需要自定義構(gòu)建一個(gè)包含 .NET Core 和 Docker 環(huán)境的鏡像,構(gòu)建腳本執(zhí)行在自定義鏡像容器中,.gitlab-ci.yml中執(zhí)行dotnet編譯發(fā)布和docker構(gòu)建發(fā)布腳本,后面同上操作。
上面三種方式,最簡(jiǎn)單的是第一種,第二種和第三種比較類似,實(shí)現(xiàn)稍微復(fù)雜點(diǎn),我也沒(méi)有配置成功,下面分別說(shuō)下。
1. GitLab Runner 運(yùn)行在 Docker 容器中
第二種和第三種實(shí)現(xiàn)方式,放在一塊說(shuō),如果 Executor 選擇shell,然后我們需要在 GitLab Runner 容器中配置編譯環(huán)境,但這樣會(huì)產(chǎn)生一個(gè)問(wèn)題,就是如果我們是升級(jí) GitLab Runner 的時(shí)候,需要重新配置編譯環(huán)境,實(shí)際情況是,我進(jìn)入容器docker exec -it gitlab-runner bash,并沒(méi)有安裝成功 .NET Core 和 Docker 環(huán)境(各種服務(wù)器中沒(méi)出現(xiàn)的問(wèn)題,而且速度非常慢),其實(shí),還有一種方式,就是在.gitlab-ci.yml中執(zhí)行安裝 .NET Core 和 Docker 環(huán)境的腳本(檢查是否安裝),不過(guò),編寫是有些問(wèn)題,這個(gè)我沒(méi)進(jìn)行嘗試。
如果 Executor 選擇docker,其實(shí),這樣會(huì)嵌套很多容器,首先服務(wù)器上運(yùn)行 GitLab Runner 容器,然后在此容器內(nèi),運(yùn)行另外一個(gè)構(gòu)建容器,然后在此容器內(nèi),執(zhí)行構(gòu)建和發(fā)布操作,因?yàn)?GitLab Runner 在每次構(gòu)建的時(shí)候,會(huì)創(chuàng)建和運(yùn)行一個(gè)新的構(gòu)建容器,所以,我們不能直接在這個(gè)容器中,配置 .NET Core 和 Docker 環(huán)境,也不能在.gitlab-ci.yml中執(zhí)行安裝,因?yàn)槊看味紩?huì)覆蓋之前的操作,唯一的解決方式,就是自定義構(gòu)建一個(gè)包含 .NET Core 和 Docker 環(huán)境的鏡像文件,然后每次構(gòu)建使用它進(jìn)行創(chuàng)建對(duì)應(yīng)容器,執(zhí)行構(gòu)建和發(fā)布腳本即可。
這里說(shuō)下,自定義構(gòu)建一個(gè)包含 .NET Core 和 Docker 環(huán)境的鏡像文件,兩種方式:
docker build -t 139.219.65.81:5000/xishuai-gitlab-ci-build .:在Dockerfile文件編寫安裝環(huán)境腳本。
docker commit microsoft-aspnetcore 139.219.65.81:5000/xishuai-gitlab-ci-build:使用一個(gè)容器,然后在容器中安裝環(huán)境,最后基于這個(gè)容器,創(chuàng)建一個(gè)自定義鏡像文件
第一種方式,我沒(méi)有進(jìn)行嘗試,第二種方式嘗試了下,我使用microsoft/aspnetcore鏡像作為基礎(chǔ)鏡像(800M 左右),然后在其創(chuàng)建的容器中安裝 Docker 環(huán)境,速度非常慢,而且有時(shí)候報(bào)各種奇怪的錯(cuò)誤,如果安裝成功了,左右構(gòu)建的自定義鏡像文件,也非常的大。
這兩種方式,我最后都沒(méi)有采用,最后使用的是下面最簡(jiǎn)單的方式。
2. GitLab Runner 不運(yùn)行在 Docker 容器中(Executor 選擇 Shell)
如果我們不使用 Docker 安裝和運(yùn)行 GitLab Runner,就得手動(dòng)進(jìn)行安裝和配置下 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然后進(jìn)行給予其權(quán)限:
$ sudo chmod +x /usr/local/bin/gitlab-runner接著就可以進(jìn)行注冊(cè) GitLab Runner 了,命令:
$ sudo gitlab-runner register示例配置:
配置好之后,我們需要添加一個(gè)用于跑 GitLab Runner 的gitlab-runner用戶,命令:
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash然后指定 GitLab Runner 執(zhí)行的用戶和工作目錄,命令:
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner配置好之后,我們可以從配置文件中,查看相關(guān)配置信息:
$ 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上面工作完成之后,就可以啟動(dòng) GitLab Runner 了,命令:
$ sudo gitlab-runner start然后,我們就可以在項(xiàng)目中看到 GitLab Runner 了,示例:
另外,我們還需要做一些其他工作,來(lái)保證 GitLab Runner 可以正常運(yùn)行。
兩臺(tái)服務(wù)器需要配置的環(huán)境:
GitLab Runner 服務(wù)器:.NET Core 2.0、Docker、Docker 私有倉(cāng)庫(kù)(或者其他服務(wù)器)、SSH
測(cè)試服務(wù)器:Docker
首先,我們需要?jiǎng)?chuàng)建一個(gè) Docker 私有倉(cāng)庫(kù),用于存放程序生成的鏡像,這個(gè)最好是配置在一個(gè)單獨(dú)的服務(wù)器,配置詳見(jiàn):Ubuntu Docker Registry 搭建私有倉(cāng)庫(kù)
通過(guò)下面兩個(gè)連接,查看 Docker 私有倉(cāng)庫(kù)中的鏡像:
http://139.219.69.172:5000/v2/_catalog
http://139.219.69.172:5000/v2/hwapp/tags/list
然后,我們需要把 GitLab Runner 服務(wù)器中的gitlab-runner賬戶,添加到docker用戶組中,命令:
$ sudo usermod -aG docker gitlab-runner否則會(huì)報(bào)如下錯(cuò)誤:
然后,我們?cè)?GitLab Runner 服務(wù)器中,切換到gitlab-runner用戶下,配置 SSH,命令:
$ su gitlab-runner $ ssh-keygen -t rsa -P ''$ ssh-copy-id root@139.219.69.172139.219.69.172是測(cè)試服務(wù)器的 IP 地址,如果不進(jìn)行這樣配置,SSH 連接的時(shí)候,會(huì)報(bào)如下錯(cuò)誤:
原因是,GitLab Runner 在執(zhí)行腳本的時(shí)候,會(huì)切換到gitlab-runner用戶下,我們?cè)趓oot賬戶下配置 SSH,是無(wú)效的。
以上工作完成之后,GitLab Runner 執(zhí)行編譯腳本,基本上執(zhí)行是沒(méi)有問(wèn)題了,我們?cè)谑纠?xiàng)目中添加.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:# 發(fā)布程序并部署運(yùn)行 ? ?- 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執(zhí)行效果:
deploy_dev_job執(zhí)行效果:
然后,我們?cè)跍y(cè)試服務(wù)器上,就可以看到創(chuàng)建和運(yùn)行的容器了:
瀏覽器打開(kāi)http://139.219.110.30:5001/api/values,查看效果:
參考資料:
Manual installation and configuration on GNU/Linux
Registering Runners
Using SSH keys
GitLab CI 自動(dòng)部署 netcore web api 到 Docker
原文地址:http://www.cnblogs.com/xishuai/p/ubuntu-gitlab-ci-docker-aspnet-core-part-2.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Visual Studio2017 远程
- 下一篇: ASP.NET Core 运行原理解剖[