Gitlab CI/CD基本介紹
-
核心概念
持續集成(CI):每次代碼提交后自動觸發構建、測試和代碼檢查,確保代碼質量
持續交付/部署(CD):在 CI 基礎上自動將代碼部署到測試或生產環境,支持人工審核(交付)或全自動發布(部署)
-
核心組件
Pipeline(流水線):由多個階段(
stages
)組成,每個階段包含并行執行的作業(jobs
).gitlab-ci.yml:YAML 格式的配置文件,定義流水線的邏輯,需放置在項目根目錄
Runner:執行作業的代理,支持 Docker、Shell 等運行環境,分為共享 Runner 和私有 Runner
-
工作流程
代碼提交:觸發流水線執行
階段執行:
- 構建階段:編譯代碼、安裝依賴
- 測試階段:運行單元測試、集成測試等
- 部署階段:自動發布到指定環境
結果反饋:通過 GitLab 界面查看日志和狀態
-
優勢
- 自動化:減少手動操作,提升效率
- 可視化:提供流水線狀態和日志的實時監控
- 靈活性:支持多語言、多環境部署,可集成 Kubernetes 等云原生工具
預先準備
- 用于發布程序的機器一臺,負責執行任務、部署程序
- 若干臺服務器(生產環境)
發布程序
在發布程序的機器上安裝gitlab-runner
-
添加官方倉庫
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
-
使用apt安裝
sudo apt-get install gitlab-runner
-
驗證是否安裝成功
gitlab-runner --version
注冊Runner到項目
-
注冊runner到項目,在項目目錄下執行
sudo gitlab-runner register
填寫gitlab的地址,token,其余信息不必要填
token在gitlab的網頁端可以找到
按照下圖填寫服務器的必要信息,地址、端口號、ssh用戶名和密碼
-
注冊完成后,可以看到runner的配置文件在**/etc/gitlab-runner/config.toml**下
-
查看gitlab-runner運行狀態
在安裝runner的機器上生成ssh密鑰
-
生成密鑰,需要指定格式
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
-
查看id_rsa私鑰格式,必須有開頭和結尾,否則密鑰加載會失敗
-----BEGIN OPENSSH PRIVATE KEY----- 密鑰內容 -----END OPENSSH PRIVATE KEY-----
-
將本地生成的 SSH 公鑰添加到目標服務器(生產環境)上,使用以下命令將公鑰添加到目標服務器的 authorized_keys 文件中
ssh-copy-id username@remote_host
在項目目錄下編寫.gitlab-ci.yml
下面是我的一個示例
stages:- build- deploybuild_image:stage: buildimage: docker:latestservices:- docker:dindscript:- docker rmi ems-simulate 2>/dev/null || true- docker build --no-cache -t ems-simulate .- docker save ems-simulate | gzip > ~/ems_simulate.tar.gzonly:- maindeploy_ems_simulate:stage: deployparallel:matrix: # 使用矩陣同時部署4臺服務器- HOST: ["10.10.112.4", "10.10.112.5", "10.10.112.6", "10.10.110.33"]before_script:# 禁用嚴格主機密鑰檢查(僅限測試環境)- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/configscript:# 傳輸鏡像到遠程主機- scp ~/ems_simulate.tar.gz narada@$HOST:~# 遠程執行部署命令- ssh narada@$HOST "gunzip -c ~/ems_simulate.tar.gz | docker load && docker stop ems_simulate_container 2>/dev/null && docker rm ems_simulate_container 2>/dev/null && docker volume rm ems_simulate_volume 2>/dev/null || true && docker volume create ems_simulate_volume 2>/dev/null || true && docker run -d --name ems_simulate_container --network host -v ems_simulate_volume:/app ems-simulate /bin/bash -c 'cd /app && python3 start_back_end.py'"needs: [build_image]only:- main
結合docker使用分為兩個階段
- 構建階段,制作docker鏡像并導出為tar.gz文件
- 將鏡像文件分發到每臺生產環境,部署docker容器
當將代碼提交到gitlab時,將會自動執行任務,下面是執行的效果
點進某個任務可以看到具體的執行情況
執行成功的任務最后會顯示Job succeeded