Prhub

#7315 [CI] Ensure container cleanup after job to avoid resource leakage

PaddlePaddle/FastDeploy · 作者 EmmonsCurse · 合并时间 2026-04-10 22:32

分析状态 已生成
文件变更 13提交数 2 · 评论 3
代码增减 +103 / -6
CI infra Optimization

执行摘要

为 CI workflow 添加容器清理步骤并移除不必要特权,防止资源泄漏。

根据 PR body,动机是 'The CI pipeline may leave behind running containers or uncleaned workspaces when jobs are canceled or fail unexpectedly. This can cause resource leakage, workspace conflicts, and instability in subsequent jobs.' 此外,'the use of --privileged in the build task is unnecessary for the current workflow and introduces avoidable security risks.'

建议 CI 维护者和基础设施工程师精读此 PR,重点关注清理步骤的实现细节(如 if: always() 条件的使用)和安全改进(移除 --privileged)。设计决策如移除 --rm 参数与显式清理的权衡,以及依赖预构建 wheel 的优化策略,值得学习以应用于其他 CI 优化场景。

讨论亮点

review 中,fastdeploy-bot 指出一个关键问题:在 .github/workflows/_build_linux.yml 中,docker run 使用了 --rm 参数,这会导致容器自动删除,使得后续清理步骤失效。建议移除 --rm 参数。结论是采纳该建议,确保清理逻辑正常工作。讨论没有其他未解决疑虑,ZhangYulongg 随后批准了 PR。

实现拆解

实现分为三个部分:1) 在 12 个 CI workflow 文件(如 .github/workflows/_accuracy_test.yml)中添加统一的清理步骤,使用 docker execdocker rm 命令在 if: always() 条件下执行,确保作业后容器清理和工作空间清空。2) 移除所有 docker run 命令中的 --privileged 参数,仅保留 --cap-add=SYS_PTRACE 以增强安全性。3) 更新 scripts/run_pre_ce.sh 脚本,使用预构建 wheel 文件从特定 URL 安装 xgrammar==0.1.19 和 torch==2.6.0,优化 CI 环境依赖管理。

文件 模块 状态 重要度
.github/workflows/_build_linux.yml CI/Workflow modified 8.0
scripts/run_pre_ce.sh CI/Script modified 5.0
.github/workflows/_accuracy_test.yml CI/Workflow modified 4.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

--rm 参数与清理步骤冲突 设计

fastdeploy-bot 在 .github/workflows/_build_linux.yml 中指出,`docker run` 使用 `--rm` 参数会导致容器自动删除,使得后续清理步骤中的 `docker exec` 和 `docker rm` 无法执行,工作空间清理将失效。

结论:采纳建议,移除 `--rm` 参数,以确保显式清理逻辑正常工作。 · 已解决

风险与影响

风险包括:1) 清理步骤依赖于 Docker 命令执行(如 docker execdocker rm),如果命令因权限问题或网络中断失败,可能导致容器或工作空间残留。2) 使用预构建 wheel 文件从特定 URL(https://paddle-qa.bj.bcebos.com/)安装依赖,增加了网络依赖风险,若资源不可用可能影响 CI 运行。3) 移除 --rm 参数后,如果清理步骤未正确执行(例如由于脚本错误),容器可能永久残留,造成资源泄漏。

对 CI 系统:显著减少资源泄漏和工作空间冲突,提升作业间隔离性和整体稳定性,特别是在作业取消或失败的场景下。对安全:移除 --privileged 参数降低了潜在攻击面,符合最小权限原则。对团队:减少因 CI 失败导致的调试时间和资源浪费,提高开发效率和 CI 可靠性。影响范围限于 CI 基础设施,不直接影响生产代码逻辑或用户功能。

清理步骤依赖外部命令 预构建 wheel 网络依赖 容器残留风险

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

本 PR 通过在所有主要 CI workflow 中添加容器清理步骤、移除不必要特权参数,并优化依赖安装方式,旨在解决资源泄漏问题,提升 CI 稳定性和安全性。变更影响 13 个文件,重点关注清理逻辑设计和安全权衡,建议 CI 维护者精读以借鉴优化策略。

功能与动机

动机源于 CI 管道在作业取消或失败时可能留下运行容器或未清理工作空间,导致资源泄漏、工作空间冲突和不稳定性。PR body 明确指出:"The CI pipeline may leave behind running containers or uncleaned workspaces when jobs are canceled or fail unexpectedly." 此外,移除 --privileged 参数以减少安全风险,因为当前工作流无需该特权。

实现拆解

实现按模块拆解如下:

  • CI Workflow 清理步骤:在 12 个 .github/workflows/ 下的 YAML 文件(如 _accuracy_test.yml_base_test.yml)中添加统一步骤,使用 if: always() 条件确保作业后执行 docker exec -t ${{ runner.name }} /bin/bash -c 'find /workspace -mindepth 1 -delete'docker rm -f ${{ runner.name }},清理工作空间和容器。
  • 安全性改进:从所有 docker run 命令中移除 --privileged 参数,仅保留 --cap-add=SYS_PTRACE,示例变更:
    ```yaml
    docker run --rm --net=host \
  • --cap-add=SYS_PTRACE --privileged --shm-size=64G \
  • --cap-add=SYS_PTRACE --shm-size=64G \
    ```
  • 依赖管理优化:在 scripts/run_pre_ce.sh 中,将直接安装 xgrammar==0.1.19torch==2.6.0 替换为使用预构建 wheel 文件,从特定 URL 下载以加速 CI 环境设置。

评论区精华

review 讨论中最有价值的交锋集中于 --rm 参数的设计权衡:

fastdeploy-bot 指出:"docker run 使用了 --rm 参数,导致容器在退出时自动删除。后续清理步骤中的 docker rm -f ${{ runner.name }} 会因容器已不存在而失败,且 docker exec 在容器退出后无法执行工作空间清理。建议移除 --rm 参数。"

结论是采纳该建议,移除 --rm 以确保显式清理逻辑生效,这体现了在自动化清理与容器生命周期管理之间的重要设计决策。

风险与影响

风险

  • 清理步骤依赖 Docker 命令,若执行失败(如权限不足或网络问题)可能导致残留。
  • 预构建 wheel 文件从外部 URL 安装,增加了网络依赖和版本锁定风险,若资源不可用可能中断 CI。
  • 移除 --rm 后,如果清理步骤未触发,容器可能永久残留,需监控清理成功率。

影响

  • 对系统:减少 CI 资源泄漏,提升作业隔离性和稳定性,预期降低因残留容器导致的故障率。
  • 对安全:移除 --privileged 降低攻击面,符合安全最佳实践。
  • 对团队:提高开发效率,减少 CI 失败后的手动清理工作,影响范围限于基础设施层。

关联脉络

从历史 PR 看,本 PR 与近期多个 CI 优化 PR 形成脉络:

  • PR #7289 修复预构建 wheel 安装,与本 PR 的依赖管理优化相关联。
  • PR #7283 添加 no_proxy 配置,同属 CI 网络和稳定性改进系列。
    这些 PR 共同反映了团队持续投入 CI 基础设施的健壮性优化,以支持 FastDeploy 项目的高频集成和测试需求。

参与讨论