求Azure DevOps Pipeline通过FTP部署非Azure站点的App_Offline YAML方案
实现方案
本方案适配仅拥有FTP权限的非Azure站点部署场景,通过Azure DevOps内置的FTP任务分三步完成自动化操作,全程无需手动介入:
- 先上传App_Offline.html到站点根目录,触发ASP.NET Core自动下线释放文件锁
- 等待几秒确保站点进程完全停止后,上传完整的站点部署文件
- 部署完成后删除App_Offline.html,站点自动恢复启动
前置准备
- 将自定义的App_Offline.html存放到代码仓库根目录
- 在流水线的变量配置中添加3个机密变量:
ftpServer(FTP服务地址,如ftp://yourdomain.com)、ftpUsername(FTP登录账号)、ftpPassword(FTP登录密码)
完整YAML示例
trigger: - main # 按你的实际触发分支修改 pool: vmImage: 'windows-latest' # 使用Linux镜像也支持内置FTP任务 variables: # 站点根目录的FTP路径,按你的实际配置修改 ftpRootPath: '/' # 本地构建输出的站点文件路径,按你的实际配置修改 localPublishPath: '$(Build.ArtifactStagingDirectory)/publish' steps: # 第一步:构建生成站点部署文件,可根据你的实际构建逻辑调整 - task: DotNetCoreCLI@2 inputs: command: 'publish' publishWebProjects: true arguments: '--configuration Release --output $(localPublishPath)' zipAfterPublish: false # 第二步:上传App_Offline.html到站点根目录 - task: FtpUpload@2 inputs: credentialsOption: 'inputs' serverUrl: '$(ftpServer)' username: '$(ftpUsername)' password: '$(ftpPassword)' rootDirectory: '.' filePatterns: 'App_Offline.html' remoteDirectory: '$(ftpRootPath)' clean: false overwrite: true preservePaths: false # 第三步:等待5秒,确保ASP.NET Core进程完全停止释放文件锁 - task: Delay@1 inputs: delayForMinutes: '0' delayForSeconds: '5' # 第四步:上传完整的站点部署文件 - task: FtpUpload@2 inputs: credentialsOption: 'inputs' serverUrl: '$(ftpServer)' username: '$(ftpUsername)' password: '$(ftpPassword)' rootDirectory: '$(localPublishPath)' filePatterns: '**' remoteDirectory: '$(ftpRootPath)' clean: false # 如需先清空目标目录再上传可改为true,操作前请确认不会误删站点其他文件 overwrite: true preservePaths: true # 第五步:删除站点根目录的App_Offline.html,恢复站点访问 - task: FtpDelete@2 inputs: credentialsOption: 'inputs' serverUrl: '$(ftpServer)' username: '$(ftpUsername)' password: '$(ftpPassword)' rootDirectory: '$(ftpRootPath)' filePatterns: 'App_Offline.html'
注意事项
- 若部署过程中出现异常,可在流水线中添加失败触发的清理任务,执行删除App_Offline.html的操作,避免站点持续处于下线状态
- 如果你的FTP站点需要被动模式连接,可以在FTP任务的高级选项中开启被动模式
- 机密变量配置后不会在流水线日志中明文显示,可避免账号密码泄露
内容的提问来源于stack exchange,提问作者philw
相关产品推荐
相关产品推荐

