Flask项目插件集成+docker-compose+gitlab-ci持续部署到云服务器

陆昊
2023-12-01

导语

  1. flask非常灵活,也非常难以驾驭,如何把flask同日常使用的功能结合起来,是需要考虑的问题,这里提供了一些方案

    • 完整的docker+docker-compose+ci/cd流程 一键部署热更新代码到云主机
    • flask cli 通过FlaskGroup来管理所有commands,运行脚本
    • flask factory模式 结合celery 创建异步任务队列
    • flask+redis 配置缓存
    • 自动从.env文件加载配置
    • flask 每次加载自动刷新js和css文件,提高开发效率
    • 配置sentry 自动监控 和ignore log设置
    • flask-env 从.env文件中加载配置
    • flask+pytest 进行单元测试,配置数据库
  2. 部署往往是新手写程序遇到的难题,有了docker之后,方便了很多。但每次更新完自己的代码,重新发布到服务器上又要花费一些时间。这里提供一种解决思路:

    1. docker-compose容器编排自己的代码,比如nginx容器+mysql+redis等等。多个服务相互依赖如何解决。
    2. gitlab ci/cd流程,对整个代码进行静态检查以及集成测试。以及持续发布。每次git push后,代码能一键部署到服务器上。

github地址链接
如果对你有帮助,希望能Star

ci/cd 持续集成&持续部署

通过gitlab ci+docker-compose 完成个人项目的持续发布
docker-compose: nginx+mysql+redis 通过Dockerfile将程序运行在容器中
保证每次Push代码,线上的代码可以一键更新。
ssh为非对称加密,需要在本机上生成公钥和私钥,然后把公钥交给需要登录的机器。然后将私钥以变量
的信息存在gitlab ci中。

test

在gitlab runner中通过docker镜像和依赖进行测试。进行flak8和pytest单元测试。

deploy

通过ssh命令更新server下的代码,然后docker-compose rebuild
每次向gitlab push代码的时候,自动触发测试任务,手动触发deploy任务。

celery

在create_app时,加载update_celery方法。更新config,同时将task放在context下
新建run_celery文件:

from jasmine_app import create_app
from jasmine_app import celery

app = create_app()
app.app_context().push()

运行

celery worker -B -A run_celery.celery --loglevel=info

发布镜像到docker.io

docker build --cache-from jasmine:latest -t jasmine:latest .
docker tag jasmine:latest fjl2401/jasmine
docker push fjl2401/jasmine

flask-env

安装: pip install python-dotenv
在root目录下加入.env文件 .env文件中加入配置

  • FLASK_DEBUG=True or False
  • FLASK_APP=jasmin_app
  • FLASK_ENV=development

配置sentry

需要去sentry注册并生成秘钥,官方文档也挺好的。主要给出屏蔽错误信息方法。
有两种方法

  1. raven
  2. sentry_sdk

pip install --upgrade sentry-sdk[flask]==0.5.5

import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

sentry_sdk.init(
    dsn="https://e3c5ddd746d9486d9f0a76b6953d8be2@sentry.io/1327554",
    integrations=[FlaskIntegration()]
)

flask+commands

在需要跑脚本的时候可以把脚本文件统一放在commands下做处理
通过AppGroup自定义cli,然后import_string()将commands加载进来


# extension文件中
usr_cli = AppGroup("user")
import_string("play_flask.single_app.command")




# 写在commands文件夹中
@usr_cli.command("create_user")
def create_user():
    """
    create user
    """
    print("create user {}".format("cli"))
    print(current_app.config)


# 在init_app时
app.cli.add_command(usr_cli)

gunicorn运行

app中create_app 并运行
gunicorn --bind 0.0.0.0

 类似资料: