Python CI/CD实战:用GitHub Actions自动化部署Flask应用

阅读 17

06-19 12:00

  现代软件开发中,持续集成和持续部署(CI/CD)已成为提升交付效率的核心实践。GitHub Actions作为原生集成于GitHub的自动化工具,能高效管理代码测试、构建与部署流程。本文通过一个完整的Flask应用部署案例,详解如何构建高可靠性的自动化流水线。

  环境初始化与项目结构

  Flask应用需标准化项目结构以确保环境一致性:

  # app.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "自动化部署实战成功" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)

  依赖管理通过requirements.txt锁定版本:

  Flask==2.0.3 gunicorn==20.1.0 pytest==7.1.2

  虚拟环境隔离依赖(可选但推荐):

  python -m venv venv source venv/bin/activate pip install -r requirements.txt

  自动化测试与覆盖率检测

  单元测试使用pytest并集成覆盖率报告:

  # test_app.py import pytest from app import app @pytest.fixture def client(): return app.test_client() def test_homepage(client): response = client.get('/') assert response.status_code == 200 assert b"自动化部署实战成功" in response.data

  覆盖率配置(.coveragerc):

  [run] source = . omit = venv/*

  测试命令扩展为:

  pytest --cov=app --cov-report=term-missing

  GitHub Actions流水线设计

  在.github/workflows/cicd.yml定义三阶段工作流:

  name: Flask CI/CD on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v3 - name: 配置Python 3.9 uses: actions/setup-python@v4 with: python-version: '3.9' - name: 安装依赖 run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: 运行测试与覆盖率 run: pytest --cov=app --cov-report=term-missing build: runs-on: ubuntu-latest needs: test outputs: image_tag: ${{ steps.docker_meta.outputs.tags }} steps: - name: 构建Docker镜像 uses: docker/build-push-action@v3 with: context: . tags: flask-app:latest deploy: runs-on: ubuntu-latest needs: build steps: - name: SSH部署到生产服务器 uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SERVER_IP }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} script: | docker pull flask-app:latest docker stop running-app || true docker run -d --name running-app -p 5000:5000 flask-app:latest

  生产环境优化策略

  Gunicorn配置(gunicorn_config.py):

  workers = 4 bind = '0.0.0.0:5000' timeout = 120

  启动命令改为:gunicorn app:app -c gunicorn_config.py

  Dockerfile多层构建:

  FROM python:3.9-slim as builder COPY requirements.txt . RUN pip install --user -r requirements.txt FROM python:3.9-slim COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["gunicorn", "app:app", "-c", "gunicorn_config.py"]

  零停机部署:

  # SSH部署脚本优化 docker run -d --name app-new -p 5001:5000 flask-app:latest while ! curl -s http://localhost:5001/health; do sleep 1; done docker exec -it nginx nginx -s reload # Nginx流量切换 docker stop app-old && docker rm app-old docker rename app-new running-app

  日志监控与异常追踪

  结构化日志(logging.conf):

  [loggers] keys=root,flask [handlers] keys=fileHandler [formatter] keys=jsonFormatter [logger_flask] level=INFO handlers=fileHandler qualname=flask [handler_fileHandler] class=logging.FileHandler formatter=jsonFormatter filename=app.log [formatter_jsonFormatter] format={"time": "%(asctime)s", "level": "%(levelname)s", "message": "%(message)s"}

  异常告警集成:

  import logging from flask import Flask app = Flask(__name__) @app.errorhandler(500) def internal_error(e): logging.critical(f"服务器异常: {str(e)}") # 此处可接入Sentry/PagerDuty return "服务异常", 500

  安全加固实践

  依赖LD扫描:

  # 在GitHub Actions中添加 - name: 安全扫描 run: pip install safety && safety check

  容器非特权运行:

  FROM python:3.9-slim USER 1000:1000 # 非root用户

  密钥动态注入:

  # 部署命令改为 docker run ... -e SECRET_KEY=${{ secrets.APP_KEY }}

  结语

  通过GitHub Actions实现Flask应用的CI/CD流水线,团队将获得从代码提交到生产部署的自动化能力。测试覆盖率保障代码质量,容器化封装解决环境差异,蓝绿部署消除服务中断风险。日志监控与安全加固进一步提升了线上稳定性。这一方案将开发效率与运维可靠性结合,为Python项目提供工业化交付基础。

精彩评论(0)

0 0 举报