GitHub Workflow部署至Windows IIS服务器问题求助
解决.NET Core 7 API自动部署到Azure Windows IIS的GitHub Workflow问题
原配置核心问题
- 本地执行文件复制:原脚本中的
Copy-Item在GitHub Runner机器上运行,无法跨机器将文件传输到目标IIS服务器 - 硬编码路径依赖:直接写死Runner上的发布路径
D:\a\OmegaBloods\OmegaBloods\OmegaBloods\published,既不灵活也容易因Runner环境变化出错 - 缺失文件上传与解压环节:生成的压缩包未上传到目标服务器,后续目录操作无实际意义
- IIS重置时机不合理:未在文件部署完成后执行重置,且直接重置IIS会影响其他站点
修正后的完整Workflow配置
name: Deploy to IIS on: push: branches: - main jobs: build-and-deploy: runs-on: windows-latest steps: # 拉取仓库代码 - name: Checkout code uses: actions/checkout@v3 # 配置.NET 7.0环境 - name: Setup .NET 7.0 uses: actions/setup-dotnet@v3 with: dotnet-version: 7.0.x # 构建并发布API项目 - name: Build and Publish API working-directory: OmegaBloods run: dotnet publish -c Release -o ./published --no-restore # 部署到远程IIS服务器 - name: Deploy to Remote IIS env: IIS_SERVER_IP: ${{ secrets.IIS_SERVER_IP }} IIS_USERNAME: ${{ secrets.IIS_USERNAME }} IIS_PASSWORD: ${{ secrets.IIS_PASSWORD }} IIS_SITE_PATH: "C:\\inetpub\\wwwroot\\UserCentralAPI" IIS_SITE_NAME: "UserCentralAPI" working-directory: OmegaBloods/published run: | # 配置WinRM信任目标服务器 Set-Item WSMan:\localhost\Client\TrustedHosts -Value $env:IIS_SERVER_IP -Force # 生成项目压缩包 Compress-Archive -Path .\* -DestinationPath ..\app.zip -Force # 创建远程连接凭据 $securePass = ConvertTo-SecureString $env:IIS_PASSWORD -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($env:IIS_USERNAME, $securePass) # 上传压缩包到远程服务器临时目录 $remoteTempPath = "C:\Temp\app.zip" Copy-Item -Path ..\app.zip -Destination "\\$env:IIS_SERVER_IP\C$\Temp\app.zip" -Credential $cred # 远程执行部署逻辑 Invoke-Command -ComputerName $env:IIS_SERVER_IP -Credential $cred -ScriptBlock { param($sitePath, $tempZipPath, $siteName) # 停止目标IIS站点,避免文件被进程锁定 Stop-Website -Name $siteName # 清空站点目录下所有文件 Remove-Item -Path $sitePath\* -Recurse -Force -ErrorAction SilentlyContinue # 解压压缩包到站点目录 Expand-Archive -Path $tempZipPath -DestinationPath $sitePath -Force # 删除远程临时压缩包 Remove-Item -Path $tempZipPath -Force # 启动目标IIS站点 Start-Website -Name $siteName } -ArgumentList $env:IIS_SITE_PATH, $remoteTempPath, $env:IIS_SITE_NAME
关键修改说明
- 动态路径定位:通过
working-directory直接定位到发布目录,避免依赖Runner的绝对路径 - 跨机器文件传输:利用Windows网络共享路径
\\<IP>\C$结合凭据,将压缩包上传到目标服务器临时目录 - 远程部署逻辑优化:
- 先停止目标站点,解决文件被IIS进程锁定无法替换的问题
- 清空站点目录后再解压新文件,确保部署环境干净
- 使用启停单个站点替代全局IIS重置,减少对其他服务的影响
- 安全规范:所有敏感信息(IP、账号、密码)通过GitHub Secrets传递,避免明文暴露
前置检查事项
- 目标Azure Windows虚拟机已开启WinRM服务(默认Azure Windows VM已配置)
- 虚拟机防火墙允许WinRM端口(5985/http、5986/https)
- 部署账号拥有IIS站点目录的读写权限,以及IIS站点管理权限
- 目标服务器已创建
C:\Temp临时目录(可根据需求修改脚本中的临时路径)
内容的提问来源于stack exchange,提问作者CliffAnderson
相关产品推荐
相关产品推荐

