Flask項目插件集成+docker-compose+gitlab-ci持續部署到雲服務器

導語

  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://[email protected]/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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章