.NetCore 配合 Gitlab CI&CD 實踐 - 開篇

TfcYe發表於2020-08-04

引言

這是一個系列的文章,講述的是一箇中小型開發團隊如何從零開始使用搭建基建 GitLab 程式碼託管平臺,以及使用 GitLab Runner 實現 CI/CD 的故事。本系列通過部署一個完整的 .net core 專案來做配合實戰,可能這個案例並不能適合每個人,但希望可以給剛接觸 GitLab 以及 CI/CD 的小夥伴帶來一些啟發。對 GitLab 以及 CI/CD 有一定了解的,可以略過本文,直接開啟下一章。

Gitlab CI&CD 是什麼?

如上官方圖示,可以理解為 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: '<your hostname>'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url "<your gitlab 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'] = "<your qq email>"
        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'] = '<your qq email>'
        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 <your gitlab host 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

使用命令註冊 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 映象倉庫

這個上阿里雲開通一下還是簡單的,就不細講了

結束

好了,到這裡準備工作差不多了,下一篇開始實戰。

相關文章