文章出處

上一篇: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,查看效果:

參考資料:


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()