如何通过GitHub Actions部署指定目录至Azure Web App并保留Python绝对导入
问题背景
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)
- 使用Gunicorn:
3. 验证模块路径(可选)
若启动后仍存在导入问题,可在代码中添加以下代码确认Python模块搜索路径:
import sys print(sys.path)
需确保Web App根目录(默认/home/site/wwwroot)在sys.path中,这样server文件夹会被识别为合法Python模块。
内容的提问来源于stack exchange,提问作者kpozzi90

