适合新手的 Python web 项目 CI/CD 流程如何搭建?

作为一名 python web 学习者,有自己的云服务器,有没有想过把自己的代码部署到云服务器上? 如何和当下最流行的 devops 结合起来?

我个人总结了一套基于 Flask 的 ci/cd 流程,主要有以下几个特点:

  1. 基于 docker 和 docker-compose 容器编排,将 mysql,redis,nginx 结合起来。
  2. 基于 gitlab-ci 对代码进行基于容器的集成测试,静态代码检查,和手动触发的一键部署到自己的 Linux_server 上。每次通过 git 将代码 push 到 gitlab ci 上后,测试任务会自动触发,deploy 设置为了手动触发。
  3. 同时也包含了一些 Flask 扩展方面的知识,比如结合 celery,加载 flask_cli 运行 commands 之类的。

分享出来,希望能够得到大佬的建议和意见。

github 地址


适合新手的 Python web 项目 CI/CD 流程如何搭建?

18 回复

有喜欢的希望能 star 一下🙏


核心思路:用 GitHub Actions + Docker 实现最简单的自动化流程。

对于新手,别整复杂的。这套流程能让你每次 git push 后,代码自动测试、打包成 Docker 镜像并部署到服务器。下面是一个基于 Flask 项目的完整示例。

1. 项目基础结构 假设你的项目结构如下:

your-web-app/
├── app.py          # Flask 应用入口
├── requirements.txt # 依赖
├── Dockerfile      # Docker 构建文件
├── .github/
│   └── workflows/
│       └── ci-cd.yml  # GitHub Actions 配置文件
└── tests/          # 测试文件(可选)

2. 关键文件配置

Dockerfile (用于构建应用镜像):

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "app:app"]

.github/workflows/ci-cd.yml (GitHub Actions 工作流):

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  test-and-build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install pytest  # 如果写测试的话

      - name: Run tests
        run: pytest tests/  # 可选,有测试就加上

      - name: Build Docker image
        run: |
          docker build -t your-username/your-app:latest .

  deploy:
    needs: test-and-build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Deploy to server via SSH
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            docker pull your-username/your-app:latest
            docker stop web-app || true
            docker rm web-app || true
            docker run -d --name web-app -p 8080:8080 your-username/your-app:latest

3. 服务器和仓库设置

  1. 在服务器安装 Docker。
  2. 在 GitHub 仓库设置中,添加 Secrets:
    • SERVER_HOST: 服务器 IP/域名
    • SERVER_USER: 登录用户名(如 root
    • SSH_PRIVATE_KEY: 用于认证的 SSH 私钥(对应公钥放服务器 ~/.ssh/authorized_keys

4. 工作原理

  • 推代码到 main 分支触发流程。
  • test-and-build 任务:安装依赖、运行测试、构建 Docker 镜像。
  • deploy 任务:通过 SSH 连服务器,拉取新镜像并重启容器。

总结建议:先跑通这个基础流程,再逐步添加更复杂的步骤。

很棒,也希望能够写成教程分享给大家,或者给新手介绍一些学习路径.

好的,以后有学习总结或者新的好玩的知识一定分享。

代码能不能来个更详细一点的说明呀,

嗯,好的!我这两天再完善下,有什么没写清楚的地方欢迎提 issue~

正好写了 Flask+WebSocket 的毕设,部署一直比较迷,学习了。感谢分享!

我现在用的 daocloud, 可以在 daocloud 的服务器上构筑 docker 镜像, 然后自动部署到自己的服务器上. 也可以用来管理自己服务器上跑的 docker 镜像.

哈哈,对你有帮助我也很开心,获得了成就感~

学习一个

mysql 的密码写在 docker-compose.yml 了,ip 在 shell 脚本也暴露出来了~
apt、pip 没清缓存等等。
怎么说呢,看起来是能运行了,但是很多细节还需要推敲。

部署是在 ci 脚本里通过 ssh 发命令去服务器部署的?!这样真的好吗?第一次见这种操作

感谢~细节方面的会持续改进

仅仅用 docker 的情况下,暂时只能想到这种方法… 当然如果是 k8s 的话,直接打镜像就更简单了。

回到顶部