使用 Github Actions 将 Python 应用程序部署到 Azure 应用服务

问题描述 投票:0回答:1

我在使用 CI/CD 和 GitHub Actions 将 Python Web 应用程序部署到 Azure 应用服务时遇到问题。目标是让应用程序连接到 Azure SQL 后端进行查询,但部署未按预期工作。

我尝试通过操作从我的 GitHub 目录部署它,并且我添加了一个秘密 secrets.AZURE_WEBAPP_PUBLISH_PROFILE 以及 Azure 应用服务发布配置文件中的内容。

我的GitHub仓库的结构如下:

/python-app$
.
├── app
│   ├── app.py
│   ├── requirements.txt
│   ├── static
│   │   └── styles.css
│   └── templates
│       ├── index.html
│       └── welcome.html
├── terraform-infra

这是我创建的管道

name: Build and Deploy Python App to Azure Web App
on:
  push:
    branches:
      - main
  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.12'

      - name: Install unixodbc
        run: sudo apt-get install -y unixodbc

      - name: Create and activate virtual environment
        run: |
          python -m venv venv
          source venv/bin/activate
      
      - name: Install dependencies
        run: pip install -r app/requirements.txt
        
      - name: Compress artifact for deployment
        run: zip release.zip ./app/* -r

      - name: Upload artifact for deployment jobs
        uses: actions/upload-artifact@v4
        with:
          name: python-app
          path: |
            release.zip
            !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

      - name: Unzip artifact for deployment
        run: |
          unzip release.zip
          mv app/* .

      - name: 'Deploy to Azure Web App'
        uses: azure/webapps-deploy@v3
        id: deploy-to-webapp
        with:
          app-name: 'python-app-mario'
          slot-name: 'production'
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

需求.txt

bcrypt==4.2.0
blinker==1.8.2
click==8.1.7
Flask==3.0.3
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
pyodbc==5.1.0
Werkzeug==3.0.4

app.py

database = os.getenv("database")
password = os.getenv("password")
server = os.getenv("server")
user = os.getenv("user")
driver= '{ODBC Driver 17 for SQL Server}'

# Connecting to SQL server
conexion = pyodbc.connect(f"DRIVER={driver};SERVER={server};DATABASE={database};UID={user};PWD={password}")

部署管道后,当我尝试访问应用程序时,我看到以下错误消息:

: ( Application Error If you are the application administrator, you can access the diagnostic resources.

此外,logs显示以下error,表明未找到pyodbc模块。但是,我已将其添加到requirements.txt文件中,并按照该文件安装了其依赖项。

错误信息

我一直在寻找有关此问题的信息,但不确定如何解决它。

非常感谢您的宝贵时间!

正如上一条消息中提到的,我尝试安装 pyodbc 模块和 unixodbc 依赖项,但仍然遇到相同的错误。

我也尝试过使用Azure提供的管道,但也失败了。我一直在官方文档中寻找有关此错误的信息以及如何解决它,但我一直无法解决该问题。

python azure azure-web-app-service github-actions pyodbc
1个回答
0
投票

错误表明没有找到依赖。这很可能是由于 zip 文件缺少依赖项,您可以通过在本地解压 zip 文件来验证这一点。

要解决此问题,您应该做的是在安装 requests.txt 文件中的所有内容时提供

--target <dir>
标志。这样依赖项将在压缩之前安装在项目根目录中。这是一个根据官方文档建模的示例:

- name: Create virtual environment
  run: |
    python -m venv venv

- name: Install dependencies
  run: |
    source venv/bin/activate
    cd app
    pip install -r requirements.txt \

target="./.python_packages/lib/site-packages"

注意:virtualenv 目录应该在源代码目录(即 app)之外创建,以避免 zip 文件膨胀。激活 virtualenv 应该在运行 pip 命令的同一步骤中完成,venv shell 将在 y 结束时关闭

您还可以使用

working-directory
参数来避免更改目录:

- name: Create virtual environment
  run: |
    python -m venv ${GITHUB_WORKSPACE}/env

- name: Install dependencies
  run: |
    source ${GITHUB_WORKSPACE}venv/bin/activate
    pip install -r requirements.txt \ target="./.python_packages/lib/site-packages"
  working-directory: ./app
© www.soinside.com 2019 - 2024. All rights reserved.