基于 GitHub 的 FastAPI 项目:快速部署与 CI/CD – wiki基地

基于 GitHub 的 FastAPI 项目:快速部署与 CI/CD

FastAPI 以其高性能、易用性和自动文档生成等特性,成为了构建现代 API 的热门选择。而 GitHub 作为全球最大的代码托管平台,提供了一整套工具和服务,使得 FastAPI 项目的开发、部署和维护变得更加高效便捷。本文将深入探讨如何利用 GitHub 的强大功能,结合 FastAPI 项目的特点,实现快速部署和完善的 CI/CD 流程。

一、FastAPI 项目的 GitHub 基础配置

在着手部署和 CI/CD 之前,我们需要确保 FastAPI 项目已经在 GitHub 上完成基础配置。这包括以下几个关键步骤:

  1. 创建 GitHub 仓库: 在 GitHub 上创建一个新的仓库,并选择合适的许可证 (如 MIT, Apache 2.0)。 建议选择一个描述性的仓库名称,方便团队成员和其他开发者理解项目的用途。
  2. 初始化项目: 在本地开发环境中初始化 FastAPI 项目。 使用 poetry, pipenvvenv 等工具创建虚拟环境,并安装 FastAPI 及其依赖项。 一个基本的 requirements.txt 文件可能包含以下内容:

fastapi
uvicorn
pydantic
gunicorn

或者,使用 poetry 管理依赖项:

“`
[tool.poetry]
name = “my-fastapi-project”
version = “0.1.0”
description = “A simple FastAPI project”
authors = [“Your Name your.email@example.com“]
readme = “README.md”

[tool.poetry.dependencies]
python = “^3.9”
fastapi = “^0.100.0”
uvicorn = “^0.23.2”
pydantic = “^2.3.0”
gunicorn = “^20.1.0”

[build-system]
requires = [“poetry-core”]
build-backend = “poetry.core.masonry.api”
“`

  1. 编写 .gitignore 文件: 忽略不应提交到仓库的文件,例如虚拟环境目录 (venv, .venv, __pycache__)、临时文件 (.pyc) 和密钥文件。 一个简单的 .gitignore 文件示例如下:

__pycache__/
*.pyc
*.pyo
.DS_Store
venv/
.venv/
*.swp
*.log
.env

  1. 创建 README.md 文件: 编写清晰的 README 文件,描述项目的目的、如何安装和运行、以及如何贡献代码。 一个好的 README 文件可以吸引更多的贡献者和用户。
  2. 首次提交: 将项目文件添加到 Git 仓库,并进行首次提交:

bash
git init
git add .
git commit -m "Initial commit"
git remote add origin [email protected]:your-username/your-repo.git
git push -u origin main

二、使用 GitHub Actions 实现 CI/CD

GitHub Actions 是一种 CI/CD 工具,可以直接在 GitHub 仓库中运行。它允许我们自动化构建、测试、部署等任务。 通过定义工作流程 (workflows),我们可以轻松地实现 FastAPI 项目的持续集成和持续部署。

  1. 创建 GitHub Actions 工作流程: 在仓库根目录下创建 .github/workflows 目录,并在该目录下创建一个 YAML 文件,例如 ci_cd.yml

  2. 定义工作流程: 在 YAML 文件中定义工作流程的各个步骤。 以下是一个示例的 FastAPI 项目 CI/CD 工作流程:

“`yaml
name: CI/CD

on:
push:
branches: [ “main” ]
pull_request:
branches: [ “main” ]

jobs:
build:
runs-on: ubuntu-latest

steps:
  - uses: actions/checkout@v3
  - name: Set up Python 3.9
    uses: actions/setup-python@v4
    with:
      python-version: "3.9"
  - name: Install dependencies
    run: |
      python -m pip install --upgrade pip
      pip install poetry
      poetry install --no-interaction --no-ansi
  - name: Lint with flake8
    run: |
      poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
  - name: Test with pytest
    run: |
      poetry run pytest

deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == ‘refs/heads/main’

steps:
  - uses: actions/checkout@v3
  - name: Set up Python 3.9
    uses: actions/setup-python@v4
    with:
      python-version: "3.9"
  - name: Install dependencies
    run: |
      python -m pip install --upgrade pip
      pip install poetry
      poetry install --no-interaction --no-ansi
  - name: Deploy to Heroku
    uses: akhileshns/[email protected]
    with:
      heroku_api_key: ${{secrets.HEROKU_API_KEY}}
      heroku_app_name: ${{secrets.HEROKU_APP_NAME}}
      heroku_email: [email protected]

“`

工作流程详解:

  • name: CI/CD: 定义工作流程的名称。
  • on:: 定义触发工作流程的事件。 这里配置了 pushpull_request 事件,当代码推送到 main 分支或有针对 main 分支的拉取请求时,工作流程将被触发。
  • jobs:: 定义工作流程包含的作业。 这里定义了两个作业: builddeploy

    • build:: 执行构建和测试任务。
      • runs-on: ubuntu-latest: 指定在 Ubuntu 最新版本的虚拟机上运行该作业。
      • steps:: 定义作业中的步骤。
        • actions/checkout@v3: 检出 (checkout) 代码到虚拟机。
        • actions/setup-python@v4: 设置 Python 环境。
        • Install dependencies: 安装项目依赖项。 这里使用 poetry 来管理依赖项。
        • Lint with flake8: 使用 flake8 进行代码风格检查。
        • Test with pytest: 使用 pytest 运行单元测试。
    • deploy:: 执行部署任务。
      • needs: build: 表示该作业依赖于 build 作业的成功完成。
      • if: github.ref == 'refs/heads/main': 只有当提交到 main 分支时才执行部署。
      • akhileshns/[email protected]: 使用 Heroku 部署 GitHub Action 将项目部署到 Heroku。
      • heroku_api_key, heroku_app_name, heroku_email: Heroku 的 API 密钥、应用名称和邮箱地址。 这些值应该存储在 GitHub 仓库的 Secrets 中,以保证安全性。
  • 配置 GitHub Secrets: 为了安全地存储敏感信息,例如 API 密钥,可以使用 GitHub Secrets。 在 GitHub 仓库的 “Settings” -> “Secrets” -> “Actions” 中添加 Secret。 在上面的例子中,需要添加 HEROKU_API_KEYHEROKU_APP_NAME

  • 修改 FastAPI 代码适应部署环境:

在 FastAPI 应用中,需要根据环境变量来配置应用,例如数据库连接字符串,端口号等。可以使用 os.environ 来读取环境变量。

“`python
import os
from fastapi import FastAPI

app = FastAPI()

获取端口号,如果没有设置,则使用默认值 8000

port = int(os.environ.get(“PORT”, 8000))

@app.get(“/”)
async def root():
return {“message”: “Hello World”}

if name == “main“:
import uvicorn
uvicorn.run(app, host=”0.0.0.0”, port=port)
“`

重要提示: 避免将敏感信息直接存储在代码中。 使用环境变量或密钥管理服务来保护敏感信息。

三、部署到 Heroku

Heroku 是一个流行的云平台,可以轻松地部署 FastAPI 应用。 以下是在 Heroku 上部署 FastAPI 应用的步骤:

  1. 创建 Heroku 应用: 在 Heroku 上创建一个新的应用。
  2. 安装 Heroku CLI: 安装 Heroku 命令行工具。
  3. 登录 Heroku: 使用 Heroku CLI 登录到 Heroku。
  4. 使用 GitHub Actions 部署: 配置 GitHub Actions 工作流程以自动部署到 Heroku。 上面已经提供了一个示例的 GitHub Actions 工作流程。
  5. 配置 Heroku 环境变量: 在 Heroku 应用的 “Settings” -> “Config Vars” 中设置环境变量。

创建 Procfile:

Heroku 需要一个 Procfile 文件来告诉它如何启动应用。 在项目根目录下创建 Procfile 文件,并添加以下内容:

web: gunicorn main:app --workers 3 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:$PORT

  • web:: 指定这是一个 Web 应用。
  • gunicorn main:app: 使用 Gunicorn 作为 WSGI 服务器来运行 FastAPI 应用。 main 是包含 FastAPI 应用的 Python 文件名,app 是 FastAPI 应用的实例。
  • --workers 3: 指定使用 3 个 worker 进程。
  • --worker-class uvicorn.workers.UvicornWorker: 指定使用 Uvicorn worker 类。
  • --bind 0.0.0.0:$PORT: 绑定到所有接口,并使用 $PORT 环境变量指定的端口。

四、使用 Docker 进行更灵活的部署

使用 Docker 可以将 FastAPI 应用打包成一个容器,从而实现更灵活的部署。 以下是使用 Docker 部署 FastAPI 应用的步骤:

  1. 创建 Dockerfile:

“`dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

COPY poetry.lock pyproject.toml ./

RUN pip install poetry && poetry install –no-root –no-interaction –no-ansi

COPY . .

CMD [“uvicorn”, “main:app”, “–host”, “0.0.0.0”, “–port”, “8000”]
“`

Dockerfile 详解:

  • FROM python:3.9-slim-buster: 基于 Python 3.9 镜像构建。 slim-buster 镜像体积更小。
  • WORKDIR /app: 设置工作目录为 /app
  • COPY poetry.lock pyproject.toml ./: 复制 poetry.lockpyproject.toml 文件到工作目录。
  • RUN pip install poetry && poetry install --no-root --no-interaction --no-ansi: 安装 Poetry 并安装项目依赖项。 --no-root 选项表示不安装项目本身作为依赖项。
  • COPY . .: 复制所有项目文件到工作目录。
  • CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]: 设置容器启动时执行的命令。 这里使用 Uvicorn 启动 FastAPI 应用。

  • 创建 .dockerignore 文件: 类似于 .gitignore,用于忽略不应包含在 Docker 镜像中的文件。

__pycache__/
*.pyc
*.pyo
.DS_Store
venv/
.venv/
*.swp
*.log
.env

  1. 构建 Docker 镜像:

bash
docker build -t my-fastapi-app .

  1. 运行 Docker 容器:

bash
docker run -d -p 8000:8000 my-fastapi-app

  1. 推送到 Docker Hub 或其他容器镜像仓库: 将 Docker 镜像推送到 Docker Hub 或其他容器镜像仓库,以便在其他环境中部署。

使用 Docker Compose:

可以使用 Docker Compose 来定义和运行多容器应用。 创建一个 docker-compose.yml 文件:

yaml
version: "3.9"
services:
app:
build: .
ports:
- "8000:8000"
environment:
PORT: 8000

然后运行:

bash
docker-compose up -d

五、持续集成与持续部署策略

一个完善的 CI/CD 流程不仅包含构建和部署,还应该包含单元测试、集成测试、代码质量检查等环节。

  1. 单元测试: 编写单元测试来验证代码的正确性。 使用 pytest 或其他测试框架。
  2. 集成测试: 编写集成测试来验证不同组件之间的交互。
  3. 代码质量检查: 使用 flake8, pylint 或其他代码质量检查工具来检查代码风格和潜在问题。
  4. 自动化部署: 使用 GitHub Actions 或其他 CI/CD 工具来自动化部署过程。 可以部署到 Heroku, AWS, Google Cloud, Azure 等云平台。
  5. 回滚策略: 制定回滚策略,以便在部署失败时快速回滚到之前的版本。

六、监控与日志

部署后的监控和日志对于应用的稳定运行至关重要。

  1. 使用 Sentry 或 other error tracking tools: 监控应用中的错误,并及时发出警报。
  2. 使用 Prometheus 和 Grafana: 收集和可视化应用指标,例如 CPU 使用率、内存使用率、请求延迟等。
  3. 使用 ELK Stack (Elasticsearch, Logstash, Kibana): 集中管理和分析应用日志。

总结:

本文详细介绍了如何利用 GitHub 的强大功能,结合 FastAPI 项目的特点,实现快速部署和完善的 CI/CD 流程。 通过使用 GitHub Actions, Docker, Heroku 等工具,可以大大提高开发效率,并确保应用的稳定运行。 希望本文能够帮助您更好地部署和管理 FastAPI 项目。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部