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

如何通过GitHub Actions用FTP/FTPS部署应用至IIS?解决重复部署失败问题

解决GitHub Actions FTP部署IIS时文件被占用的问题

首次部署成功但后续失败,核心原因是IIS应用池仍在运行,占用了网站目录中的可执行文件或依赖库,导致FTP无法替换或删除这些被锁定的文件。以下是具体解决方法:

一、部署前后启停IIS应用池

通过远程执行PowerShell命令,在部署前停止应用池释放文件锁;部署完成后重新启动应用池恢复服务。

GitHub Actions配置示例

在你的Workflow文件中,在FTP部署步骤前后添加远程执行脚本的步骤:

# 停止目标应用池
- name: Stop IIS App Pool
  uses: appleboy/ssh-action@v0.1.5
  with:
    host: ${{ secrets.IIS_SERVER_HOST }}
    username: ${{ secrets.IIS_SERVER_USER }}
    password: ${{ secrets.IIS_SERVER_PASS }}
    script: |
      Import-Module WebAdministration
      Stop-WebAppPool -Name "你的应用池名称"

# FTP部署步骤(原有的部署逻辑)
- name: Deploy via FTP
  uses: SamKirkland/FTP-Deploy-Action@v4.3.4
  with:
    server: ${{ secrets.FTP_SERVER }}
    username: ${{ secrets.FTP_USERNAME }}
    password: ${{ secrets.FTP_PASSWORD }}
    local-dir: ./dist/
    server-dir: /wwwroot/

# 启动目标应用池
- name: Start IIS App Pool
  uses: appleboy/ssh-action@v0.1.5
  with:
    host: ${{ secrets.IIS_SERVER_HOST }}
    username: ${{ secrets.IIS_SERVER_USER }}
    password: ${{ secrets.IIS_SERVER_PASS }}
    script: |
      Import-Module WebAdministration
      Start-WebAppPool -Name "你的应用池名称"

注意事项

  • 确保服务器已开启SSH或WinRM服务,允许远程执行PowerShell命令;
  • 将服务器地址、用户名、密码等敏感信息存到GitHub仓库的Secrets中,避免明文暴露;
  • 替换你的应用池名称为实际的IIS应用池名称。

二、优化FTP部署流程(可选)

如果不想频繁启停应用池,可采用“临时目录中转”的方式:

  1. 将构建后的文件FTP上传到服务器的临时目录(如/wwwroot/temp/);
  2. 停止应用池后,用PowerShell将临时目录的文件移动覆盖到网站根目录;
  3. 启动应用池并清理临时目录。

对应的脚本示例:

# 上传到临时目录
- name: Upload to Temp Directory
  uses: SamKirkland/FTP-Deploy-Action@v4.3.4
  with:
    server: ${{ secrets.FTP_SERVER }}
    username: ${{ secrets.FTP_USERNAME }}
    password: ${{ secrets.FTP_PASSWORD }}
    local-dir: ./dist/
    server-dir: /wwwroot/temp/

# 停止应用池+替换文件+启动应用池
- name: Replace Files and Restart App Pool
  uses: appleboy/ssh-action@v0.1.5
  with:
    host: ${{ secrets.IIS_SERVER_HOST }}
    username: ${{ secrets.IIS_SERVER_USER }}
    password: ${{ secrets.IIS_SERVER_PASS }}
    script: |
      Import-Module WebAdministration
      Stop-WebAppPool -Name "你的应用池名称"
      Move-Item -Path "C:\inetpub\wwwroot\temp\*" -Destination "C:\inetpub\wwwroot\" -Force
      Remove-Item -Path "C:\inetpub\wwwroot\temp\" -Recurse -Force
      Start-WebAppPool -Name "你的应用池名称"

三、检查应用池回收设置

可以在IIS中配置应用池的自动回收规则,比如特定时间回收或文件变化时触发回收,但这种方式不如手动启停可控。若采用自动回收,需确保回收时机与部署时间错开,避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:01:42