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
相关产品推荐
相关产品推荐

