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

如何通过GitHub Actions部署指定目录至Azure Web App并保留Python绝对导入

保留Python绝对导入的Azure Web App部署方案

问题背景

GitHub仓库根目录包含前端client文件夹与后端server文件夹,需分别部署至同一App Service计划下的独立Azure Web App。现有GitHub Action可将server文件夹内容部署至Web App,但Python后端使用绝对导入(如from server.module import something)时失效——因Azure Web App根目录无server文件夹,改为from module import something可正常运行。需在保留绝对导入的前提下完成部署,推测可将所有内容放入server文件夹并修改启动命令指向新路径的app.py,但需调整GitHub Action配置。

当前GitHub Action YAML配置:

on:
  push:
    branches:
      - beta
    paths:
      - 'server/**'
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python version
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Create and start virtual environment
        run: |
          python -m venv venv
          source venv/bin/activate
        working-directory: ./server
      
      - name: Install dependencies
        run: pip install -r requirements.txt
        working-directory: ./server
        
      # Optional: Add step to run tests here (PyTest, Django test suites, etc.)

      - name: Upload artifact for deployment jobs
        uses: actions/upload-artifact@v4
        with:
          name: python-app
          path: |
            ./server
            !venv/

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
    
    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v4
        with:
          name: python-app
          path: ./server
      - name: Deploy web App using GH Action azure/webapps-deploy
        uses: azure/webapps-deploy@v3
        with:
          app-name: <our_app_name>
          slot-name: 'production'
          publish-profile: ${{ secrets.BACKEND_PUBLISH_PROFILE }}
          package: ./server

解决方案

核心逻辑

要保留from server.module import ...的绝对导入,需让Azure Web App运行环境中,server文件夹处于Python模块搜索路径内,部署时需将整个server文件夹作为Web App根目录的子目录,而非直接将server内的内容放到根目录。

具体调整步骤

1. 修改GitHub Action配置

调整构建与部署环节的路径,确保整个server文件夹被部署到Web App根目录:

on:
  push:
    branches:
      - beta
    paths:
      - 'server/**'
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python version
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Create and start virtual environment
        run: |
          python -m venv venv
          source venv/bin/activate
        working-directory: ./server
      
      - name: Install dependencies
        run: pip install -r requirements.txt
        working-directory: ./server
        
      # Optional: Add step to run tests here (PyTest, Django test suites, etc.)

      - name: Upload artifact for deployment jobs
        uses: actions/upload-artifact@v4
        with:
          name: python-app
          path: |
            ./server/
            !./server/venv/

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
    
    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v4
        with:
          name: python-app
          path: .  # 直接下载到当前目录,保留server文件夹结构
      - name: Deploy web App using GH Action azure/webapps-deploy
        uses: azure/webapps-deploy@v3
        with:
          app-name: <our_app_name>
          slot-name: 'production'
          publish-profile: ${{ secrets.BACKEND_PUBLISH_PROFILE }}
          package: .  # 部署当前目录,包含server文件夹

关键修改点:

  • 上传artifact时,路径明确为./server/,确保文件夹结构被保留
  • 下载artifact时,路径设为.,直接将server文件夹放到部署目录根
  • 部署时,package参数设为.,将包含server的整个目录部署到Web App

2. 配置Azure Web App启动命令

部署完成后,Web App根目录下会存在server文件夹,需修改启动命令指向server内的入口文件:

  • 登录Azure门户,进入后端Web App的「配置」→「通用设置」
  • 在「启动命令」中填写对应启动指令,示例:
    • 使用Gunicorn:gunicorn --bind=0.0.0.0 --timeout 600 server.app:app
    • 使用Uvicorn:uvicorn server.app:app --host 0.0.0.0 --port 8000
      (需根据实际入口文件调整,如server.main:app)

3. 验证模块路径(可选)

若启动后仍存在导入问题,可在代码中添加以下代码确认Python模块搜索路径:

import sys
print(sys.path)

需确保Web App根目录(默认/home/site/wwwroot)在sys.path中,这样server文件夹会被识别为合法Python模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:22