Gitee 持續集成與交付(CI/CD)篇 🚀
文章目錄
- Gitee 持續集成與交付(CI/CD)篇 🚀
- 🎯 什么是 CI/CD?
- 🌟 Gitee Go 介紹
- ? 核心特性
- 🎨 支持的技術棧
- 🚀 提交項目進行 CI/CD
- 第一步:創建 .gitee-ci.yml 文件
- 第二步:配置項目設置
- 第三步:提交代碼觸發構建
- 📦 制品庫配置
- Maven 制品庫配置
- Docker 制品庫配置
- npm 制品庫配置
- ?? 流水線配置示例與實踐
- Java Spring Boot 項目示例
- Vue.js 前端項目示例
- Python Django 項目示例
- 🔧 高級配置技巧
- 1. 多環境部署策略
- 2. 條件執行和規則
- 3. 并行執行和依賴管理
- 4. 緩存優化策略
- 🛠? 常見問題與解決方案
- 1. 構建超時問題
- 2. 內存不足問題
- 3. 網絡連接問題
- 4. 權限問題
- 📊 監控與通知
- 1. 構建狀態通知
- 2. 性能監控
- 🎯 最佳實踐總結
- 1. 配置文件組織
- 2. 流水線設計
- 3. 安全考慮
- 4. 監控和維護
- 🚀 進階學習方向
嘿,寶子們!今天咱們來聊聊 Gitee 的持續集成與交付(CI/CD)!這可是現代軟件開發的核心技能之一,掌握了它,你的開發效率絕對能起飛!??
🎯 什么是 CI/CD?
持續集成(Continuous Integration,CI):開發者頻繁地將代碼集成到主干分支,每次集成都通過自動化構建來驗證,從而盡早發現集成錯誤。
持續交付(Continuous Delivery,CD):在持續集成的基礎上,將集成后的代碼自動部署到類生產環境,確保代碼隨時可以安全地發布到生產環境。
持續部署(Continuous Deployment):更進一步,將通過測試的代碼自動部署到生產環境。
🌟 Gitee Go 介紹
Gitee Go 是 Gitee 推出的持續集成服務,為開發者提供了完整的 CI/CD 解決方案。它具有以下特點:
? 核心特性
- 云原生架構:基于容器技術,支持多種運行環境
- 豐富的模板:提供多種語言和框架的構建模板
- 靈活配置:支持 YAML 配置文件,自定義構建流程
- 集成度高:與 Gitee 代碼倉庫無縫集成
- 成本優化:按需使用,降低運維成本
🎨 支持的技術棧
- 前端:Vue.js、React、Angular、小程序等
- 后端:Java、Python、Node.js、Go、PHP 等
- 移動端:Android、iOS、Flutter、React Native 等
- 其他:Docker、Kubernetes、靜態網站等
🚀 提交項目進行 CI/CD
第一步:創建 .gitee-ci.yml 文件
在項目根目錄創建 .gitee-ci.yml
文件,這是 Gitee Go 的配置文件:
# Gitee Go CI/CD 配置文件
image: node:16 # 指定運行環境stages:- build- test- deployvariables:NODE_ENV: production# 構建階段
build_job:stage: buildscript:- npm install- npm run buildartifacts:paths:- dist/expire_in: 1 hour# 測試階段
test_job:stage: testscript:- npm run test- npm run lintcoverage: '/Lines\s*:\s*(\d+\.?\d*)%/'# 部署階段
deploy_job:stage: deployscript:- echo "部署到生產環境"- scp -r dist/* user@server:/var/www/html/only:- master
第二步:配置項目設置
-
進入項目設置
- 打開 Gitee 項目頁面
- 點擊「服務」→「Gitee Go」
- 啟用 CI/CD 服務
-
配置觸發條件
# 觸發條件配置 only:- master # 僅在 master 分支觸發- develop # 開發分支except:- feature/* # 排除功能分支# 或者使用規則 rules:- if: '$CI_COMMIT_BRANCH == "master"'- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
-
設置環境變量
- 在項目設置中添加敏感信息
- 如數據庫密碼、API 密鑰等
- 在 CI/CD 中通過
$VARIABLE_NAME
使用
第三步:提交代碼觸發構建
# 提交代碼
git add .
git commit -m "feat: 添加 CI/CD 配置"
git push origin master
提交后,Gitee Go 會自動檢測到 .gitee-ci.yml
文件并開始執行構建流程!🎉
📦 制品庫配置
制品庫用于存儲構建產物,如 JAR 包、Docker 鏡像、npm 包等。
Maven 制品庫配置
-
創建制品庫
- 進入 Gitee 企業版
- 創建 Maven 類型制品庫
- 獲取倉庫地址和認證信息
-
配置 pom.xml
<distributionManagement><repository><id>gitee-releases</id><name>Gitee Release Repository</name><url>https://gitee.com/api/packages/your-org/maven</url></repository><snapshotRepository><id>gitee-snapshots</id><name>Gitee Snapshot Repository</name><url>https://gitee.com/api/packages/your-org/maven</url></snapshotRepository> </distributionManagement>
-
CI/CD 中發布制品
publish_job:stage: deployscript:- mvn clean compile package- mvn deploy -s settings.xmlartifacts:paths:- target/*.jar
Docker 制品庫配置
docker_build:stage: buildscript:- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHAservices:- docker:dind
npm 制品庫配置
npm_publish:stage: deployscript:- npm config set registry https://gitee.com/api/packages/your-org/npm/- npm publishonly:- tags
?? 流水線配置示例與實踐
Java Spring Boot 項目示例
# Java Spring Boot CI/CD 配置
image: maven:3.8.1-openjdk-11stages:- build- test- package- deployvariables:MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version"cache:paths:- .m2/repository/# 構建階段
build:stage: buildscript:- mvn $MAVEN_CLI_OPTS compileartifacts:paths:- target/expire_in: 1 hour# 單元測試
unit_test:stage: testscript:- mvn $MAVEN_CLI_OPTS testartifacts:reports:junit:- target/surefire-reports/TEST-*.xmlpaths:- target/site/jacoco/coverage: '/Total.*?([0-9]{1,3})%/'# 代碼質量檢查
code_quality:stage: testscript:- mvn sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKENonly:- master- develop# 打包
package:stage: packagescript:- mvn $MAVEN_CLI_OPTS package -DskipTestsartifacts:paths:- target/*.jarexpire_in: 1 weekonly:- master- tags# Docker 鏡像構建
docker_build:stage: packagescript:- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA- docker push $CI_REGISTRY_IMAGE:latestservices:- docker:dindonly:- master# 部署到測試環境
deploy_test:stage: deployscript:- echo "部署到測試環境"- ssh test-server "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"- ssh test-server "docker stop myapp || true"- ssh test-server "docker run -d --name myapp -p 8080:8080 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"environment:name: testurl: http://test.example.comonly:- develop# 部署到生產環境
deploy_prod:stage: deployscript:- echo "部署到生產環境"- ssh prod-server "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"- ssh prod-server "docker stop myapp || true"- ssh prod-server "docker run -d --name myapp -p 8080:8080 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"environment:name: productionurl: http://prod.example.comwhen: manual # 手動觸發only:- master
Vue.js 前端項目示例
# Vue.js 前端 CI/CD 配置
image: node:16stages:- install- lint- test- build- deployvariables:NODE_ENV: productioncache:paths:- node_modules/- .npm/# 安裝依賴
install_dependencies:stage: installscript:- npm ci --cache .npm --prefer-offlineartifacts:paths:- node_modules/expire_in: 1 hour# 代碼檢查
lint_code:stage: lintscript:- npm run lint- npm run format:checkdependencies:- install_dependencies# 單元測試
unit_test:stage: testscript:- npm run test:unit -- --coverageartifacts:reports:coverage_report:coverage_format: coberturapath: coverage/cobertura-coverage.xmlpaths:- coverage/dependencies:- install_dependencies# E2E 測試
e2e_test:stage: testscript:- npm run test:e2eartifacts:paths:- tests/e2e/screenshots/- tests/e2e/videos/when: on_failuredependencies:- install_dependencies# 構建
build_app:stage: buildscript:- npm run buildartifacts:paths:- dist/expire_in: 1 weekdependencies:- install_dependenciesonly:- master- develop# 部署到 CDN
deploy_cdn:stage: deployscript:- echo "部署到 CDN"- aws s3 sync dist/ s3://my-bucket/ --delete- aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_ID --paths "/*"dependencies:- build_appenvironment:name: productionurl: https://myapp.example.comonly:- master# 部署到測試環境
deploy_staging:stage: deployscript:- echo "部署到測試環境"- rsync -avz --delete dist/ user@staging-server:/var/www/html/dependencies:- build_appenvironment:name: stagingurl: https://staging.myapp.example.comonly:- develop
Python Django 項目示例
# Python Django CI/CD 配置
image: python:3.9stages:- test- build- deployvariables:PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"DJANGO_SETTINGS_MODULE: "myproject.settings.test"cache:paths:- .cache/pip/- venv/before_script:- python -V- pip install virtualenv- virtualenv venv- source venv/bin/activate- pip install -r requirements.txt# 代碼質量檢查
flake8:stage: testscript:- flake8 .# 安全檢查
safety:stage: testscript:- safety check# 單元測試
django_test:stage: testscript:- python manage.py test- coverage run --source='.' manage.py test- coverage report- coverage xmlartifacts:reports:coverage_report:coverage_format: coberturapath: coverage.xmlservices:- postgres:13variables:POSTGRES_DB: test_dbPOSTGRES_USER: test_userPOSTGRES_PASSWORD: test_passDATABASE_URL: "postgresql://test_user:test_pass@postgres:5432/test_db"# Docker 構建
docker_build:stage: buildscript:- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHAservices:- docker:dindonly:- master# 部署
deploy_production:stage: deployscript:- echo "部署到生產環境"- ssh production-server "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"- ssh production-server "docker-compose down"- ssh production-server "docker-compose up -d"environment:name: productionurl: https://myapp.example.comwhen: manualonly:- master
🔧 高級配置技巧
1. 多環境部署策略
# 多環境部署配置
.deploy_template: &deploy_templatescript:- echo "部署到 $ENVIRONMENT 環境"- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA- docker-compose -f docker-compose.$ENVIRONMENT.yml down- docker-compose -f docker-compose.$ENVIRONMENT.yml up -ddeploy_dev:<<: *deploy_templatestage: deployvariables:ENVIRONMENT: devenvironment:name: developmenturl: https://dev.myapp.comonly:- developdeploy_staging:<<: *deploy_templatestage: deployvariables:ENVIRONMENT: stagingenvironment:name: stagingurl: https://staging.myapp.comonly:- masterdeploy_prod:<<: *deploy_templatestage: deployvariables:ENVIRONMENT: prodenvironment:name: productionurl: https://myapp.comwhen: manualonly:- tags
2. 條件執行和規則
# 條件執行示例
build_feature:stage: buildscript:- echo "構建功能分支"rules:- if: '$CI_COMMIT_BRANCH =~ /^feature\/.*$/'when: on_success- when: neverbuild_hotfix:stage: buildscript:- echo "構建熱修復分支"rules:- if: '$CI_COMMIT_BRANCH =~ /^hotfix\/.*$/'when: on_success- when: never# 基于文件變更的條件執行
test_frontend:stage: testscript:- npm run testrules:- changes:- "frontend/**/*"- "package.json"when: on_success- when: nevertest_backend:stage: testscript:- mvn testrules:- changes:- "backend/**/*"- "pom.xml"when: on_success- when: never
3. 并行執行和依賴管理
# 并行執行示例
stages:- build- test- integration- deploy# 并行構建
build_frontend:stage: buildscript:- npm run buildartifacts:paths:- frontend/dist/build_backend:stage: buildscript:- mvn packageartifacts:paths:- backend/target/# 并行測試
test_unit:stage: testscript:- npm run test:unitparallel: 3 # 并行運行 3 個實例test_integration:stage: testscript:- npm run test:integrationdependencies:- build_frontend- build_backend# 集成測試
integration_test:stage: integrationscript:- docker-compose up -d- npm run test:e2e- docker-compose downdependencies:- test_unit- test_integration
4. 緩存優化策略
# 緩存優化配置
variables:PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"NPM_CONFIG_CACHE: "$CI_PROJECT_DIR/.cache/npm"MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.cache/maven"# 全局緩存
cache:key: "$CI_COMMIT_REF_SLUG"paths:- .cache/- node_modules/- .m2/repository/policy: pull-push# 作業級緩存
build_job:stage: buildcache:key: "build-$CI_COMMIT_REF_SLUG"paths:- dist/- target/policy: pushscript:- npm install- npm run buildtest_job:stage: testcache:key: "build-$CI_COMMIT_REF_SLUG"paths:- dist/- target/policy: pullscript:- npm run test
🛠? 常見問題與解決方案
1. 構建超時問題
# 設置超時時間
build_job:stage: buildtimeout: 2h # 設置 2 小時超時script:- echo "長時間構建任務"- sleep 3600 # 模擬長時間任務
2. 內存不足問題
# 優化內存使用
build_job:stage: buildvariables:NODE_OPTIONS: "--max-old-space-size=4096" # 增加 Node.js 內存限制MAVEN_OPTS: "-Xmx2g -Xms1g" # 設置 Maven 內存script:- npm run build
3. 網絡連接問題
# 網絡重試配置
before_script:- apt-get update -qq- apt-get install -y -qq curl# 設置重試機制- |for i in {1..3}; donpm install && breakecho "重試第 $i 次..."sleep 5done
4. 權限問題
# 權限配置
before_script:- chmod +x scripts/deploy.sh- chown -R $(whoami) /var/www/htmldeploy_job:stage: deployscript:- ./scripts/deploy.sh
📊 監控與通知
1. 構建狀態通知
# 通知配置
after_script:- |if [ "$CI_JOB_STATUS" == "success" ]; thencurl -X POST -H 'Content-type: application/json' \--data '{"text":"? 構建成功: '$CI_PROJECT_NAME' - '$CI_COMMIT_REF_NAME'"}' \$SLACK_WEBHOOK_URLelsecurl -X POST -H 'Content-type: application/json' \--data '{"text":"? 構建失敗: '$CI_PROJECT_NAME' - '$CI_COMMIT_REF_NAME'"}' \$SLACK_WEBHOOK_URLfi
2. 性能監控
# 性能監控
performance_test:stage: testscript:- npm run build- lighthouse --chrome-flags="--headless" --output=json --output-path=./lighthouse.json https://myapp.comartifacts:reports:performance: lighthouse.json
🎯 最佳實踐總結
1. 配置文件組織
- 使用模板和繼承減少重復代碼
- 將敏感信息存儲在環境變量中
- 合理使用緩存提高構建速度
- 設置合適的超時時間
2. 流水線設計
- 快速失敗原則:將快速的檢查放在前面
- 并行執行:獨立的任務可以并行運行
- 分層構建:合理劃分構建階段
- 增量構建:只構建變更的部分
3. 安全考慮
- 不在日志中輸出敏感信息
- 使用最小權限原則
- 定期更新依賴和鏡像
- 啟用代碼掃描和安全檢查
4. 監控和維護
- 設置構建通知
- 監控構建時間和成功率
- 定期清理舊的制品
- 優化構建性能
🚀 進階學習方向
- GitOps 實踐:使用 Git 作為部署的單一真實來源
- 多云部署:在不同云平臺間進行部署
- 藍綠部署:零停機時間的部署策略
- 金絲雀發布:漸進式的功能發布
- 基礎設施即代碼:使用代碼管理基礎設施
好啦,寶子們!Gitee 的 CI/CD 就介紹到這里啦!🎉 掌握了這些技能,你就能實現真正的自動化開發流程,讓代碼從提交到部署一氣呵成!
記住,CI/CD 不僅僅是工具,更是一種開發文化和理念。持續學習,持續改進,你的開發效率一定會越來越高的!💪
下一篇我們將深入探討Gitee 在 DevOps 中的應用篇,敬請期待哦!?