讲师中心 微信公众号
AI工具推荐 视频效率加速

CI Pipeline Optimizer

Polar Sponsor
爱发电 赞助
.NET 9.0

分析 CI/CD 流水线(GitHub Actions、GitLab CI、CircleCI)并提出优化建议——缓存策略、并行化、步骤精简、Docker 层等。

CI 管道优化器

功能概述

CI 管道优化器是一项面向实际任务的技能,主要用于使 CI/ CD 管道更快、 更便宜;分析工作流程文件以找到瓶颈、 缺少缓存、 串行步骤可以平行运行、 不必要的工作以及过度的。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

CI 流水线优化器

让 CI/CD 流水线更快、更省钱。分析工作流文件,识别性能瓶颈、缺失的缓存、本可并行执行却串行运行的步骤、不必要的工作,以及过大的 Docker 构建。

适用场景:”CI 太慢了“、”优化我们的流水线“、”缩短构建时间“、”CI 成本太高“、”加速 GitHub Actions“、”流水线耗时 20 分钟“,或进行 CI/CD 维护工作。

命令

1. analyze — 全量流水线分析

扫描所有 CI 配置文件,识别可优化项。

步骤 1:发现流水线配置

echo "=== CI 流水线发现 ==="

# GitHub Actions
if [ -d ".github/workflows" ]; then
  echo "平台: GitHub Actions"
  ls -la .github/workflows/*.yml .github/workflows/*.yaml 2>/dev/null
fi

# GitLab CI
[ -f ".gitlab-ci.yml" ] && echo "平台: GitLab CI"

# CircleCI
[ -f ".circleci/config.yml" ] && echo "平台: CircleCI"

# Jenkins
[ -f "Jenkinsfile" ] && echo "平台: Jenkins"

# Bitbucket
[ -f "bitbucket-pipelines.yml" ] && echo "平台: Bitbucket Pipelines"

# Azure DevOps
[ -f "azure-pipelines.yml" ] && echo "平台: Azure DevOps"

步骤 2:缓存分析

echo ""
echo "=== 缓存分析 ==="

# GitHub Actions:检查缓存步骤
if [ -d ".github/workflows" ]; then
  echo "--- 缓存使用情况 ---"
  rg -n "actions/cache|cache:" .github/workflows/ 2>/dev/null

  # 检查是否缓存了 node_modules
  HAS_NODE_CACHE=$(rg -c "node_modules|npm-cache|yarn-cache|pnpm-store" .github/workflows/ 2>/dev/null | awk -F: '{s+=$2} END {print s+0}')
  [ -f "package.json" ] && [ "$HAS_NODE_CACHE" -eq 0 ] && echo "⚠️  缺失:Node.js 依赖缓存"

  # 检查是否配置了 pip 缓存
  HAS_PIP_CACHE=$(rg -c "pip-cache|pip.*cache|~/.cache/pip" .github/workflows/ 2>/dev/null | awk -F: '{s+=$2} END {print s+0}')
  [ -f "requirements.txt" ] && [ "$HAS_PIP_CACHE" -eq 0 ] && echo "⚠️  缺失:Python pip 缓存"

  # 检查是否启用 Docker 层缓存
  HAS_DOCKER_CACHE=$(rg -c "docker/build-push-action.*cache|buildx.*cache|docker-layer-caching" .github/workflows/ 2>/dev/null | awk -F: '{s+=$2} END {print s+0}')
  HAS_DOCKER=$(rg -c "docker build|docker-compose|docker/build-push" .github/workflows/ 2>/dev/null | awk -F: '{s+=$2} END {print s+0}')
  [ "$HAS_DOCKER" -gt 0 ] && [ "$HAS_DOCKER_CACHE" -eq 0 ] && echo "⚠️  缺失:Docker 层缓存"

  # 检查是否启用构建产物缓存(turbo、nx)
  [ -f "turbo.json" ] && ! rg -q "turborepo-cache|turbo.*cache" .github/workflows/ 2>/dev/null && echo "⚠️  缺失:Turborepo 远程缓存"
fi

# GitLab CI
if [ -f ".gitlab-ci.yml" ]; then
  rg -n "cache:" .gitlab-ci.yml 2>/dev/null
  HAS_CACHE=$(rg -c "cache:" .gitlab-ci.yml 2>/dev/null || echo "0")
  [ "$HAS_CACHE" -eq 0 ] && echo "⚠️  .gitlab-ci.yml 中未配置缓存"
fi

步骤 3:并行化分析

echo ""
echo "=== 并行化机会 ==="

if [ -d ".github/workflows" ]; then
  # 查找存在串行任务但可改为并行的工作流
  for wf in .github/workflows/*.yml .github/workflows/*.yaml; do
    [ -f "$wf" ] || continue
    echo "--- $(basename $wf) ---"

    # 检查是否含 needs:(任务依赖)
    JOBS=$(rg -c "^s{2}w+:" "$wf" 2>/dev/null || echo "0")
    NEEDS=$(rg -c "needs:" "$wf" 2>/dev/null || echo "0")

    echo "  任务数: $JOBS, 依赖项 (needs): $NEEDS"

    if [ "$JOBS" -gt 1 ] && [ "$NEEDS" -eq 0 ]; then
      echo "  ✅ 任务并行执行(无依赖)"
    elif [ "$NEEDS" -gt 0 ]; then
      echo "  检查是否可移除部分 'needs' 以支持并行执行:"
      rg -n "needs:" "$wf" 2>/dev/null | head -5
    fi

    # 检查是否使用 matrix 策略
    HAS_MATRIX=$(rg -c "matrix:" "$wf" 2>/dev/null || echo "0")
    [ "$HAS_MATRIX" -gt 0 ] && echo "  ✅ 使用 matrix 策略"

    # 检查是否存在可拆分为并行任务的步骤
    STEPS=$(rg -c "^s*- (name|run|uses):" "$wf" 2>/dev/null || echo "0")
    [ "$STEPS" -gt 15 ] && echo "  ⚠️  单个任务中含 $STEPS 个步骤 — 建议拆分为并行任务"
  done
fi

步骤 4:冗余工作检测

echo ""
echo "=== 冗余工作 ==="

if [ -d ".github/workflows" ]; then
  for wf in .github/workflows/*.yml .github/workflows/*.yaml; do
    [ -f "$wf" ] || continue

    # 检查路径过滤器(仅在相关变更时运行)
    HAS_PATHS=$(rg -c "paths:" "$wf" 2>/dev/null || echo "0")
    [ "$HAS_PATHS" -eq 0 ] && echo "⚠️  $(basename $wf):未配置路径过滤器 — 将响应所有文件变更"

    # 检查条件执行逻辑
    HAS_IF=$(rg -c "if:" "$wf" 2>/dev/null || echo "0")
    echo "  $(basename $wf):$HAS_IF 个条件步骤"

    # 全量检出 vs 浅层检出
    FULL_CHECKOUT=$(rg -c "fetch-depth: 0" "$wf" 2>/dev/null || echo "0")
    [ "$FULL_CHECKOUT" -gt 0 ] && echo "  ⚠️  全量 Git 历史检出(fetch-depth: 0)— 是否必需?"

    # 多次 npm install 步骤
    NPM_INSTALLS=$(rg -c "npm install|npm ci|yarn install|pnpm install" "$wf" 2>/dev/null || echo "0")
    [ "$NPM_INSTALLS" -gt 1 ] && echo "  ⚠️  $NPM_INSTALLS 个独立安装步骤 — 建议合并或启用缓存"
  done
fi

步骤 5:Docker 构建优化

echo ""
echo "=== Docker 构建优化 ==="

find . -name "Dockerfile" -not -path '*/node_modules/*' 2>/dev/null | while read df; do
  echo "--- $df ---"
  LINES=$(wc -l < "$df")
  echo "  行数: $LINES"

  # 是否为多阶段构建?
  STAGES=$(grep -c "^FROM " "$df")
  [ "$STAGES" -gt 1 ] && echo "  ✅ 多阶段构建($STAGES 个阶段)" || echo "  ⚠️  单阶段构建 — 建议改用多阶段以减小镜像体积"

  # 在包安装前执行 COPY(破坏缓存)
  COPY_ALL=$(grep -n "COPY . .|COPY ./ " "$df" | head -1 | cut -d: -f1)
  RUN_INSTALL=$(grep -n "npm install|npm ci|pip install|go build" "$df" | head -1 | cut -d: -f1)
  if [ -n "$COPY_ALL" ] && [ -n "$RUN_INSTALL" ] && [ "$COPY_ALL" -lt "$RUN_INSTALL" ]; then
    echo "  ⚠️  在 install 前执行 COPY . — 每次文件变更都会破坏 Docker 缓存"
    echo "     修复建议:先 COPY package*.json,再 install,最后 COPY 其余文件"
  fi

  # 是否存在 .dockerignore?
  DIR=$(dirname "$df")
  [ -f "$DIR/.dockerignore" ] || [ -f ".dockerignore" ] || echo "  ⚠️  缺失 .dockerignore — 向 Docker 守护进程发送了不必要的文件"

  # 基础镜像是否过大?
  BASE=$(grep "^FROM " "$df" | tail -1 | awk '{print $2}')
  echo "$BASE" | grep -qE "^(ubuntu|debian|centos|node:|python:)" && 
    ! echo "$BASE" | grep -qE "(slim|alpine|distroless)" && 
    echo "  ⚠️  基础镜像过大($BASE)— 建议改用 slim/alpine/distroless 变体"
done

2. cache — 缓存配置建议

为项目生成具体的缓存配置:

# GitHub Actions + Node.js 场景
- uses: actions/cache@v4
  with:
    path: |
      ~/.npm
      node_modules
    key: node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: node-

各技术生态推荐方案:

  • Node.js:基于 lockfile 哈希缓存 node_modules 或 ~/.npm
  • Python:基于 requirements.txt 哈希缓存 ~/.cache/pip
  • Go:基于 go.sum 哈希缓存 ~/go/pkg/mod
  • Rust:基于 Cargo.lock 哈希缓存 ~/.cargo 和 target/
  • Docker:使用 BuildKit cache mount 或 docker/build-push-action 缓存

3. timeline — 构建时间线可视化

解析 CI 日志或配置,估算任务耗时:

流水线: build-and-test.yml
总预估耗时:~12 分钟(串行)→ ~6 分钟(优化后)

[lint]        ████░░░░░░░░  2 分钟
[test]        ██████████░░  5 分钟  (依赖:lint)
[build]       ████████░░░░  4 分钟  (依赖:lint)
[deploy]      ██░░░░░░░░░░  1 分钟  (依赖:test, build)

优化建议:并行执行 [test] 和 [build] → 节省 4 分钟

4. suggest — 生成优化后的流水线

输出已应用全部优化项的重写版流水线:

  • 添加缓存配置
  • 对相互独立的任务启用并行化
  • 添加路径过滤器
  • 优化 Docker 构建流程
  • 为仅文档变更等场景添加条件执行逻辑以跳过无关步骤

输出格式

  • text(默认):面向人类阅读的分析报告与优化建议
  • json:{platform, workflows: [{name, jobs, steps, caches, issues: []}], optimizations: [], estimated_savings: ""}
  • markdown:适用于 PR 描述或 Wiki 文档的报告
  • yaml:可直接使用的优化后工作流配置

注意事项

  • 支持 GitHub Actions、GitLab CI、CircleCI 和 Jenkinsfile 的静态分析
  • 不访问 CI 日志或运行历史 — 仅静态分析配置文件
  • 时间预估为启发式结果(基于常见操作的典型耗时)
  • 缓存建议具备框架感知能力,并遵循当前最佳实践
  • Docker 优化检查覆盖项目中所有 Dockerfile
  • 针对单体仓库(monorepo),建议采用路径过滤触发机制及影响范围测试(affected-only testing)
目录

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

2487

2025.07.23

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

5722

2024.12.23

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

4243

2024.12.20

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

1870

2023.10.09

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

0

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

0

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

Python虚拟环境官方教程
Python虚拟环境官方教程

共0课时 | 0人学习

Python venv官方模块文档
Python venv官方模块文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn