当前位置: 首页 > article >正文

016、CI/CD流水线:用GitHub Actions把部署从玄学变成肌肉记忆

016、CI/CD流水线用GitHub Actions把部署从玄学变成肌肉记忆上周深夜线上服务突然告警。紧急回滚时发现测试环境通过的镜像在生产环境死活起不来。查了三个小时最后发现是某位同事在Dockerfile里写死了测试数据库的IP。这种“本地跑得好好的上线就崩”的剧情各位应该不陌生吧今天我们就用GitHub Actions搭建一套CI/CD流水线把这种部署玄学变成可重复的肌肉记忆。为什么GitHub Actions是FastAPI项目的绝配以前团队用Jenkins每次配置都要点一堆页面插件冲突更是家常便饭。GitHub Actions的最大优势是“配置即代码”——你的流水线定义就放在仓库的.github/workflows里版本控制、代码评审、修改历史全都有了。对于FastAPI这种现代Python框架Actions的轻量级容器化执行环境简直是天作之合。从最简单的测试流水线开始先别急着搞复杂的多阶段部署。咱们在项目根目录创建.github/workflows/test.ymlname:Run Testson:push:branches:[main,develop]pull_request:branches:[main]jobs:test:runs-on:ubuntu-latestservices:postgres:image:postgres:13env:POSTGRES_PASSWORD:postgresoptions:---health-cmd pg_isready--health-interval 10s--health-timeout 5s--health-retries 5steps:-uses:actions/checkoutv3-name:Set up Python 3.10uses:actions/setup-pythonv4with:python-version:3.10-name:Install dependenciesrun:|python -m pip install --upgrade pip pip install -r requirements.txt # 测试依赖单独安装别污染生产环境 pip install pytest pytest-asyncio httpx-name:Run migrationsenv:DATABASE_URL:postgresql://postgres:postgreslocalhost:5432/test_dbrun:|alembic upgrade head # 这里踩过坑Actions的service容器端口不是默认的5432 # 要用localhost访问别信某些教程写的service名字-name:Run tests with pytestenv:DATABASE_URL:postgresql://postgres:postgreslocalhost:5432/test_dbREDIS_URL:redis://localhost:6379run:|pytest -v --covapp --cov-reportxml # 记得在pytest配置里标记异步测试 # 不然async def的测试用例会直接跳过-name:Upload coverage to Codecovuses:codecov/codecov-actionv3with:file:./coverage.xmlfail_ci_if_error:true这个配置有几个关键点services块里定义了PostgreSQL容器测试时直接连localhost就行。环境变量通过env传递避免硬编码。覆盖率报告生成后直接上传到Codecov后续可以配置质量门槛。加上代码质量检查的钩子测试通过只是底线代码风格和类型安全同样重要。在test job后面追加几个步骤-name:Lint with flake8run:|pip install flake8 black isort flake8 app --count --selectE9,F63,F7,F82 --show-source --statistics black --check app isort --check-only app-name:Type checking with mypyrun:|pip install mypy mypy app --ignore-missing-imports # 忽略缺失导入是因为第三方库的类型提示参差不齐 # 重点检查我们自己写的业务逻辑很多人觉得代码风格检查太“形式主义”直到你凌晨三点调试一个因为缩进错误导致的诡异bug。把这些检查自动化团队协作时能省下大量沟通成本。构建Docker镜像并推送到Registry测试通过后该打包镜像了。创建新的build.yml工作流注意这里用了needs: test来依赖测试阶段name:Build and Pushon:workflow_run:workflows:[Run Tests]types:-completedbranches:[main]jobs:build:if:${{github.event.workflow_run.conclusion success}}runs-on:ubuntu-lateststeps:-uses:actions/checkoutv3with:ref:${{github.event.workflow_run.head_sha}}# 这个ref写法很重要确保构建的是触发测试的那个提交-name:Set up Docker Buildxuses:docker/setup-buildx-actionv2-name:Login to DockerHubuses:docker/login-actionv2with:username:${{secrets.DOCKER_USERNAME}}password:${{secrets.DOCKER_TOKEN}}# 千万别用密码用Access Token# 去年有团队密码泄露被挖矿的案例-name:Build and pushuses:docker/build-push-actionv4with:context:.push:truetags:|yourusername/fastapi-app:latest yourusername/fastapi-app:${{ github.sha }}cache-from:typeghacache-to:typegha,modemax# 开启缓存下次构建能快不少注意这里用了workflow_run触发器只有测试工作流成功完成才会触发构建。镜像打了两个标签latest和git commit SHA后者在回滚时特别有用。部署到生产环境的策略选择部署环节最考验设计水平。根据你的基础设施可以选择几种模式Kubernetes滚动更新如果用了k8s-name:Update k8s deploymentrun:|kubectl set image deployment/fastapi-deployment \ fastapi-containeryourusername/fastapi-app:${{ github.sha }} kubectl rollout status deployment/fastapi-deploymentSSH到服务器手动重启传统VPS方案-name:Deploy to productionuses:appleboy/ssh-actionv0.1.5with:host:${{secrets.PROD_HOST}}username:${{secrets.PROD_USER}}key:${{secrets.SSH_PRIVATE_KEY}}script:|cd /opt/fastapi-app docker-compose pull docker-compose up -d docker system prune -f # 记得清理旧镜像不然磁盘很快会满重要建议生产部署一定要加手动批准步骤。在workflow里添加environment配置配合GitHub的Protected Environments功能关键时刻能救命。那些年我们踩过的坑秘密管理GitHub Secrets有大小限制64KB大文件如服务账号JSON得用base64编码后存。更复杂的建议用Vault或AWS Secrets Manager。矩阵测试Python 3.8、3.9、3.10都要测用矩阵策略strategy:matrix:python-version:[3.8,3.9,3.10]本地调试用act工具可以在本地运行Actions但Docker in Dockerdind相关的工作流可能跑不起来要有心理准备。超时问题默认6小时超时对于长测试可能不够。在job级别设置timeout-minutes: 120。缓存优化pip和Docker层缓存一定要配否则每次都要从头下载既慢又费流量。个人经验谈CI/CD流水线不是一蹴而就的。我们团队的第一版只有pytest测试后来逐步加了代码检查、安全扫描、性能基准测试。关键是要让流水线“活”起来——每次失败都要分析原因是测试不稳定还是代码真有bug必要时调整流水线而不是绕过检查。另一个建议在README最显眼的位置放上CI徽章。看到所有检查都是绿的那种安全感比任何文档都管用。当绿色成为团队的集体习惯代码质量自然就上去了。最后记住自动化不是为了淘汰人而是让人去做更有价值的事。以前部署要手动执行十几步操作现在点个按钮就行。省下来的时间可以多写两个测试用例或者优化一下数据库查询。工程师的成就感不就来自这些细节的持续改进么

相关文章:

016、CI/CD流水线:用GitHub Actions把部署从玄学变成肌肉记忆

016、CI/CD流水线:用GitHub Actions把部署从玄学变成肌肉记忆 上周深夜,线上服务突然告警。紧急回滚时发现,测试环境通过的镜像在生产环境死活起不来。查了三个小时,最后发现是某位同事在Dockerfile里写死了测试数据库的IP。这种“…...

卡诺图简化逻辑函数详解

你提供的图片是数字逻辑电路教材中关于**卡诺图(Karnaugh Map)**的内容,主要讲解如何用卡诺图表示和化简逻辑函数。下面我为你逐部分解释:📌 一、核心概念:什么是卡诺图?卡诺图是一种图形化工具…...

Ai2Psd终极指南:如何将Illustrator矢量图层完美导出到Photoshop

Ai2Psd终极指南:如何将Illustrator矢量图层完美导出到Photoshop 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 还在为AI到PSD的格…...

AI CRM 2.0时代:SaaS厂商的生死局

今天的SaaS厂商,要么彻底重构底层架构,要么被时代抛弃。原创:首席数智官 封面:AI“未来每一家SaaS公司都会成为AaaS(Agentic as a Service)公司。”这是英伟达创始人、CEO黄仁勋在GTC 2026演讲中给出的判断…...

代购系统技术实现:如何高效采集 1688 和淘宝商品数据

# 代购系统技术实现:如何高效采集 1688 和淘宝商品数据在跨境电商和代购业务中,高效采集 1688 和淘宝商品数据是核心痛点。本文分享我们在 taocarts 代购系统中的技术实践。## 一、数据采集架构设计我们采用分布式爬虫架构,核心模块包括&…...

实战部署JetBrains IDE试用期重置:自动化清理与插件开发全流程

实战部署JetBrains IDE试用期重置:自动化清理与插件开发全流程 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具是一个开源项目,专门用于清除IntelliJ IDEA、Py…...

定制化水源热泵技术,实现低品位余热高效捕获

低品位余热的高效回收利用,核心在于能否打造出适配水源特性与工况需求的核心热泵机组,只有实现对余热资源的精准捕获,才能真正将闲置余热转化为可利用的清洁能源。针对鲁西南矿区的水源特性与极端气候工况,瑞冬为当地某铁矿项目针…...

【西工大主办、连续多届稳定检索】第七届机械仪表与自动化国际学术会议(ICMIA 2026)

2026年第七届机械仪表与自动化国际学术会议(ICMIA 2026)定于2026年6月26-28日在中国成都隆重举行。随着科学技术的不断发展和工业化的加速,现代工业生产的自动化程度越来越高。而机械仪表自动化作为现代工业控制的重要组成部分,其…...

游戏脚本助手,电脑点击器,脚本自动点击识图找图_无限试用版

熊猫精灵脚本助手 分类功能项其他功能管理、插件、生成、中控、进程守护、护盾配置、坐标工具脚本设置窗口设置、绑定设置、运行设置、变量设置、程序设置图色识别Yolo识别、找图识别、点色找色文字识别ocr识别找字、字库识别、验证码识别键鼠操作鼠标操作、键盘操作、录制脚本…...

网站爬虫原理,基于浏览器点击行为还原可接口请求

爬虫这个词细节来说本质只有一件事,把浏览器发出的请求,换一种方式再发一遍 问题不是怎么发请求,而是: 请求是怎么构造的参数从哪里来的哪些字段不能少从一个点击动作开始 打开一个网站,例如一个列表页。 执行一个动作…...

Tree-sitter解析代码

Tree-sitter 语法树 到底是什么、长什么样、包含什么东西。一、通俗解释Tree-sitter 会把一行行代码,解析成一棵结构化的「语法树」(像家族树一样有层级、有分类),让机器能看懂代码的结构(哪个是方法、哪个是方法名、哪…...

毕业设计作品精选【芳芯科技】酒驾检测座椅设计

实物效果图:实现功能:有人的情况下,单片机实时采集周围的酒精浓度,如果超出,蜂鸣器报警,LED闪烁。检测座位重量和检测人体发射的红外,两者都满足认为座位有人,否则无人。配有显示屏进…...

如何打造专属漫画体验?Venera主题定制全攻略

如何打造专属漫画体验?Venera主题定制全攻略 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 核心价值:为什么要定制Venera主题? 在数字阅读时代,个性化体验已成为提升用户满意…...

Oracle里的MINUS是什么

在 Oracle 中,MINUS 是 SQL 中的一个集合操作符,它用于比较两个查询的结果集,并返回第一个查询中有而第二个查询中没有的不重复记录。 核心概念 MINUS 执行的是集合的“差集”操作。你可以把它想象成数学中的减法:结果集A - 结果集…...

7大能力解锁:让浏览器成为你的全能Markdown工作站

7大能力解锁:让浏览器成为你的全能Markdown工作站 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 据开发者生态调研显示,超过90%的技术文档工作者面临本地…...

储能变流器双向软开关设计:从拓扑选型到控制策略的工程实现

一、储能PCS的技术挑战与设计目标1.1 储能系统的核心需求储能变流器(PCS)是实现电池与电网之间能量双向流动的关键设备,在充电模式下将电网交流电转换为直流电为电池充电,在放电模式下将电池直流电转换为交流电馈入电网或供给负载…...

TA6585替代品6586直流双向电机驱动芯片详解

在电机驱动领域,芯片的性能、稳定性与适配性决定着设备的运行效果与使用寿命。6586作为TA6585的替代品,是一款高性能直流双向电机驱动芯片,凭借其小巧的封装、全面的保护功能及广泛的适配场景,替代TA6585,成为玩具、智…...

MogFace-large效果对比:在遮挡/小脸/密集场景下超越YOLOv8与RetinaFace实测

MogFace-large效果对比:在遮挡/小脸/密集场景下超越YOLOv8与RetinaFace实测 1. 引言:人脸检测的现实挑战 在实际应用中,人脸检测面临着三大难题:遮挡、小脸和密集场景。当人脸被口罩、眼镜或其他人遮挡时,传统检测器…...

实战分享:WAN2.2文生视频结合SDXL风格,用Python打造自动化视频生产线

实战分享:WAN2.2文生视频结合SDXL风格,用Python打造自动化视频生产线 1. 为什么选择WAN2.2SDXL组合进行视频创作 在数字内容爆炸式增长的今天,视频创作已经成为各行各业的基本需求。但传统视频制作流程复杂、成本高昂,让许多创作…...

千问3.5-2B在内容审核中的应用:自动识别敏感图文组合,降低人工复核成本

千问3.5-2B在内容审核中的应用:自动识别敏感图文组合,降低人工复核成本 1. 内容审核的挑战与机遇 每天,互联网上产生数以亿计的图文内容,如何高效识别其中的敏感信息成为平台运营者的重大挑战。传统人工审核方式面临三大痛点&am…...

保姆级教程:用国产龙虾AiPy自己打造全链路写文到一键发布

近期在探索 AI 自动化办公场景,尝试通过智能体工具自主构建功能插件,实现从内容创作、图文排版到公众号上传发布的全流程自动化,同时搭配远程控制功能,实现户外离线指令触发、电脑端自动执行,大幅降低自媒体日更的操作…...

连锁经营行业商旅平台选型指南与测评排名Top 6:多门店与全链路商旅管控方案

2026年4月的第一周,艾美咨询发布了《2026年中国连锁经营行业商旅管理数字化白皮书》,数据显示国内规模以上连锁经营企业的商旅支出占整体运营成本的8.7%,其中私车公用、门店巡检类商旅的合规漏洞造成的浪费占总商旅支出的19.2%,连…...

构筑可信电子签名签章体系,亲笔签助力黔江区公立医院改革与高质量发展

巍巍武陵山,滔滔阿蓬江,在渝东南这片热土上,一个关乎50余万群众健康福祉的数字变革正在发生。2022年,黔江区成为首批入选公立医院改革与高质量发展示范项目全国15个试点地区之一。从“看病难、看病远”的山区困境,到“…...

每日一题 力扣 3418. 机器人可以获得的最大金币数 力扣 215. 数组中的第K个最大元素 动态规划 TopK问题 C++ 题解

文章目录力扣 3418. 机器人可以获得的最大金币数题目描述思路简介代码实现复杂度分析力扣 215. 数组中的第K个最大元素题目描述思路简介代码实现复杂度分析踩坑记录力扣 3418. 机器人可以获得的最大金币数 题目描述 力扣 3418. 机器人可以获得的最大金币数 示例 1&#xff1…...

市场推广需要哪些数据分析能力?渠道评估、归因和转化怎么分析

市场推广数据分析能力框架市场推广的核心在于数据驱动决策,掌握以下能力可显著提升推广效果。CDA数据分析师证书持证者通常在这些领域具备系统化知识。能力维度关键技能应用场景数据采集能力熟悉Google Analytics、Adobe Analytics等工具,掌握UTM参数设置…...

2025届最火的十大AI辅助论文平台横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AIGC检测服务是学术规范领域里较为重要的技术工具,它的核心功能是去识别学术…...

Vue生命周期的灵魂拷问:created vs mounted,数据请求到底该在哪?

Vue生命周期的灵魂拷问:created vs mounted,数据请求到底该在哪? 在Vue.js的世界里,生命周期钩子是赋予开发者“上帝视角”的魔法,让我们能在组件从诞生到消亡的整个过程中,在精确的时机注入自定义逻辑。其…...

2026届最火的AI辅助论文网站横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想把内容被认定成AIGC的可能性给降低,能够采用下面这些策略:第一&a…...

3分钟免费搞定Axure RP中文汉化:完整语言包安装指南

3分钟免费搞定Axure RP中文汉化:完整语言包安装指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的…...

如何使用Unlocker工具在VMware中启用macOS虚拟机支持

如何使用Unlocker工具在VMware中启用macOS虚拟机支持 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker Unlocker是一款开源工具,能够帮助用户在VMware虚拟机软件中解锁对macOS操作系统的支持。…...