当前位置: 首页 > news >正文

Gitee 持续集成与交付(CI/CD)篇

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

第二步:配置项目设置

  1. 进入项目设置

    • 打开 Gitee 项目页面
    • 点击「服务」→「Gitee Go」
    • 启用 CI/CD 服务
  2. 配置触发条件

    # 触发条件配置
    only:- master      # 仅在 master 分支触发- develop     # 开发分支except:- feature/*   # 排除功能分支# 或者使用规则
    rules:- if: '$CI_COMMIT_BRANCH == "master"'- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
    
  3. 设置环境变量

    • 在项目设置中添加敏感信息
    • 如数据库密码、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 制品库配置

  1. 创建制品库

    • 进入 Gitee 企业版
    • 创建 Maven 类型制品库
    • 获取仓库地址和认证信息
  2. 配置 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>
    
  3. 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. 监控和维护

  • 设置构建通知
  • 监控构建时间和成功率
  • 定期清理旧的制品
  • 优化构建性能

🚀 进阶学习方向

  1. GitOps 实践:使用 Git 作为部署的单一真实来源
  2. 多云部署:在不同云平台间进行部署
  3. 蓝绿部署:零停机时间的部署策略
  4. 金丝雀发布:渐进式的功能发布
  5. 基础设施即代码:使用代码管理基础设施

好啦,宝子们!Gitee 的 CI/CD 就介绍到这里啦!🎉 掌握了这些技能,你就能实现真正的自动化开发流程,让代码从提交到部署一气呵成!

记住,CI/CD 不仅仅是工具,更是一种开发文化和理念。持续学习,持续改进,你的开发效率一定会越来越高的!💪


下一篇我们将深入探讨Gitee 在 DevOps 中的应用篇,敬请期待哦!✨

http://www.lryc.cn/news/575927.html

相关文章:

  • Solidity学习 - 断言失败
  • Java:链接mysql数据库报错:CommunicationsException: Communications link failure
  • MySQL Limit数量不满足时导致查询变慢
  • 深圳中青宝互动网络股份有限公司游戏运维工程师面试题(笔
  • 使用OpenCV进行3D重建:详细指南
  • OpenCV图像添加水印
  • word中如何保存高清图片,并保存为高质量的pdf文件(图像不失真)
  • 51c~嵌入式~PLC~西门子~合集1
  • GO 语言学习 之 语句块
  • 汉中农业服务——激活田野的希望,共绘乡村振兴图
  • Guava Cache 本地项目缓存
  • 昇腾910(NPU)安装paddlepaddle【自用版】
  • LinuxBridge的作用与发展历程:从基础桥接到云原生网络基石
  • 【Linux指南】压缩、网络传输与系统工具
  • 用 pnpm + TurboRepo,构建多项目高效开发体系
  • 人工智能-基础篇-4-人工智能AI、机器学习ML和深度学习DL之间的关系
  • 几种基于Doherty结构的GAN氮化镓功放设计方法介绍
  • Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要区别
  • 算法-堆排序
  • 飞算科技依托 JavaAI 核心技术,打造企业级智能开发全场景方案
  • AIOps与人工智能的融合:从智能运维到自适应IT生态的革命
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_rmem 和 net.core.rmem_default 关系
  • MySQL(1)——count()聚合函数
  • V-by-One V1.4协议介绍
  • QT基础知识3——文件操作:QFile类
  • windows11 源码本地部署大模型anythingllm
  • web布局26
  • sqlite如何存储日期
  • 【数据交易】全国数据交易所的发展现状
  • 开源 java android app 开发(十三)绘图定义控件、摇杆控件的制作