使用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目录生效的,无法单独作用于指定的虚拟应用路径。因此可以通过以下步骤实现精准清理:
- 添加手动清理步骤:在部署前,使用Azure CLI登录到Web App的SSH环境,删除目标虚拟目录下的所有内容
- 修改部署参数:将
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
相关产品推荐
相关产品推荐

