上一篇: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 Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/bin/gitlab-ci-multi-runner
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/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=always
RestartSec=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 私有倉庫中的鏡像:
然后,我們需要把 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.172
139.219.69.172
是測試服務器的 IP 地址,如果不進行這樣配置,SSH 連接的時候,會報如下錯誤:
原因是,GitLab Runner 在執行腳本的時候,會切換到gitlab-runner
用戶下,我們在root
賬戶下配置 SSH,是無效的。
以上工作完成之后,GitLab Runner 執行編譯腳本,基本上執行是沒有問題了,我們在示例項目中添加.gitlab-ci.yml
配置文件,示例:
stages:
- build
- deploy_dev
build_job:
stage: build
only:
- master
script:
- dotnet restore
- dotnet build
deploy_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
,查看效果:
參考資料:
文章列表