.NetCore 配合 Gitlab CI&CD 實踐 - 開篇
阿新 • • 發佈:2020-08-04
### 引言
這是一個系列的文章,講述的是一箇中小型開發團隊如何從零開始使用搭建基建 `GitLab` 程式碼託管平臺,以及使用 `GitLab Runner` 實現 `CI/CD` 的故事。本系列通過部署一個完整的 `.net core` 專案來做配合實戰,可能這個案例並不能適合每個人,但希望可以給剛接觸 `GitLab` 以及 `CI/CD` 的小夥伴帶來一些啟發。對 `GitLab` 以及 `CI/CD` 有一定了解的,可以略過本文,直接開啟下一章。
### Gitlab CI&CD 是什麼?
![](https://img2020.cnblogs.com/blog/1058512/202007/1058512-20200726170533855-1770238985.jpg)
如上官方圖示,可以理解為 Gitlab 給開發者提供了一項功能,在程式碼提交後自動觸發一段開發者自定義的指令碼,以此來完成諸如但不限於構建部署的工作。完成一次專案釋出我們通常需要以下 4 個步驟:
* 編譯
* 測試
* 構建
* 部署
#### 編譯
在編譯階段我們是執行 `dotnet build` 進行包還原以及專案編譯,這裡還可以包含團隊的程式碼風格檢查
#### 測試
測試階段主要跑我們自己寫的單元測試,題外話:測試也挺難寫的
#### 構建
將我們測試通過的專案打包成 docker 映象,上傳到映象倉庫
#### 部署
從映象倉庫上拉取我們映象,部署到叢集上,這裡後面我們使用 `docker-compose` 部署
### 準備工作
我們這裡需要做的事情串起來就是,程式碼提交到 `gitlab`,觸發平臺的 `CI/CD` 任務,開始編譯程式碼,執行測試,打包映象並上傳映象,最後部署應用。
#### 安裝 GitLab
```
version: "3"
services:
gitlab:
image: gitlab/gitlab-ce:13.1.2-ce.0
container_name: 'devops-gitlab'
restart: always
hostname: ''
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url ""
gitlab_rails['gitlab_shell_ssh_port'] = 23
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = ""
gitlab_rails['smtp_password'] = "xCcqh*L4jkqFCS"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = ''
gitlab_rails['smtp_domain'] = "exmail.qq.com"
ports:
- '81:80'
- '443:443'
- '23:22'
volumes:
- '/gitlab/config:/etc/gitlab'
- '/gitlab/logs:/var/log/gitlab'
- '/gitlab/data:/var/opt/gitlab'
logging:
driver: "json-file"
options:
max-size: "20m"
max-file: "10"
```
我這邊使用 docker-compose 來安裝的,替換掉上面的對應的 域名地址 以及 郵箱即可使用。我這裡用的是 QQ 企業郵箱你也可以換成其他的。隨後在配置一下 nginx, 可以通過 80 埠訪問 gitlab。
```
upstream gitlab{
# 域名對應 gitlab配置中的 external_url
# 埠對應 gitlab 配置中的 nginx['listen_port'],通過環境變數可設定
server 192.168.1.42:81;
}
server{
listen 80;
# 此域名是提供給終端使用者的訪問地址
server_name ;
location / {
# 這個大小的設定非常重要,如果 git 版本庫裡面有大檔案,設定的太小,檔案push 會失敗,根據情況調整
client_max_body_size 50m;
proxy_redirect off;
#以下確保 gitlab中專案的 url 是域名而不是 http://git,不可缺少
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 反向代理到 gitlab 內建的 nginx
proxy_pass http://gitlab;
index index.html index.htm;
}
}
```
#### 安裝 GitLab Runner
```
# For Debian/Ubuntu/Mint
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
# For RHEL/CentOS/Fedora
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
```
* 註冊 runner
首先要先獲取gitlab-ci的Token:
> 專案主頁 -> Sttings -> CI/CD -> Runners Expand
![](https://img2020.cnblogs.com/blog/1058512/202007/1058512-20200726214000212-778086077.jpg)
使用命令註冊 gitlab-runner:
```
gitlab-runner register
```
需要按照步驟輸入:
* 輸入 gitlab 的服務URL,就是你 gitlab 的訪問地址
* 輸入 gitlab-ci 的Toekn,獲取方式參考上圖
* 關於整合服務中對於這個 runner 的描述
* 給這個 gitlab-runner 輸入一個標記,這個 tag 非常重要,在後續的使用過程中需要使用這個 tag 來指定 gitlab-runner
* 是否執行在沒有 tag 的 build 上面。在配置 gitlab-ci 的時候,會有很多 job,每個job可以通過tags屬性來選擇runner。這裡為true表示如果job沒有配置tags,也執行
* 是否鎖定 runner 到當前專案
* 選擇執行器,gitlab-runner 實現了很多執行器,可用在不同場景中執行構建,詳情可見 GitLab Runner Executors,這裡選用 Shell 模式
重複執行兩次,分別選擇 `shell` 模式以及 `docker` 模式
重新整理頁面就可以看到新增的一個Runner:
* 開通阿里雲 docker 映象倉庫
這個上阿里雲開通一下還是簡單的,就不細講了
### 結束
好了,到這裡準備工作差不多了,下一篇開始實戰。