GitLab私有化部署

2022-10-10 18:01:22

預期目標

原始碼管理

藉助GitLab實現原始碼託管,私有化部署版本,建立專案,建立使用者組,分配許可權,專案的簽入/牽出等。

自動化部署

原始碼產生變更時(如簽入),自動化編譯並行布到指定伺服器中部署,藉助GitLab-runner實現持續交付部署,供使用者存取專案新版,這裡用在開發環境。

 

環境說明

硬體基本要求:4核4G
RHEL8 Linux operating system:這裡用官網提到的 AlamLinux8(安裝GitLab時,系統的 /boot 需要有1GB以上的空間)
GitLab:用於原始碼管理
Git:用於遠端自動拉取原始碼
GitLab-runner:用於實現自動化部署的範例
dotnet 6.0:測試站點的執行環境

 

環境安裝

最主要的兩個安裝 GitLab、GitLab-runner 通常會分開部署,這裡計劃所有的安裝均在同一臺伺服器中。

AlmaLinux8.6 operating system 安裝

AlmaLinux官網:https://almalinux.org
GitLab的安裝包有800+MB,在安裝GitLab時,遇到系統boot分割區空間不足的現象,這裡需要將系統的 /boot 分割區調整為1GB以上的空間。
下圖為安裝Linux時的分割區設定。

或者用其它方式解決,這裡選擇調整分割區。

 

GitLab 安裝

參考官方提供的安裝要求 https://gitlab.cn/install/

安裝前提

關於防火牆,需要開啟 HTTP、HTTPS 和 SSH 存取。通常Linux都會預設安裝了SSH等常用工具。
(可選) 如果您打算僅從本地網路存取極狐GitLab,則可以跳過它。

# OpenSSH 的安裝
dnf install -y curl policycoreutils openssh-server openssh-clients
# 開啟開機自啟動
systemctl enable sshd
# 啟動 OpenSSH 服務
systemctl start sshd
#
# 設定永久開啟防火牆 http、https
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 設定生效
systemctl reload firewalld

(可選) GitLab 通過 Postfix 傳送電子郵件通知,或者跳過此步驟使用其他解決方案傳送電子郵件。

# Postfix 的安裝
dnf install postfix
# 開啟開機自啟動
systemctl enable postfix
# 啟動 Postfix 服務
systemctl start postfix

下載/安裝 GitLab,設定 GitLab 軟體源映象

先下載 GitLab 映象倉庫

curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash

GitLab 映象庫下載完成後的說明:
1、映象庫檔案 gitlab-jh.repo 儲存於 /etc/yum.repos.d/ 目錄中
2、生成 gitlab-jh 映象的快取
3、再安裝 gitlab-jh
如下圖所示:

安裝 GitLab 應用到系統

# 按照上一步的說明
# 先建立映象快取(不是必須,為了後續的快速安裝)
dnf clean all && dnf makecache
# 再安裝 GitLab 應用到系統,並繫結存取地址
sudo EXTERNAL_URL="http://{所在伺服器IP或域名}" dnf install -y gitlab-jh
# 以上僅用 http 的方式,不用 https 方式。

登入到 GitLab 頁面

# 安裝成功後,首次登陸自動生成的密碼存放於:/etc/gitlab/initial_root_password 中(只有24H的保留期限)
# 檢視密碼
cat /etc/gitlab/initial_root_password
#
# 在瀏覽器中開啟存取地址(安裝時設定的 http://{所在伺服器IP或域名})
# 啟動慢,出現502,需要耐心等待幾分鐘
#
# 然後使用預設管理員賬號 root 和查詢到的初始密碼 進行登入

 

在 GitLab 中建立專案

為後續的測試效果,這裡建立名為 my-project-test 的測試專案,登入頁註冊使用者,管理員後臺稽核通過,為測試專案新增成員,設定專案成員的相應許可權。這裡成員設定為 Maintainer 角色。
或建立使用者組,把使用者組賦予專案,並賦予相應許可權。

本地編寫原始碼,實現檔案屬性時間的讀取功能,並簽入到 GitLab 建立的 my-project-test 測試專案中。如下圖所示:

到此,通過 GitLab 中提供的功能,實現了原始碼的託管。

 

GitLab-runner 安裝

這裡 GitLab-runner 主要時通過 GitLab 的專案中 CI/CD 自定義的流水線步驟,來完成自動化部署的任務。
依據官網安裝說明:https://docs.gitlab.com/runner/install/linux-manually.html

# 按官網的方式,做以下步驟:
#
# 下載安裝包到指定目錄
curl -L --output /usr/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
# 授予安裝包可執行的許可權
chmod +x /usr/bin/gitlab-runner
# 建立 GitLab-runner 的執行賬號
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# 用指定賬號安裝 gitlab-runner
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
# gitlab-runner 服務管理
gitlab-runner start		# 啟動
gitlab-runner stop		# 停止

 

註冊 GitLab-runner

首先檢視在GitLab頁面的 選單 > 設定 > CI/CD > Runner 中提到的內容。如下圖所示:

接下來開始註冊 GitLab-runner:

# 按照官網的描述,註冊完成後,才可以使用GitLab-runner的範例
# 啟動後的註冊命令,註冊過程中,需要按提示填寫幾項內容
gitlab-runner register

註冊過程中,填寫的內容如下圖所示:

註冊完成後,Runner 區域會多出一個 [可用的指定runner範例]。

 

設定 GitLab-runner

對 [可用的指定runner] 做一個簡單的設定,這裡設定自動部署的觸發條件,以執行 CI/CD 中的流水線。如下圖所示:

以上場景:當有新的簽入變更時,觸發 CI/CD 中流水線的執行。

 

Git 安裝

在自動化部署時,這裡計劃用 Git 工具來遠端拉取原始碼,以便於後續的編譯釋出動作。

dnf install git -y

 

dotnet 環境

自動部署時,需要編譯釋出過程,所以這裡安裝 dotnet-sdk
微軟官方提供的映象站:https://packages.microsoft.com/config/

# 首先安裝微軟映象庫,以便於從微軟映象站中安裝所需的 dotnet-sdk 等
# 這裡選用與環境適配的軟體庫 RHEL8版 下載到 /etc/yum.repos.d/ 中
curl -O /etc/yum.repos.d/ https://packages.microsoft.com/config/rhel/8/prod.repo
# 重建映象庫快取
dnf clean packages && dnf clean all && dnf makecache
#
# 先安裝執行 dotnet 時必要的 libicu 工具
dnf install libicu -y
# 安裝適合於開發環境的 dotnet-sdk-6.0(SDK版支援測試、編譯、釋出、執行等)
dnf install dotnet-sdk-6.0 -y

 

自動化部署設定

首先自定義一個存放部署檔案的目錄,假設建立 /opt/gitlab-devops-app 作為部署的目錄。

# 安裝 gitlab-runner 時,已經建立了名為 gitlab-runner 的使用者名稱
# 後續會用 gitlab-runner 在此做拉取原始碼、編譯、釋出等動作
# 這裡授予 gitlab-runner 的所屬使用者對部署資料夾的操作許可權
# 賦予所屬使用者
chown -R gitlab-runner:gitlab-runner /opt/gitlab-devops-app
# 並授予可執行許可權
chmod -R +x /opt/gitlab-devops-app

 

自動化部署 - CI/CD 流水線設定

在CI/CD選單的編輯器中,先選擇對應的專案分支,再設定流水線按鈕,自動生成名為 .gitlab-ci.yml 的檔案於此專案的根目錄;
在這裡,流水線組態檔 .gitlab-ci.yml 決定了自動化部署的步驟過程。
起初GitLab會給出一個設定模板,這裡將設定好的內容如下:

# 總流程 - 按序執行
# 這裡自定義了七個步驟,可按實際情況自定義名稱和順序,通過命令完成部署
stages:           # List of stages for jobs, and their order of execution
  - stop          # Job1:停止原有站點執行
  - clear         # Job2:清除原有部署檔案
  - clone         # Job3:遠端克隆原始碼
  - test          # Job4:單元測試
  - build         # Job5:編譯原始碼
  - publish       # Job6:釋出專案
  - deploy        # Job7:重新啟動站點執行
#
#
#
# 以下每個作業(步驟節點)對應上述總流程的步驟名稱,如下範例每個節點區塊格式:
# {自定義作業名稱}:
# 	stage: {對應上述總流程定義的作業節點名稱}
# 	script:
# 	- {按序單行要執行的命令}
# 	- {按序單行要執行的命令}
#
#
#
# Job1:停止原有站點執行
stop-job:
  stage: stop
  script:
    - ps -ef | grep Web.dll | grep -v grep | awk '{print $2}' | xargs -r kill -9 && true=0 || false=1
#
# Job2:清除原有部署檔案
clear-job:
  stage: clear
  script:
    - cd /opt/gitlab-devops-app/
    - rm -rvf my-project-test
#
# Job3:遠端克隆原始碼
clone-job:
  stage: clone
  script:
    - cd /opt/gitlab-devops-app/
    - git clone -b {分支名稱} http://{使用者名稱}:{密碼}@{ServerIP}/{project-url}/my-project-test.git
#
# Job4:單元測試;對克隆下來的原始碼進行操作
unit-test-job:
 stage: test
 script:
   - cd /opt/gitlab-devops-app/my-project-test/Web/
   - dotnet test Web.csproj
#
# Job5:編譯原始碼
build-job:
  stage: build
  script:
    - cd /opt/gitlab-devops-app/my-project-test/Web/
    - dotnet build --configuration Release
#
# Job6:釋出專案
publish-job:
  stage: publish
  script:
    - mkdir /opt/gitlab-devops-app/my-project-test/publish/
    - cd /opt/gitlab-devops-app/my-project-test/Web/
    - dotnet publish --configuration Release --no-build --output ../publish/
#
# Job7:重新啟動站點執行
deploy-job:
  stage: deploy
  environment: production
  script:
    - cd /opt/gitlab-devops-app/my-project-test/publish/
    - nohup dotnet Web.dll --urls http://*:5000 > /dev/null 2>&1 &

以上設定提交儲存後,在 CI/CD 的流水線選單中會顯示一條變更後要執行的任務,並且自動按設定的作業節點執行,自動執行的原因是先前設定了runner的[執行未標記的作業]。效果如下圖所示:

從以上設定得出,部署時的站點存取埠為5000,這裡需要防火牆開啟5000的存取埠。

# 開放測試站點存取的5000埠
firewall-cmd --zone=public --add-port=5000/tcp --permanent
firewall-cmd --reload
# 檢視已開放的埠
firewall-cmd --list-ports

 

最終呈現效果

CI/CD 自動化部署 執行效果

部署後的測試站點存取效果