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 镜像优化技巧?
答案:
- 多阶段构建:分离构建和运行,减小镜像体积
- slim 基础镜像:
python:3.12-slim比python:3.12小很多 - 利用缓存层:先 COPY 依赖文件,再 COPY 代码
.dockerignore:排除.venv、__pycache__、.git
Q2: 如何做 zero-downtime 部署?
答案:
- 健康检查:新容器通过健康检查后再切换流量
- 滚动更新:Kubernetes 滚动更新、Docker Compose
--update-order - 优雅关闭:捕获 SIGTERM,等待进行中的请求完成