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

GitHub Workflow部署至Windows IIS服务器问题求助

解决.NET Core 7 API自动部署到Azure Windows IIS的GitHub Workflow问题

原配置核心问题

  1. 本地执行文件复制:原脚本中的Copy-Item在GitHub Runner机器上运行,无法跨机器将文件传输到目标IIS服务器
  2. 硬编码路径依赖:直接写死Runner上的发布路径D:\a\OmegaBloods\OmegaBloods\OmegaBloods\published,既不灵活也容易因Runner环境变化出错
  3. 缺失文件上传与解压环节:生成的压缩包未上传到目标服务器,后续目录操作无实际意义
  4. 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传递,避免明文暴露

前置检查事项

  1. 目标Azure Windows虚拟机已开启WinRM服务(默认Azure Windows VM已配置)
  2. 虚拟机防火墙允许WinRM端口(5985/http、5986/https)
  3. 部署账号拥有IIS站点目录的读写权限,以及IIS站点管理权限
  4. 目标服务器已创建C:\Temp临时目录(可根据需求修改脚本中的临时路径)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:59