疊甲前言
本文僅作為個人學習GitLab的CI/CD功能記錄,不適合作為專業性指導,如有紕漏,煩請君指正。
Gitlab的CI/CD做什么用的
自工作以來,去過大大小小公司,有一些公司技術人員專業性欠佳,每當產品經理或測試人員需要最新或者某個版本的包時【比如安卓的apk包,IOS的ipa包,前端的打包靜態資源】,開發總是要停下手中的工作,去手動給測試打包,這類手動工作包括了打開某個項目,加載項目依賴,構建項目生成產物,然后部署產物讓測試人員得以看到效果;可這些步驟都需要時間,非常影響開發效率。
所以一些有經驗的開發人員會去構建一套自動化部署腳本,方便測試人員測試與產品經理驗收,如果公司項目倉庫用的是GitLab,那么CI/CD工具將是非常適合解決這類問題的。它可以通過腳本自由的配置打包部署流程,簡單說,就是代替你做這些事情,掌握這類工具的使用是非常有必要的。
Gitlab的CI/CD由什么構成
Gitlab的CI/CD主要是由流水線和Runner組成。
流水線:就是每當你提交代碼到GitLab倉庫后,會生成一個Job任務,這個任務可以自定義流程,也就是要完成什么事情,基本常見的就是:構建、測試、發布。
Runner:就是這個任務由誰來執行。你可以定義在哪臺主機執行,一般情況推薦使用專門用于打包工作的云主機,當然不是絕對的,這個取決于你公司的需求和業務。【因為之前有個公司就存在玄學說法:“安卓打包機器IP如果是國內的那么上架谷歌商店機審通過概率會很低”, 真假我就不去探究,我放云服務器上完全是為了方便部署】
準備工作
- 申請一個Gitlab個人賬號【需要有管理員權限的賬號,主要你也不能用公司的GitLab瞎搞呀】
- 購買一個云服務器, 并配置好Nodejs環境。
- 將前端項目的遠程地址切換為GitLab倉庫。
注意:國內Gitlab代理商的應該是極狐gitlab。此外姑且認為你對于Linux基本命令操作有一些了解,會使用一些基本部署工具。
配置Runner
云服務器下載安裝Runner
請按詳細文檔操作:安裝Runner
我的云服務器是 Linux的Ubuntu 24.0
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install gitlab-runner
云服務器注冊Runner
請按詳細文檔操作:注冊Runner
這里,我注冊一個 群組Runner,這樣在gitlab的group下的所有項目都可以用這個Runner,具體看你個人需求。
進入步驟:
GitLab -> project -> setting -> CI/CD -> Runner->創建 群組Runner
我的云服務器是 Linux的Ubuntu 24.0, 暫未使用Docker等部署容器
在云主機上執行 提示命令
注冊時,execute選擇 shell.
此時Runner就注冊好了,回到GitLab -> project -> setting -> CI/CD -> Runner,應該可以看到群組已經創建了Runner。
配置流水線腳本
流水線腳本就是定義 任務具體要做哪些事情:
# 定義全局變量,之后腳本可以引用
variables:ProjectName: "webpack_study"BuildResult: buildResult.txt# 定義Job任務腳本流程順序:構建 -> 部署(測試) -> 發布(線上)
stages:- build- deploy- publish# 定義緩存,縮短每次拉取依賴的時間(前端項目主要緩存node_modules和package-lock.json)
cache:key: defaultCache # 緩存名字paths:- node_modules/- package-lock.json# 定義每次執行Job任務前 都會去執行 (主動拉取項目依賴)
before_script:- echo "初始化環境 更新依賴和配置..."- npm install- echo "環境初始化完成!"- echo "依賴和配置更新完成!"# 執行構建測試環境腳本
Build_Test_Job:stage: build # 流程階段when: manual # 手動觸發, 可以自定義條件觸發 only:- /^\d{8}$/ # 限制分支,正則表達式匹配只有分支名包含8個數字的才能生成此腳本【具體原因見末尾《1》】tags: - webPro # tags匹配Runner,只有Runner具有這個Tag,任務才能在這個Runner上執行,【查看Runner-Tag見《2》】script:- echo "開始執行構建測試環境Web打包腳本..." # echo 是輸出日志- npm run stage > $BuildResult # 執行Package.json的腳本構建腳本,并將日志輸出到 buildResult.txt文件中【具體看你自己的前端項目配置的打包命令是什么】- echo "測試環境Web打包完成!"artifacts:paths:- $BuildResult # gitlab平臺可見的打包產物:日志buildResult.txt文件- build # gitlab平臺可見的打包產物:build文件夾【取決于你前端項目的腳本】Deploy_Test_Job:stage: deploywhen: manualonly:- /^\d{8}$/tags: - webProneeds: ["Build_Test_Job"] # 執行必要的前置條件script:- echo "開始執行部署測試環境Web打包產物到云服務器上的腳本..."- mkdir -p /var/www/web/build # 云服務器 遞歸創建/var/www/web/build目錄,如果已有,則跳過【為何是這個目錄?請看《3》】- rm -rf /var/www/web/build/* # 云服務器 移除/var/www/web/build目錄下的所有文件【需要授予gitlab-runner用戶讀寫權限,這里存在一定風險,建議使用DOCKER容器隔離】- cp -r build /var/www/web/ > $BuildResult # 將前端打包生成的build目錄【取決于你前端項目的腳本】文件移動到 /var/www/web 目錄- echo "測試環境Web發布完成!"artifacts:paths:- $BuildResult # gitlab平臺可見的打包產物:日志buildResult.txt文件# 執行構建線上環境腳本
Build_Online_Job:stage: build # 流程階段when: manual # 手動觸發, 可以自定義條件觸發 only:- /^\d{8}$/ # 限制分支,正則表達式匹配只有分支名包含8個數字的才能生成此腳本【具體原因見末尾《1》】tags: - webPro # tags匹配Runner,只有Runner具有這個Tag,任務才能在這個Runner上執行,【查看Runner-Tag見《2》】script:- echo "開始執行構建線上環境Web打包腳本..." # echo 是輸出日志- npm run product > $BuildResult # 執行Package.json的腳本構建腳本,并將日志輸出到 buildResult.txt文件中- echo "線上環境Web打包完成!"artifacts:paths:- $BuildResult # gitlab平臺可見的打包產物:日志buildResult.txt文件- build_online # gitlab平臺可見的打包產物:build文件夾Publish_Online_Job:stage: publishwhen: manualonly:- /^\d{8}$/tags: - webProneeds: ["Build_Online_Job"] # 執行必要的前置條件script:- echo "開始執行部署線上環境Web打包產物到云服務器上的腳本..."- mkdir -p /var/www/web/build_online # 云服務器 遞歸創建/var/www/web/build_online目錄,如果已有,則跳過- rm -rf /var/www/web/build_online/* # 云服務器 移除/var/www/web/build_online目錄下的所有文件【需要授予gitlab-runner用戶讀寫權限,這里存在一定風險,建議使用DOCKER容器隔離】- cp -r build_online /var/www/web/ > $BuildResult # 將前端打包生成的build_online目錄文件移動到 /var/www/web 目錄- echo "線上環境Web發布完成!"#《1》
# 需求決定:前端項目因為每周五都要發一次版本,分支名字就是 20250718,分支上線后會合并到main分支,main分支的代碼就是穩定的,所以打包構建分支只允許周分支生成Job
#《2》
# GitLab -> Project -> setting -> CI/CD -> Runner
#《3》
# /var/www/web/因為此目錄我配置了 Nginx訪問映射,只要訪問xx.xx.xx(云服務器公網IP):端口就會自動去找 /var/www/web/build/index.html
# 云服務器前端項目部署的測試環境端口是:113.45.241.111:8087
# 云服務器前端項目部署的線上環境端口是:113.45.241.111:8089
# 當然你也可以用Nginx部署, 也可以用Docker,jetBains哪個你熟悉用哪個。
完整前端項目代碼:
前端項目地址