分類
標籤
.env AI Arc Arm Astro BigQuery btop Certbot Chrome CICD Cookie CORS CSS cURL DataTables defineExpose DevOps Docker Draggable Fetch API Gamania Git GitLab Google Calendar Google Cloud Summit Google Tag Manager GSAP HTML iCal inject JavaScript Laravel Less LINE Llama 3 Masonry Meta Nginx Nginx UI O(log n) Ollama OpenSSL Oracle OrbStack PHP Pinia Pixel Postman provide Proxyman Raycast requestAnimationFrame script setup Server Session Sitemap Socialite SSL TablePlus Termius Valet Vertex AI Visual Studio Code Vite Vue 3 Vue2 Vue3 Vuex Warp Webpack Yahoo Calendar Zeabur 二分搜尋 元件溝通 前端開發 動畫效果 峰值體驗 廣告 性能優化 打包 推薦系統 搜尋 時間複雜度 演算法 瀑布流排版 父子元件 環境變數 程式碼複製按鈕 系統監控 網站地圖 網頁開發 自動化部署 螢幕刷新率 語言模型 資訊檢索 跨域請求 轉化率 開發工具 陣列 電商 電子商務
891 字
4 分鐘
GitLab CI/CD 進階配置:環境變數與平行部署
前言
在開發團隊中,一個穩定且高效的自動化部署流程是不可或缺的。GitLab CI/CD 提供了強大的功能來實現這個目標,但要妥善配置這些功能需要一些技巧。本文將從實務角度出發,詳細說明如何設定環境變數、撰寫部署腳本,以及實現多台伺服器的平行部署。
CI/CD 配置基礎
讓我們先來看看一個典型的 .gitlab-ci.yml
檔案結構:
# 全域變數設定
variables:
PUBLISH_PATH: "./dist/"
# 預設設定
default:
image: node:18.1.0-alpine
tags: [docker]
# 定義部署階段
stages:
- build
- deploy
這是最基本的配置,接下來我們會逐步加入更多功能。
善用環境變數
在管理不同環境的部署配置時,善用環境變數可以讓整個流程更加靈活且易於維護。
使用錨點管理環境配置
YAML 的錨點(Anchors)功能讓我們能夠重複使用相同的配置:
# 測試環境
.beta_vars: &beta_vars
SFTP_USER: "deploy_user"
SFTP_HOST: "beta.example.com"
SFTP_PORT: "22"
REMOTE_PATH: "/var/www/html/beta"
# 預發環境
.stage_vars: &stage_vars
SFTP_USER: "deploy_user"
SFTP_HOST: "stage.example.com"
SFTP_PORT: "22"
REMOTE_PATH: "/var/www/html/stage"
# 正式環境(多台伺服器)
.main_vars: &main_vars
SFTP_USER: "deploy_user"
SFTP_PORT: "22"
REMOTE_PATH: "/var/www/html/prod"
SFTP_HOST_1: "prod1.example.com"
SFTP_HOST_2: "prod2.example.com"
部署工具介紹
在開始寫部署腳本之前,我們需要了解兩個重要的部署工具。
sshpass:自動化 SSH 連線
sshpass 讓我們能夠在腳本中自動處理 SSH 密碼:
# 基本用法
sshpass -p "密碼" ssh user@host "指令"
# 在 CI/CD 中的使用方式
sshpass -p "${SFTP_PASSWORD}" ssh -p ${SFTP_PORT} ${SFTP_USER}@${SFTP_HOST} "指令"
注意:雖然 sshpass 很方便,但從安全性考量,建議在正式環境使用 SSH 金鑰認證。
rsync:高效的檔案同步
rsync 是一個強大的檔案同步工具,特別適合用於部署:
# 常用參數說明
rsync -avz
# -a:保留檔案屬性
# -v:顯示進度
# -z:傳輸時壓縮
部署策略實作
我們採用了一個安全且高效的部署策略,主要分為三個步驟:
- 建立臨時目錄
- 同步檔案
- 原子性切換
共用部署腳本
.deploy-script: &deploy_script |
# 1. 建立臨時目錄
TEMP_PATH="${REMOTE_PATH}_temp"
sshpass -p "${SFTP_PASSWORD}" ssh -o StrictHostKeyChecking=no \
-p ${SFTP_PORT} ${SFTP_USER}@${SFTP_HOST} "mkdir -p '${TEMP_PATH}'"
# 2. 同步檔案到臨時目錄
sshpass -p "${SFTP_PASSWORD}" rsync -avz \
-e "ssh -p ${SFTP_PORT}" \
${PUBLISH_PATH}/* \
${SFTP_USER}@${SFTP_HOST}:${TEMP_PATH}/
# 3. 原子性切換目錄
sshpass -p "${SFTP_PASSWORD}" ssh -p ${SFTP_PORT} \
${SFTP_USER}@${SFTP_HOST} "
cd ${REMOTE_PATH%/*} &&
rm -rf ${REMOTE_PATH##*/} &&
mv ${TEMP_PATH} ${REMOTE_PATH##*/} &&
chmod -R 755 ${REMOTE_PATH##*/}
"
實際部署配置
單一環境部署
deploy-beta:
stage: deploy
environment:
name: beta
url: https://beta.example.com
variables:
<<: *beta_vars
only:
- beta
needs:
- build-beta
before_script:
- apk add --update --no-cache openssh sshpass rsync
script:
- *deploy_script
多伺服器平行部署
deploy-production:
stage: deploy
environment:
name: production
url: https://example.com
variables:
<<: *main_vars
only:
- main
parallel:
matrix:
- SFTP_HOST: ["$SFTP_HOST_1", "$SFTP_HOST_2"]
script:
- *deploy_script
安全性考量
在設定 CI/CD 時,安全性是重要的考量點:
敏感資訊處理
- 使用 GitLab CI/CD 變數功能
- 啟用 Protected 和 Masked 選項
- 避免在配置檔中明文存放密碼
存取控制
- 限制部署權限
- 使用環境專用的部署帳號
- 定期更新存取憑證
效能優化建議
使用快取
cache: paths: - node_modules/ key: ${CI_COMMIT_REF_SLUG}
最小化部署內容
- 只部署必要的檔案
- 使用
.gitignore
和.dockerignore
- 善用 rsync 的排除功能
常見問題處理
部署失敗檢查清單
- 網路連線狀態
- 伺服器磁碟空間
- 檔案權限設定
- 環境變數值
除錯技巧
- 使用
set -x
顯示詳細執行過程 - 檢查 GitLab CI/CD 日誌
- 驗證環境變數值:
echo $VARIABLE_NAME
- 使用
參考資料
GitLab CI/CD 進階配置:環境變數與平行部署
https://laplusda.com/posts/gitlab-ci-parallel-env/