从样板代码到智能交付:CodeArts 在 SpringBoot 项目全流程开发中的实战应用
一、为什么 SpringBoot 项目需要 CodeArts?
1.1 一个真实订单微服务的交付之痛
2025 年我接手了一个订单中心重构项目,技术栈是 SpringBoot 3.2 + MyBatis-Plus + MySQL + Redis + RocketMQ。团队 6 个人,2 周一个迭代。第一个迭代结束复盘时,痛点清单写得密密麻麻:

最让我难受的是一次线上事故:一个同事在 OrderService.refund() 里漏了空集合判断,本地测试没覆盖到,Code Review 也没人注意到,结果上线第二天大批退款订单抛 NPE,运营群里炸了锅。从 Bug 出现到修复上线,整整 4 小时。
这种痛不是个例。我对团队 3 个月的交付数据做了统计:
| 痛点 | 实测数据 | 占用工时 |
|---|---|---|
| 编写样板代码(Controller/DTO/Mapper) | 每人每周 8-10h | 25% |
| 人工 Code Review 等待 + 沟通 | 每个 PR 平均 8h | 15% |
| 本地构建 + 手动部署 | 每次发布 45min | 10% |
| 缺陷返工(含线上事故复盘) | 每月 22 个人日 | 18% |
| 排查线上问题(无链路追踪) | 每月 15 个人日 | 12% |
加起来 80% 的时间花在了"非创造性劳动"上,真正设计业务逻辑的时间不到 20%。
1.2 CodeArts 能解决什么
华为云 CodeArts 不是一个单一工具,而是覆盖软件开发全生命周期的一体化平台。我把它在 SpringBoot 项目里能发挥的作用整理成一张表:
| CodeArts 组件 | 在 SpringBoot 项目里的作用 | 我用到的核心能力 |
|---|---|---|
| CodeArts IDE(码道) | AI 编码、智能问答、代码补全 | 自然语言生成 Controller/Service、单测生成、项目级问答 |
| CodeArts Repo | 代码托管、Pull Request | Git 仓库、分支保护、PR 审查触发检查 |
| CodeArts Check | 静态代码分析、安全扫描 | 空指针/SQL 注入检测、依赖漏洞(OSS)扫描、自定义规则 |
| CodeArts Pipeline | CI/CD 流水线 | Maven 构建、单测、镜像构建、CCE 部署、灰度发布 |
| CodeArts Deploy | 部署管理 | Kubernetes 资源编排、滚动更新、一键回滚 |
| CodeArts Insight | 效能度量 | 提交频率、构建时长、缺陷密度看板 |
关键认知:CodeArts 的价值不在单点功能,而在端到端串联。一次 Git 提交,触发 AI 审查 → 静态检查 → 构建 → 测试 → 部署 → 监控,全程无需人工搬运。
二、CodeArts × SpringBoot 全流程架构设计
2.1 整体架构
我把订单微服务项目接入了 CodeArts 全流程,整体架构如下:

2.2 一次提交触发的完整链路
这是接入 CodeArts 后,一次普通的 git push 会触发的全流程:

这条链路跑通后,开发者只需要关心"写代码"这一件事,剩下的全部由 CodeArts 自动驱动。
三、项目准备:SpringBoot 项目结构与 CodeArts 工程配置
3.1 项目结构
订单微服务采用标准的 SpringBoot 多模块结构:
order-service/
├── pom.xml # 父 POM,统一依赖版本
├── order-api/ # 对外 API 接口 + DTO
│ ├── pom.xml
│ └── src/main/java/com/example/order/api/
├── order-core/ # 业务逻辑实现
│ ├── pom.xml
│ └── src/main/java/com/example/order/core/
│ ├── controller/
│ ├── service/
│ ├── repository/
│ └── domain/
├── order-infra/ # 基础设施适配(DB/Cache/MQ)
│ ├── pom.xml
│ └── src/main/java/com/example/order/infra/
└── order-app/ # 启动模块 + 配置
├── pom.xml
└── src/main/resources/
├── application.yml
└── application-prod.yml
3.2 在 CodeArts Repo 创建仓库并导入
# 方式一:在 CodeArts Repo 控制台新建空仓库后推送
git init
git remote add origin https://codehub.cn-north-4.myhuaweicloud.com/order-team/order-service.git
git add .
git commit -m "feat: 初始化订单微服务多模块结构"
git push -u origin main
# 方式二:从已有 GitLab/GitHub 仓库导入
# CodeArts Repo 控制台 → 新建仓库 → 导入外部仓库 → 填写 URL + Token
3.3 父 POM 关键配置
统一在父 POM 里锁定依赖版本,避免子模块版本漂移:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/>
</parent>
<properties>
<java.version>17</java.version>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<opengauss-jdbc.version>5.0.0</opengauss-jdbc.version>
<hutool.version>5.8.27</hutool.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.opengauss</groupId>
<artifactId>opengauss-jdbc</artifactId>
<version>${opengauss-jdbc.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
踩坑①:版本漂移导致构建不一致
最早子模块各自声明版本,结果 CI 上构建通过、本地构建失败(依赖了不同版本的mybatis-plus)。统一在父 POM 用<dependencyManagement>锁定后解决。CodeArts Check 的"依赖版本一致性"规则也能自动发现这类问题。
四、AI 编码实践:CodeArts IDE 在 SpringBoot 开发中的真实效率
4.1 用自然语言生成 Controller
我打开 CodeArts IDE,在 order-core 模块里新建了一个 OrderController.java,输入以下注释:
// 订单 Controller:提供创建订单、查询订单、取消订单、申请退款四个接口
// - 创建订单:POST /api/orders,请求体 OrderCreateDTO,返回订单 ID
// - 查询订单:GET /api/orders/{orderNo},返回订单详情
// - 取消订单:PUT /api/orders/{orderNo}/cancel,需校验订单状态
// - 申请退款:POST /api/orders/{orderNo}/refund,需校验订单状态为 PAID
// 统一返回 ResponseEntity<Result<T>>,异常由全局异常处理器捕获
按下 Ctrl+Enter 触发 AI 生成,CodeArts 自动产出完整代码(节选):
@RestController
@RequestMapping("/api/orders")
@RequiredArgsConstructor
@Slf4j
public class OrderController {
private final OrderService orderService;
@PostMapping
public ResponseEntity<Result<Long>> createOrder(@Valid @RequestBody OrderCreateDTO dto) {
Long orderId = orderService.create(dto);
return ResponseEntity.status(HttpStatus.CREATED)
.body(Result.success(orderId));
}
@GetMapping("/{orderNo}")
public ResponseEntity<Result<OrderDetailVO>> queryOrder(@PathVariable String orderNo) {
OrderDetailVO detail = orderService.queryByOrderNo(orderNo);
return ResponseEntity.ok(Result.success(detail));
}
@PutMapping("/{orderNo}/cancel")
public ResponseEntity<Result<Void>> cancelOrder(@PathVariable String orderNo) {
orderService.cancel(orderNo);
return ResponseEntity.ok(Result.success());
}
@PostMapping("/{orderNo}/refund")
public ResponseEntity<Result<Void>> refundOrder(@PathVariable String orderNo,
@Valid @RequestBody RefundDTO dto) {
orderService.refund(orderNo, dto);
return ResponseEntity.ok(Result.success());
}
}
实测对比:手写这段 Controller + DTO + Service 接口大约需要 18 分钟,CodeArts 生成 + 我人工调整耗时 4 分钟,节省 78%。
4.2 项目级智能问答:快速理解陌生代码
接手项目第一周,我对老代码里 OrderSplitService.split() 的拆单逻辑完全看不懂。把整个方法贴给 CodeArts 问答:
我:解释这段 OrderSplitService.split() 方法的业务逻辑,并指出潜在风险
CodeArts:
该方法是订单拆单逻辑,核心流程:
1. 按商家 ID 分组购物车商品(多商家订单拆成子订单)
2. 每个商家内部再按"是否冷链"二次拆分(冷链需独立物流)
3. 计算每个子订单的运费、优惠分摊金额
4. 落库子订单 + 子订单明细
潜在风险:
- L78 行 `groupingBy` 后未判空,若购物车为空会返回空 Map,下游 NPE
- L92 行优惠分摊用 BigDecimal 但未指定 RoundingMode,可能抛 ArithmeticException
- L105 行落库未加 @Transactional,若中间失败会留下脏数据
- 拆单后总金额校验缺失,可能出现子订单金额之和 ≠ 主订单金额
这种项目级理解能力是普通补全工具做不到的——它不是在猜关键词,而是真的读懂了上下文。我根据它的提示修了 3 个 Bug,其中那个 RoundingMode 问题就是上次线上事故的同款。
4.3 单元测试自动生成
最让我惊喜的是单测生成。在 OrderService.refund() 上右键 → “CodeArts: 生成单元测试”,它根据方法签名和业务逻辑自动产出了 5 个测试用例:
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock
private OrderRepository orderRepository;
@Mock
private RefundMQProducer refundMQProducer;
@InjectMocks
private OrderService orderService;
@Test
void refund_should_success_when_order_status_is_paid() {
Order order = Order.builder().orderNo("NO202601").status(OrderStatus.PAID).amount(BigDecimal.valueOf(100)).build();
when(orderRepository.findByOrderNo("NO202601")).thenReturn(Optional.of(order));
orderService.refund("NO202601", new RefundDTO("用户申请"));
verify(orderRepository).save(argThat(o -> o.getStatus() == OrderStatus.REFUNDING));
verify(refundMQProducer).send(any(RefundEvent.class));
}
@Test
void refund_should_throw_when_order_not_found() {
when(orderRepository.findByOrderNo("NOT_EXIST")).thenReturn(Optional.empty());
assertThrows(OrderNotFoundException.class,
() -> orderService.refund("NOT_EXIST", new RefundDTO("理由")));
}
@Test
void refund_should_throw_when_order_status_is_not_paid() {
Order order = Order.builder().orderNo("NO202602").status(OrderStatus.CREATED).build();
when(orderRepository.findByOrderNo("NO202602")).thenReturn(Optional.of(order));
assertThrows(OrderStatusIllegalException.class,
() -> orderService.refund("NO202602", new RefundDTO("理由")));
}
// ... 还有金额边界、并发幂等两个用例
}
接入 CodeArts 后 1 个月,项目单测覆盖率从 38% 提升到 76%,且新增代码覆盖率稳定在 85%+。
4.4 AI 编码效率实测汇总
| 任务类型 | 手写耗时 | CodeArts 辅助耗时 | 提效 | 备注 |
|---|---|---|---|---|
| CRUD Controller + DTO | 18min | 4min | +78% | 含参数校验注解 |
| Service 业务方法 + 接口 | 25min | 8min | +68% | 复杂业务需人工调整 |
| MyBatis-Plus Mapper | 12min | 2min | +83% | 标准单表操作 |
| 单元测试用例(5 个) | 30min | 5min | +83% | 含边界 + 异常用例 |
| 陌生代码理解 | 40min | 8min | +80% | 项目级问答 |
| 加权平均 | — | — | +76% | — |
五、代码质量门禁:CodeArts Check 在 SpringBoot 项目的配置
5.1 创建检查任务并绑定仓库
在 CodeArts Check 控制台创建检查任务,关联 order-service 仓库,语言选 Java,扫描模式选"增量 + 每周一次全量"。
关键规则集配置(针对 SpringBoot 项目定制):
| 规则类别 | 启用规则 | 阻断级别 | 说明 |
|---|---|---|---|
| 空指针风险 | NP_NULL_ON_SOME_PATH、RC_REF_COMPARISON |
严重 | 订单金额、状态字段必检 |
| SQL 注入 | SQL_INJECTION_HIBERNATE、SQL_INJECTION_JDBC |
严重 | MyBatis ${} 拼接检测 |
| 资源泄漏 | OS_OPEN_STREAM、ODR_OPEN_DATABASE_RESOURCE |
重要 | try-with-resources 检查 |
| 并发问题 | IS2_INCONSISTENT_SYNC、UG_SYNC_SET_UNSYNC_GET |
重要 | 订单状态字段同步 |
| SpringBoot 特定 | @Transactional 必须作用于 public 方法 |
重要 | 自定义规则 |
| 依赖漏洞 | OWASP Top 10 + CVE 库 | 严重 | OSS 依赖扫描 |
5.2 自定义规则:拦截"裸 new Date()"
我们团队约定所有时间戳必须通过 TimeUtil.now() 获取(便于测试 mock)。CodeArts Check 支持自定义 Java 规则,我用 PMD 语法写了一条:
<rule name="NoRawNewDate" message="禁止 new Date(),请使用 TimeUtil.now()" class="net.sourceforge.pmd.java.rule.AbstractJavaRule">
<description>所有时间获取必须通过 TimeUtil.now(),便于单元测试 mock</description>
<priority>2</priority>
<example>
<![CDATA[
// 反例
Date now = new Date();
// 正例
Date now = TimeUtil.now();
]]>
</example>
</rule>
接入后第一周就扫出 47 处违规,强制修复后单测里再也没出现过"因为当前时间导致用例偶尔失败"的问题。
5.3 PR 门禁集成
在 CodeArts Repo 的分支保护策略里,把 main 分支设置为:
- 必须通过 CodeArts Check 检查(严重问题数 = 0)
- 必须通过至少 1 个人工 Review
- 必须通过 CI 流水线(构建 + 单测)

踩坑②:增量扫描漏报已删除代码的遗留问题
早期用纯增量扫描,结果某次大重构删掉了有问题的旧代码,但问题一直挂在历史报告里。后来改成"增量 + 每周日凌晨全量重扫",问题清零。建议生产项目都用这个组合策略。
六、CI/CD 流水线:CodeArts Pipeline 端到端自动化
6.1 流水线阶段设计

6.2 流水线 YAML 配置(核心片段)
CodeArts Pipeline 支持可视化编排,也支持 YAML 声明式配置。下面是核心片段:
# .codearts/pipeline.yml
trigger:
push:
branches: [main, develop]
stages:
- name: 编译
steps:
- name: Maven 编译
action: maven
params:
command: clean compile -T 4 -Dmaven.repo.local=.m2/repository
jdk: 17
cache:
key: ${pom_hash}
paths: [.m2/repository]
- name: 单元测试
steps:
- name: 跑单测 + 覆盖率
action: maven
params:
command: test
post:
- name: 覆盖率门禁
script: |
COVERAGE=$(jq '.total.line.covered / .total.line.count' target/site/jacoco/jacoco.json)
if (( $(echo "$COVERAGE < 0.80" | bc -l) )); then
echo "覆盖率 $COVERAGE 低于 80% 门禁,阻断流水线"
exit 1
fi
- name: 静态检查
steps:
- name: CodeArts Check 增量扫描
action: codearts-check
params:
task_id: order-service-check
scan_mode: incremental
block_on_critical: true
- name: 镜像构建
steps:
- name: Jib 构建并推送 SWR
action: maven
params:
command: jib:build -Pprod
env:
DOCKER_REGISTRY: swr.cn-north-4.myhuaweicloud.com/order-team
IMAGE_TAG: ${git_commit_short}
- name: 部署 CCE
steps:
- name: 滚动更新
action: cce-deploy
params:
cluster: order-prod-cluster
namespace: prod
deployment: order-service
image: ${DOCKER_REGISTRY}/order-service:${IMAGE_TAG}
strategy:
type: RollingUpdate
maxSurge: 1
maxUnavailable: 0
health_check:
path: /actuator/health
initial_delay: 60s
timeout: 5min
auto_rollback_on_failure: true
6.3 用 Jib 替代 Dockerfile 构建镜像
SpringBoot 项目用 Jib 构建镜像无需写 Dockerfile,且能自动分层缓存,构建速度比 docker build 快 3 倍:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.4.3</version>
<configuration>
<from>
<image>swr.cn-north-4.myhuaweicloud.com/base/eclipse-temurin:17-jre-openeuler</image>
</from>
<to>
<image>swr.cn-north-4.myhuaweicloud.com/order-team/order-service</image>
<tags><tag>${project.version}</tag></tags>
</to>
<container>
<jvmFlags>
<flag>-XX:MaxRAMPercentage=75.0</flag>
<flag>-XX:+UseG1GC</flag>
<flag>-XX:+HeapDumpOnOutOfMemoryError</flag>
</jvmFlags>
<ports><port>8080</port></ports>
<labels>
<maintainer>order-team</maintainer>
<build.source>${git.commit}</build.source>
</labels>
</container>
</configuration>
</plugin>
构建产物分层结构:
| 层 | 内容 | 大小 | 变更频率 |
|---|---|---|---|
| 1 | 基础镜像 JRE | 180MB | 极低 |
| 2 | 依赖 jar(dependencies) | 95MB | 低(pom 变更才更新) |
| 3 | 资源文件(resources) | 2MB | 中 |
| 4 | 应用 classes | 1.5MB | 高(每次提交) |
| 合计 | — | ~280MB | — |
踩坑③:基础镜像选 alpine 导致时区错乱
早期用eclipse-temurin:17-jre-alpine,结果订单创建时间比北京时间晚 8 小时。根因是 alpine 默认 UTC 时区且无tzdata包。改用基于 openEuler 的基础镜像eclipse-temurin:17-jre-openeuler(内置 Asia/Shanghai 时区)后解决,同时还能享受鲲鹏原生指令集加速。
七、国产化适配:openGauss + 鲲鹏信创落地
7.1 为什么做国产化适配
订单中心是某金融客户的核心系统,等保三级要求关键组件自主可控。我们把数据层从 MySQL 8.0 迁移到华为自研的 openGauss 5.0,运行时从 x86 ECS 迁移到鲲鹏 920 ECS。
7.2 SpringBoot 接入 openGauss
openGauss 兼容 PostgreSQL 协议,SpringBoot 接入只需替换依赖和驱动:
<!-- 替换 mysql-connector-j -->
<dependency>
<groupId>org.opengauss</groupId>
<artifactId>opengauss-jdbc</artifactId>
</dependency>
spring:
datasource:
url: jdbc:opengauss://opengauss-prod.internal:5432/order_db?currentSchema=public&batchMode=on
username: ${DB_USER}
password: ${DB_PWD}
driver-class-name: org.opengauss.Driver
hikari:
maximum-pool-size: 20
connection-timeout: 3000
idle-timeout: 600000
7.3 MySQL → openGauss 语法迁移要点
| MySQL 语法 | openGauss 语法 | 迁移注意 |
|---|---|---|
AUTO_INCREMENT |
SERIAL / BIGSERIAL |
自动建序列 |
LIMIT 10, 20 |
LIMIT 20 OFFSET 10 |
顺序相反 |
IFNULL(a, b) |
COALESCE(a, b) |
标准函数 |
DATE_FORMAT(t, '%Y-%m-%d') |
to_char(t, 'YYYY-MM-DD') |
模板符号不同 |
ON DUPLICATE KEY UPDATE |
ON CONFLICT ... DO UPDATE |
UPSERT 语法 |
| 反引号 `col` | 双引号 “col” | 仅关键字需引用 |
踩坑④:MyBatis-Plus 分页插件 SQL 兼容性
MyBatis-Plus 3.5.5 默认分页方言选mysql,迁移后分页查询报错。需在配置里指定DbType.POSTGRE_SQL:@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); return interceptor; }
7.4 鲲鹏 920 上的 JVM 调优
鲲鹏 920(ARM64)上跑 SpringBoot,JVM 参数需要针对性调整。我们用毕昇 JDK(BiSheng JDK,华为针对鲲鹏优化的 OpenJDK 发行版):
java -XX:+UseG1GC \
-XX:MaxRAMPercentage=75.0 \
-XX:G1HeapRegionSize=16m \
-XX:+UseLargePages \
-XX:LargePageSizeInBytes=512m \
-XX:+AlwaysPreTouch \
-XX:+UseBiShengIntrinsics \
-jar order-app.jar
x86 vs 鲲鹏 性能对比(同一份代码,4C8G 配置,wrk 压测 200 并发):
| 指标 | x86 (Cascade Lake) | 鲲鹏 920 | 提升 |
|---|---|---|---|
| QPS | 4,820 | 6,150 | +27.6% |
| P99 延迟 | 78ms | 56ms | -28.2% |
| CPU 利用率 | 92% | 78% | -14pp |
| JVM 启动时间 | 4.2s | 3.1s | -26% |
关键收益:鲲鹏 920 的多核架构 + 毕昇 JDK 的向量化 intrinsic 优化,让订单查询这种"短链路 + 高并发"场景获得了显著收益。同样的 ECS 规格下,鲲鹏单实例 QPS 高出近 30%,意味着可以用更少的实例扛住相同流量,月度算力成本下降约 22%。
八、接入前后效率与质量对比
接入 CodeArts 全流程 6 周后,我对团队的交付数据做了完整对比:
| 维度 | 接入前 | 接入后 | 变化 |
|---|---|---|---|
| 需求交付周期 | 9 天 | 3.5 天 | -61% |
| 单测覆盖率 | 38% | 76% | +38pp |
| Code Review 平均等待 | 8h | 1.5h | -81% |
| 构建 + 部署耗时 | 45min | 8min | -82% |
| 线上 P1 故障次数 | 3 次/月 | 1 次/月 | -67% |
| 缺陷密度(每千行) | 4.2 | 1.6 | -62% |
| 样板代码占比 | 40% | 12% | -28pp |
| 开发者满意度(NPS) | +12 | +58 | +46 |
最直观的感受:以前周五下午不敢发版,现在随时可以发;以前 Code Review 是负担,现在 PR 上有 AI 摘要 + 检查报告,Review 重点一目了然。
九、踩坑实录(完整版)
除了前面提到的 4 个,再补 2 个值得单独说的:
踩坑⑤:AI 生成代码的"看似正确"陷阱
有一次让 CodeArts 生成一个分页查询接口,它产出的代码用了Page<T>作为返回值,但漏了@Validated注解,导致size参数传 -1 时直接查全表,差点把数据库打挂。
教训:AI 生成的代码必须人工 Review,尤其是涉及参数校验、SQL 拼接、权限校验的代码。我们把 CodeArts Check 的"参数校验"规则设为严重级别,专门拦截这类问题。
踩坑⑥:Pipeline 缓存键设计不当导致依赖不更新
早期 Maven 缓存键用${branch_name},结果develop分支加了新依赖,缓存命中老的.m2,构建一直报ClassNotFoundException。改成${pom_hash}(POM 文件内容 hash)后解决:POM 一变就重建缓存,POM 不变就复用。cache: key: ${pom_hash} # 正确 # key: ${branch_name} # 错误 paths: [.m2/repository]
十、总结与展望
10.1 实践总结
这次把 SpringBoot 订单微服务完整接入华为云 CodeArts,我最大的体会是:CodeArts 不是某个单点工具的替代品,而是把"编码—审查—构建—部署—运维"串成闭环的工程平台。它的价值不在每个组件单独多强,而在端到端自动化后省下来的那些"搬运时间"和"等待时间"。
三个最值得的决策:
- AI 编码 + 静态检查组合拳:AI 提效 76%,但必须有 Check 兜底防"看似正确"的代码
- 流水线门禁前置:覆盖率、静态检查、依赖扫描全部在合并前阻断,问题进不了 main 分支
- 国产化同步推进:openGauss + 鲲鹏不是额外负担,而是享受到了原生优化收益
10.2 后续规划
- 接入 CodeArts Insight 效能看板,量化团队 DORA 指标(部署频率、变更前置时间、故障恢复时间、变更失败率)
- 试点 CodeArts IDE 的 Code Agent 能力,让它独立完成"加一个查询接口"这种小型任务
- 探索 昇腾 NPU + 盘古大模型 在订单异常检测上的应用,把 DevOps 链路延伸到 AIOps

互动引导:你的 SpringBoot 项目目前在 DevOps 的哪个环节最痛?是 AI 编码选型、CI/CD 自动化、还是国产化适配?欢迎评论区交流你的实践数据,我会逐条回复。
下一篇我将拆解 CodeArts Insight 效能看板 如何用 DORA 指标量化团队研发效能,敬请关注。
云原生实战系列文章导航:
| 文章 | 链接 |
|---|---|
| 第1篇:华为云码道 CodeArts 安装配置实战 | https://bbs.huaweicloud.cn/blogs/478402 |
| 第2篇:CodeArts Pipeline CI/CD 流水线实战 | https://bbs.huaweicloud.cn/blogs/478417 |
| 第3篇:Maven + Jib 构建镜像推送 SWR | https://bbs.huaweicloud.cn/blogs/479228 |
| 第4篇:CCE 部署 Java 微服务实战 | https://bbs.huaweicloud.cn/blogs/479788 |
| 第5篇:AOM/APM 全链路监控实战 | https://bbs.huaweicloud.cn/blogs/480182 |
| 第6篇:CodeArts Check 安全扫描实战 | https://bbs.huaweicloud.cn/blogs/481168 |
| 第7篇:PerfTest + HPA 性能优化实战 | https://bbs.huaweicloud.cn/blogs/481763 |
| 第8篇:全链路 DevOps 实战复盘 | https://bbs.huaweicloud.cn/blogs/481764 |
| 第9篇:CodeArts × SpringBoot 全流程实战(本篇) | 你在这里 |
- 点赞
- 收藏
- 关注作者
评论(0)