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

使用GitHub Workflow部署Azure虚拟应用的目录清理问题

如何在部署Azure App Service虚拟应用时仅清理目标目录?

我通过GitHub Workflow将API部署为Azure App Service的虚拟应用(路径/api/service1/),部署能成功完成,但SCM门户里其他虚拟应用会被删除。当前遇到的矛盾是:

  • 设置clean: true会清空整个wwwroot目录,连带删除所有其他虚拟应用
  • 设置clean: false则不会删除wwwroot内容,但目标虚拟应用里会残留旧的二进制文件(比如dll)

我的Workflow文件如下:

deploy:
    if: ${{ github.ref == inputs.branch_name }}
    name: Deploying app on Azure
    runs-on: [self-hosted-linux]
    needs: [publish_artifacts]
    environment:
      name: ${{ inputs.environment_name }}
    steps:
      - name: Install az cli
        uses: elstudio/action-install-azure-cli@v1

      # authenticate to azure
      - name: "Az CLI login"
        uses: azure/login@v1.5.1
        with:
          creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}","tenantId":"${{ env.AZURE_TENANT_ID }}"}'

      - name: Download published artifact
        uses: actions/download-artifact@v3
        with:
          name: dev-artifact

      - name: Deploy to Azure Web App
        uses: azure/webapps-deploy@v3
        id: deploy-to-webapp
        with:
          app-name: "${{ inputs.azure_app_name }}"
          package: ${{ github.WORKSPACE }}
          target-path: ${{ inputs.virtual_app_path}}
          clean: true 

需要实现仅删除指定虚拟目录内的文件,保留wwwroot下其他所有虚拟应用目录的效果,解决方法如下:


解决方案:手动清理目标目录后部署

azure/webapps-deploy的clean参数目前是针对整个wwwroot目录生效的,无法单独作用于指定的虚拟应用路径。因此可以通过以下步骤实现精准清理:

  1. 添加手动清理步骤:在部署前,使用Azure CLI登录到Web App的SSH环境,删除目标虚拟目录下的所有内容
  2. 修改部署参数:将clean设置为false,避免误删其他虚拟应用

修改后的完整Workflow文件:

deploy:
    if: ${{ github.ref == inputs.branch_name }}
    name: Deploying app on Azure
    runs-on: [self-hosted-linux]
    needs: [publish_artifacts]
    environment:
      name: ${{ inputs.environment_name }}
    steps:
      - name: Install az cli
        uses: elstudio/action-install-azure-cli@v1

      # authenticate to azure
      - name: "Az CLI login"
        uses: azure/login@v1.5.1
        with:
          creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}","tenantId":"${{ env.AZURE_TENANT_ID }}"}'

      - name: Download published artifact
        uses: actions/download-artifact@v3
        with:
          name: dev-artifact

      # 新增:清理目标虚拟应用目录下的所有文件和子目录
      - name: Clean target virtual app directory
        run: |
          az webapp ssh --name ${{ inputs.azure_app_name }} --command "rm -rf /home/site/wwwroot${{ inputs.virtual_app_path}}/*"

      - name: Deploy to Azure Web App
        uses: azure/webapps-deploy@v3
        id: deploy-to-webapp
        with:
          app-name: "${{ inputs.azure_app_name }}"
          package: ${{ github.WORKSPACE }}
          target-path: ${{ inputs.virtual_app_path}}
          clean: false 

说明

  • rm -rf /home/site/wwwroot${{ inputs.virtual_app_path}}/*命令会删除目标虚拟目录下的所有内容,但保留目录本身(避免虚拟应用配置失效)
  • 设置clean: false后,部署过程只会将新文件上传到目标目录,不会改动wwwroot下的其他文件或目录
  • 如果你的虚拟应用路径以/开头(比如/api/service1/),命令中的路径拼接会自动形成正确的绝对路径/home/site/wwwroot/api/service1/*

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:25:06