GitLab于Linux實現自動化部署的核心流程
GitLab通過CI/CD(持續集成/持續部署)功能實現Linux環境下的自動化部署,依賴GitLab Runner(執行任務的代理工具)和**.gitlab-ci.yml**(流水線配置文件)兩大核心組件。以下是具體實現步驟:
GitLab Runner是執行.gitlab-ci.yml中任務的工具,需先在Linux服務器上安裝并注冊到GitLab項目。
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner -y
對于CentOS/RHEL,使用:curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-runner -y
sudo gitlab-runner register,按提示輸入:
https://gitlab.example.com);linux-runner);linux,用于匹配項目中的標簽限制)。在項目根目錄創建.gitlab-ci.yml文件,定義流水線階段(stages)和任務(jobs)。以下是一個基礎示例:
stages:
- build # 構建階段:編譯代碼、生成產物
- test # 測試階段:運行單元測試、集成測試
- deploy # 部署階段:將產物推送至生產環境
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" # 示例變量:Maven本地倉庫路徑
build_job:
stage: build
image: maven:3.8.6-openjdk-11 # 使用Maven鏡像
script:
- echo "開始構建項目..."
- mvn clean package -DskipTests # 編譯代碼并打包(跳過測試)
artifacts: # 定義構建產物(后續job可使用)
paths:
- target/*.jar # 將target目錄下的jar包傳遞給下一階段
test_job:
stage: test
image: maven:3.8.6-openjdk-11
script:
- echo "運行單元測試..."
- mvn test # 執行測試用例
deploy_job:
stage: deploy
image: alpine:latest # 使用輕量級Alpine鏡像
before_script:
- apk add --no-cache openssh # 安裝SSH客戶端(用于連接遠程服務器)
script:
- echo "開始部署到生產服務器..."
- scp -o StrictHostKeyChecking=no target/*.jar user@your_server_ip:/opt/app/ # 復制jar包到服務器
- ssh -o StrictHostKeyChecking=no user@your_server_ip "cd /opt/app && nohup java -jar *.jar &" # 后臺啟動應用
only:
- master # 僅當代碼推送到master分支時觸發
關鍵說明:
stages:定義流水線的執行順序(需按build→test→deploy依次執行);image:指定任務運行的Docker鏡像(如Java項目用maven,Python項目用python);script:編寫具體的Shell命令(如mvn package、scp);artifacts:將前一階段的產物(如編譯后的jar包)傳遞給后續階段;only:限制觸發條件(如僅master分支變更時觸發部署)。部署階段需通過SSH連接遠程Linux服務器,因此需配置免密登錄,避免每次輸入密碼。
ssh-keygen -t rsa -b 4096 -C "gitlab-runner@example.com"
默認密鑰路徑為~/.ssh/id_rsa(私鑰)和~/.ssh/id_rsa.pub(公鑰)。ssh-copy-id user@your_server_ip
輸入服務器密碼后,公鑰會自動添加到目標服務器的~/.ssh/authorized_keys文件中。ssh user@your_server_ip "echo '免密登錄成功!'"
若無需密碼即可執行命令,則配置成功。敏感信息(如SSH私鑰、服務器地址、數據庫密碼)不應直接寫在.gitlab-ci.yml中,需通過GitLab CI/CD變量管理。
DEPLOY_SERVER_IP(變量名);your_server_ip(服務器IP);File(若為私鑰,如SSH_PRIVATE_KEY,需選擇File類型,Runner會自動創建臨時文件)。script:
- echo "部署到服務器:$DEPLOY_SERVER_IP"
- scp -o StrictHostKeyChecking=no target/*.jar $DEPLOY_USER@$DEPLOY_SERVER_IP:/opt/app/
變量值會在運行時自動替換,確保敏感信息安全。將.gitlab-ci.yml文件提交到GitLab倉庫并推送至遠程分支(如master),Runner會自動檢測到變更并啟動流水線:
git add .gitlab-ci.yml
git commit -m "Add CI/CD pipeline for automated deployment"
git push origin master
localRepository或Node.js的node_modules:cache:
paths:
- .m2/repository/ # Maven緩存
- node_modules/ # Node.js緩存
test_unit:
stage: test
script: mvn test
test_lint:
stage: test
script: npm run lint # 假設是Node.js項目
build_image:
stage: build
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHORT_SHA .
- docker login -u $DOCKER_USER -p $DOCKER_PASSWORD registry.example.com
- docker push registry.example.com/myapp:$CI_COMMIT_SHORT_SHA
kubectl將鏡像部署到K8s集群:deploy_k8s:
stage: deploy
script:
- kubectl apply -f k8s/deployment.yaml # 應用K8s配置文件
only:
- master
需提前配置KUBECONFIG變量(包含K8s集群的訪問權限)。通過以上步驟,可實現GitLab與Linux環境的無縫自動化部署,覆蓋從代碼提交到應用上線的完整流程,顯著提升開發與運維效率。