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

如何修改GitHub Actions工作流:跳过.NET构建仅部署wwwroot且不破坏应用

解决方案:优化ASP.NET Core项目的GitHub Actions部署流程

问题分析

仅部署wwwroot导致应用崩溃的核心原因:ASP.NET Core应用运行依赖根目录的web.config、bin目录下的程序集、appsettings.json等核心文件;如果项目启用了静态文件捆绑/压缩/哈希处理(比如BuildBundlerMinifier或ASP.NET Core静态文件优化),直接上传未经过构建流程的wwwroot文件,会和已部署应用的静态文件索引不匹配,最终引发资源找不到的错误。

实现思路

分两种场景处理部署流程,兼顾效率与应用稳定性:

  1. 全构建部署:当提交包含[build]标记,或修改了wwwroot以外的文件(如API代码、配置文件)时,执行完整的构建、发布、全量部署流程。
  2. 静态文件增量部署:仅当wwwroot内文件修改时,跳过.NET构建流程,直接将更新后的静态文件同步到Azure Web Apps的wwwroot目录,保留应用核心文件不被覆盖。

GitHub Actions工作流示例

name: Deploy to Azure Web Apps

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Detect changes and check build flag
        id: changes
        uses: dorny/paths-filter@v3
        with:
          filters: |
            non-wwwroot:
              - '!wwwroot/**'
          env:
            BUILD_FLAG: ${{ contains(github.event.head_commit.message, '[build]') }}

      - name: Setup .NET
        if: steps.changes.outputs.non-wwwroot == 'true' || env.BUILD_FLAG == 'true'
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0.x' # 替换为你的.NET版本

      - name: Full build and publish
        if: steps.changes.outputs.non-wwwroot == 'true' || env.BUILD_FLAG == 'true'
        run: |
          dotnet restore
          dotnet build --configuration Release --no-restore
          dotnet publish --configuration Release --no-build --output ./publish

      - name: Deploy full app to Azure
        if: steps.changes.outputs.non-wwwroot == 'true' || env.BUILD_FLAG == 'true'
        uses: azure/webapps-deploy@v3
        with:
          app-name: ${{ secrets.AZURE_WEBAPP_NAME }}
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
          package: ./publish

      - name: Deploy only wwwroot to Azure
        if: steps.changes.outputs.non-wwwroot != 'true' && env.BUILD_FLAG != 'true'
        uses: azure/webapps-deploy@v3
        with:
          app-name: ${{ secrets.AZURE_WEBAPP_NAME }}
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
          package: ./wwwroot
          # 关键:静态文件部署模式,不覆盖核心文件、不重启应用
          deployment-type: static

关键注意事项

  • 静态部署模式:deployment-type: static参数会让Azure仅同步指定目录的文件,不会覆盖应用核心文件,也不会重启API服务,避免业务中断。
  • 构建标记优先级:提交信息中的[build]标记可强制触发全构建,用于需要更新静态文件优化产物(如捆绑压缩后的文件)的场景。
  • 首次部署要求:必须先执行一次全构建部署,确保Azure上存在完整的应用核心文件,后续的增量静态部署才能正常工作。
  • 静态文件优化兼容:如果项目使用静态文件捆绑/压缩,建议在全构建阶段执行相关操作;若要在增量部署时同步优化后的文件,需确保提交的wwwroot是本地预构建后的产物。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:47:41