跳到主要内容

CI/CD

问题

Python 项目如何搭建 CI/CD 流水线?

答案

GitHub Actions

.github/workflows/ci.yml
name: CI

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

jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.12"]

steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Set up Python
run: uv python install ${{ matrix.python-version }}

- name: Install dependencies
run: uv sync --all-extras

- name: Lint
run: uv run ruff check .

- name: Type check
run: uv run mypy src/

- name: Test
run: uv run pytest --cov=src --cov-report=xml

- name: Upload coverage
uses: codecov/codecov-action@v4

Docker 部署

Dockerfile
# 多阶段构建
FROM python:3.12-slim AS builder

WORKDIR /app
COPY pyproject.toml uv.lock ./

RUN pip install uv && uv sync --frozen --no-dev

# 运行阶段
FROM python:3.12-slim

WORKDIR /app
COPY --from=builder /app/.venv /app/.venv
COPY src/ ./src/

ENV PATH="/app/.venv/bin:$PATH"

EXPOSE 8000
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]

部署流水线


常见面试问题

Q1: Python Docker 镜像优化技巧?

答案

  1. 多阶段构建:分离构建和运行,减小镜像体积
  2. slim 基础镜像python:3.12-slimpython:3.12 小很多
  3. 利用缓存层:先 COPY 依赖文件,再 COPY 代码
  4. .dockerignore:排除 .venv__pycache__.git

Q2: 如何做 zero-downtime 部署?

答案

  1. 健康检查:新容器通过健康检查后再切换流量
  2. 滚动更新:Kubernetes 滚动更新、Docker Compose --update-order
  3. 优雅关闭:捕获 SIGTERM,等待进行中的请求完成

相关链接