如何通过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部署流程(可选)
如果不想频繁启停应用池,可采用“临时目录中转”的方式:
- 将构建后的文件FTP上传到服务器的临时目录(如
/wwwroot/temp/); - 停止应用池后,用PowerShell将临时目录的文件移动覆盖到网站根目录;
- 启动应用池并清理临时目录。
对应的脚本示例:
# 上传到临时目录 - 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
相关产品推荐
相关产品推荐

