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.pswp.cn/news/912275.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:PyTorch卷积神经网络图像分类案例分享

本文目录&#xff1a; 一、了解CIFAR-10数据集二、案例之导包三、案例之创建数据集四、案例之搭建神经网络&#xff08;模型构建&#xff09;五、案例之编写训练函数&#xff08;训练模型&#xff09;六、案例之编写预测函数&#xff08;模型测试&#xff09; 前言&#xff1a;…

记录多功能按键第二种写法使用定时器周期间隔判断.

逻辑是通过定时器溢出周期进行判断按下次数 比如设置定时器溢出周期为500MS,每次溢出都会判断按键按下次数,如果下个周期前没有触发按下,则结束键值判断.并确定触发键值.清空按下次数标志.测试比一个定时器周期按下按键次数判断写法要稳定... 记录STM32实现多功能按键_stm32一…

【安卓Sensor框架-1】SensorService 的启动流程

内核启动后&#xff0c;首个用户空间进程init&#xff08;pid1&#xff09;解析init.rc配置文件&#xff0c;启动关键服务&#xff08;如Zygote和ServiceManager&#xff09;。 Zygote服务配置为/system/bin/app_process --zygote --start-system-server&#xff0c;后续用于孵…

centos网卡绑定参考

同事整理分享&#xff1a; 1. 加载 Bonding 模块 modprobe bonding 获取网卡名称 ip a 找到接了网线的网卡名称&#xff0c;记下。 3. 配置物理网卡 创建并编辑 /etc/sysconfig/network-scripts/ifcfg-ens36&#xff08;ifcfg-后面的内容根据上面找到的具体网卡名称决定&#…

mbedtls ssl handshake error,res:-0x2700

用LinkSDK.c连接第三方云平台出现现象 解决方案&#xff1a; 在_tls_network_establish函数中加入 mbedtls_ssl_conf_authmode(&adapter_handle->mbedtls.ssl_config, MBEDTLS_SSL_VERIFY_NONE);原因解释&#xff1a;用连接方式是不用证书认证/跳过服务端认证。

Spring Security 的方法级权限控制是如何利用 AOP 的?

Spring Security 的方法级权限控制是 AOP 技术在实际应用中一个极其强大的应用典范。它允许我们以声明式的方式保护业务方法&#xff0c;将安全规则与业务逻辑彻底解耦。 核心思想&#xff1a;权限检查的“门卫” 你可以把 AOP 在方法级安全中的作用想象成一个尽职尽责的“门…

一键内网穿透,无需域名和服务器,自动https访问

cloudflare能将内网web转为外网可访问的地址。&#xff08;这和apiSQL有点类似&#xff0c;apiSQ可以将内网数据库轻松转换为外网的API&#xff0c;并且还支持代理内网已有API&#xff0c;增强安全增加API Key&#xff0c;以https访问等等&#xff09; 但Cloudfalre tunnel这个…

Sentinel(二):Sentinel流量控制

一、Sentinel 流控规则基本介绍 1、Snetinel 流控规则配置方式 Sentinel 支持可视化的流控规则配置&#xff0c;使用非常简单&#xff1b;可以在监控服务下的“簇点链路” 或 “流控规则” 中 给指定的请求资源配置流控规则&#xff1b;一般推荐在 “簇点链路” 中配置流控规则…

支持PY普冉系列单片机调试工具PY32linK仿真器

PY32 Link是专为 ‌PY32系列ARM-Cortex内核单片机‌&#xff08;如PY32F002A/030/071/040/403等&#xff09;设计的仿真器&#xff0c;支持全系列芯片的‌调试和仿真‌功能。‌开发环境兼容性‌支持主流IDE&#xff1a;‌Keil MDK‌ 和 ‌IAR Embedded Workbench‌&#xff0c;…

深入解析Python多服务器监控告警系统:从原理到生产部署

深入解析Python多服务器监控告警系统&#xff1a;从原理到生产部署 整体架构图 核心设计思想 无代理监控&#xff1a;通过SSH直接获取数据&#xff0c;无需在目标服务器安装代理故障隔离&#xff1a;单台服务器故障不影响整体监控多级检测&#xff1a;网络层→资源层→服务层层…

JUC:10.线程、monitor管程、锁对象之间在synchronized加锁的流程(未完)

一、monitor管程工作原理&#xff1a; 首先&#xff0c;synchronized是一个对象锁&#xff0c;当线程运行到某个临界区&#xff0c;这个临界区使用synchronized对对象obj进行了上锁&#xff0c;此时底层发生了什么&#xff1f; 1.当synchronized对obj上锁后&#xff0c;synch…

Elasticsearch(ES)分页

Elasticsearch&#xff08;简称 ES&#xff09;本身不适合传统意义上的“深分页”&#xff0c;但提供了多种分页方式&#xff0c;每种适用不同场景。我们来详细讲解&#xff1a; 一、基本分页&#xff08;from size&#xff09; 最常用的分页方式&#xff0c;类似 SQL 的 LIM…

原生微信小程序:用 `setData` 正确修改数组中的对象项状态(附实战技巧)

&#x1f4cc; 背景介绍 在微信小程序开发中&#xff0c;我们经常需要修改数组中某个对象的某个字段&#xff0c;比如&#xff1a; 列表中的某一项展开/收起多选状态切换数据列表中的临时标记等 一个常见的场景是&#xff1a; lists: [{ show: true }, { show: true }, { s…

Oracle 临时表空间相关操作

一、临时表空间概述 临时表空间&#xff08;Temporary Tablespace&#xff09;是Oracle数据库中用于存储临时数据的特殊存储区域&#xff0c;其数据在会话结束或事务提交后自动清除&#xff0c;重启数据库后彻底消失。主要用途包括&#xff1a; 存储排序操作&#xff08;如OR…

从静态到动态:Web渲染模式的演进和突破

渲染模式有好多种&#xff0c;了解下web的各种渲染模式&#xff0c;对技术选型有很大的参考作用。 一、静态HTML时代 早期&#xff08;1990 - 1995年&#xff09;网页开发完全依赖手工编写HTML&#xff08;HyperText Markup Language&#xff09;和CSS&#xff08;层叠样式表…

Flask(六) 数据库操作SQLAlchemy

文章目录 一、准备工作二、最小化可运行示例✅ 补充延迟绑定方式&#xff08;推荐方式&#xff09; 三、数据库基本操作&#xff08;增删改查&#xff09;1. 插入数据&#xff08;增&#xff09;2. 查询数据&#xff08;查&#xff09;3. 更新数据&#xff08;改&#xff09;4.…

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环&#xff0c;适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样&#xff0c;下一部分是string的内容&#xff0c;内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程&#xff0c;工具框架附项目实战一套速通&#xff0c;零基础完全轻松掌握&#xff01;自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知&#xff0c;可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包&#xff0c;该软件包伪装成提供密码安全功能&#xff0c;实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包&#xff0c;是对知名密码哈希工具库passlib的拼写错误仿冒&#xff08;typosquatting&…