You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action推送部署时如何保留服务器src/uploads文件夹不被覆盖?

问题根源

你当前CI流水线的问题出在actions/checkout@v2步骤默认开启了工作区清理,会删除所有不在Git仓库内的文件,你服务器本地的src/uploads目录属于未入库的用户生成内容,自然会在每次部署时被清空。以下是几种可落地的解决方案:


方案1:将用户上传目录与代码仓库解耦(最推荐)

这是行业通用的最佳实践,用户生成资源本身就不应该和代码部署目录绑定:

  • 在服务器上新建独立的存储目录,比如/opt/project-uploads,给该目录配置运行Node.js服务的用户读写权限
  • 修改Node.js项目里的文件上传存储路径、静态资源服务路径,都指向这个独立目录
  • 后续任何代码部署操作都不会触及该目录,从根源避免文件被覆盖的问题,也方便后续做资源备份、CDN加速等扩展操作

方案2:调整CI流程,备份/恢复上传目录

如果你暂时不想修改代码里的路径配置,可以调整工作流,在拉取代码前备份上传目录,拉取完成后再还原,修改后的工作流配置如下:

on:
  push:
    branches: [ dev ]
  pull_request:
    branches: [ dev ]

jobs:
  build:
    runs-on: self-hosted
    strategy:
      matrix:
        node-version: [14.x]
    steps:
    # 备份现有上传目录到临时位置
    - name: Backup uploads directory
      run: |
        if [ -d "src/uploads" ]; then
          rm -rf /tmp/project-uploads-backup
          mv src/uploads /tmp/project-uploads-backup
        fi
    - uses: actions/checkout@v2
    # 恢复上传目录到原位置
    - name: Restore uploads directory
      run: |
        rm -rf src/uploads
        mv /tmp/project-uploads-backup src/uploads
        # 按需修改为运行Node服务的用户和用户组,确保目录权限正确
        chown -R node:node src/uploads
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm i
    - run: npm run build
    - run: pm2 restart project-api

方案3:关闭checkout的自动清理(临时方案,不推荐长期使用)

你也可以直接给actions/checkout添加参数关闭工作区清理,避免删除非仓库文件,仅修改checkout步骤即可:

- uses: actions/checkout@v2
  with:
    clean: false

该方案的副作用是仓库里已经删除的旧代码文件会残留在服务器上,可能导致未知的运行问题,仅适合临时应急使用。


内容的提问来源于stack exchange,提问作者Ujjal Acharya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:00:00