基于 GitHub 的 FastAPI 项目:快速部署与 CI/CD
FastAPI 以其高性能、易用性和自动文档生成等特性,成为了构建现代 API 的热门选择。而 GitHub 作为全球最大的代码托管平台,提供了一整套工具和服务,使得 FastAPI 项目的开发、部署和维护变得更加高效便捷。本文将深入探讨如何利用 GitHub 的强大功能,结合 FastAPI 项目的特点,实现快速部署和完善的 CI/CD 流程。
一、FastAPI 项目的 GitHub 基础配置
在着手部署和 CI/CD 之前,我们需要确保 FastAPI 项目已经在 GitHub 上完成基础配置。这包括以下几个关键步骤:
- 创建 GitHub 仓库: 在 GitHub 上创建一个新的仓库,并选择合适的许可证 (如 MIT, Apache 2.0)。 建议选择一个描述性的仓库名称,方便团队成员和其他开发者理解项目的用途。
- 初始化项目: 在本地开发环境中初始化 FastAPI 项目。 使用
poetry
,pipenv
或venv
等工具创建虚拟环境,并安装 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”
“`
- 编写
.gitignore
文件: 忽略不应提交到仓库的文件,例如虚拟环境目录 (venv
,.venv
,__pycache__
)、临时文件 (.pyc
) 和密钥文件。 一个简单的.gitignore
文件示例如下:
__pycache__/
*.pyc
*.pyo
.DS_Store
venv/
.venv/
*.swp
*.log
.env
- 创建 README.md 文件: 编写清晰的 README 文件,描述项目的目的、如何安装和运行、以及如何贡献代码。 一个好的 README 文件可以吸引更多的贡献者和用户。
- 首次提交: 将项目文件添加到 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 项目的持续集成和持续部署。
-
创建 GitHub Actions 工作流程: 在仓库根目录下创建
.github/workflows
目录,并在该目录下创建一个 YAML 文件,例如ci_cd.yml
。 -
定义工作流程: 在 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:
: 定义触发工作流程的事件。 这里配置了push
和pull_request
事件,当代码推送到main
分支或有针对main
分支的拉取请求时,工作流程将被触发。-
jobs:
: 定义工作流程包含的作业。 这里定义了两个作业:build
和deploy
。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_KEY
和HEROKU_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 应用的步骤:
- 创建 Heroku 应用: 在 Heroku 上创建一个新的应用。
- 安装 Heroku CLI: 安装 Heroku 命令行工具。
- 登录 Heroku: 使用 Heroku CLI 登录到 Heroku。
- 使用 GitHub Actions 部署: 配置 GitHub Actions 工作流程以自动部署到 Heroku。 上面已经提供了一个示例的 GitHub Actions 工作流程。
- 配置 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 应用的步骤:
- 创建
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.lock
和pyproject.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
- 构建 Docker 镜像:
bash
docker build -t my-fastapi-app .
- 运行 Docker 容器:
bash
docker run -d -p 8000:8000 my-fastapi-app
- 推送到 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 流程不仅包含构建和部署,还应该包含单元测试、集成测试、代码质量检查等环节。
- 单元测试: 编写单元测试来验证代码的正确性。 使用
pytest
或其他测试框架。 - 集成测试: 编写集成测试来验证不同组件之间的交互。
- 代码质量检查: 使用
flake8
,pylint
或其他代码质量检查工具来检查代码风格和潜在问题。 - 自动化部署: 使用 GitHub Actions 或其他 CI/CD 工具来自动化部署过程。 可以部署到 Heroku, AWS, Google Cloud, Azure 等云平台。
- 回滚策略: 制定回滚策略,以便在部署失败时快速回滚到之前的版本。
六、监控与日志
部署后的监控和日志对于应用的稳定运行至关重要。
- 使用 Sentry 或 other error tracking tools: 监控应用中的错误,并及时发出警报。
- 使用 Prometheus 和 Grafana: 收集和可视化应用指标,例如 CPU 使用率、内存使用率、请求延迟等。
- 使用 ELK Stack (Elasticsearch, Logstash, Kibana): 集中管理和分析应用日志。
总结:
本文详细介绍了如何利用 GitHub 的强大功能,结合 FastAPI 项目的特点,实现快速部署和完善的 CI/CD 流程。 通过使用 GitHub Actions, Docker, Heroku 等工具,可以大大提高开发效率,并确保应用的稳定运行。 希望本文能够帮助您更好地部署和管理 FastAPI 项目。