分析 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工具
相关专题
设置方法: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自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。
4243
2024.12.20
安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。
1870
2023.10.09
Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。
0
2026.10.28
Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。
0
2026.10.28
Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。
0
2026.10.28
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
热门下载
相关下载
精品课程
最新文章
