一个人活成一个团队:python的django项目devops实战

文章目录

    • 一、需求规划
    • 二、代码管理
    • 三、创建流水线
      • 1、配置流水线源
    • 四、自动测试
    • 五、自动构建
    • 六、自动部署
    • 七、总结

对于开发团队来说提高软件交付的速度和质量是一个永恒的话题,对于个人开发者来说同样如此。作为一个码农,一定会有几个自己私有的小项目,从需求管理到开发到测试到部署运维都得要自己来,将自己一个人活成一个团队。

DevOps(Development和Operations的组合),旨在通过自动化、协作和共享责任来提高软件开发和运维的效率、质量和安全性。作为一个人的团队,也可通过devops实践来提高对自己项目的效率和质量,使产品持续开发、持续集成、持续测试、持续部署、持续监控,非常频繁地发布新版本。本文就以一个实际的python的django项目来运用阿里的云效devops平台来进行实战。
在这里插入图片描述
DevOps平台工具有很多,最常见的就是大名顶顶的Jenkins,作为个人开发者要准备相应的硬件资源,还要要自己维护一套Jenkins有点麻烦。这里直接就选择成熟的阿里云效devops https://devops.aliyun.com/,这套平台基础版是免费的,对于个人开发者来说已经够用了。

一、需求规划

个人项目虽小,但是也得要有相应的规划,至少得有个需求清单来进行需求的规划和跟踪,哪些需求已经完成了,哪些还需要进行开发做到自己心中有数。
可以在云效的项目协作中创建一个项目进行管理。
在这里插入图片描述

在这里我创建了一个xiejava的博客项目
在这里插入图片描述

在这里我们就可以将自己规划的需求录入进来做好自己的需求跟踪清单
在这里插入图片描述

可以规划自己的版本,将需求跟踪清单里的需求纳入到版本迭代计划。
在这里插入图片描述

在迭代计划中可以看到这个迭代要完成的需求清单。
在这里插入图片描述

二、代码管理

即使是最简单的项目,建议还是通过代码仓库进行代码的版本管理,我的代码是放到码云https://gitee.com/xiejava/ishareblog 进行托管的,也可以托管到云效自己的代码管理仓库。
有了代码仓库,可以通过在云效构建流水线来进行自动构建、自动测试、自动部署了。

三、创建流水线

在云效中创建ishareblog的自动发布流水线,整个流水线包括获取代码、测试、构建、部署。
在这里插入图片描述

1、配置流水线源

流水线源可以配置云效自己的代码库,也可以配置其他的代码库,如我里是配置的码云代码库。
可以开启代码源触发,开启后一旦代码库有提交操作,就会自动触发流水线工作。
在这里插入图片描述

需要说明的是,如果是外部的代码仓库,需要在外部的代码仓库中添加Webhook触发设置

如我的是码云的仓库,就要在码云的仓库中添加Webhook的配置
在这里插入图片描述

四、自动测试

在测试环节,配置了python代码扫描和Python单元测试。
python代码扫描用的是云效默认的配置
比较麻烦的是Python单元测试,Python单元测试需要在Python项目中写测试用例,还要配置测试命令。
在Python项目中写测试用例见《django集成pytest进行自动化单元测试实战》。
配置测试命令就是在测试服务其中进行发布测试的所有shell命令
在这里插入图片描述

配置测试命令就是在测试服务其中进行发布测试的所有shell命令
作为一个django的项目测试命令参考如下:

# pytest default command
# 安装mysql客户端
sudo apt-get update
sudo apt-get install -y libmysqlclient-dev# 安装新版本的SQLite3
# wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz# 安装依赖
sudo pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip install pysqlite3 -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip install pysqlite3-binary -i https://pypi.tuna.tsinghua.edu.cn/simple# 替换Django的sqlite3的驱动文件
sudo cp -f /root/workspace/ishareblog_J18t/change_set/base.py  /usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py# 初始化数据库
sudo python manage.py makemigrations --settings=ishareblog.settings_test
sudo python manage.py migrate --settings=ishareblog.settings_test# 启动django服务
sudo nohup python manage.py runserver 8000 --settings=ishareblog.settings_test &PORT=8000  # 替换为您想要检查的端口号
NEXT_COMMAND="sudo pytest --html=report/index.html"  # 通过pytest进行单元测试until nc -z localhost $PORT; doecho "Port $PORT is not ready - waiting..."curl http://localhost:8000sleep 1
doneecho "Port $PORT is ready"
eval "$NEXT_COMMAND"ps aux | grep python# 通过pytest进行单元测试
#sudo pytest --html=report/index.htmlpkill -f manage.pyps aux | grep python

因为在单元测试中还做了接口测试,这里会要启动djang服务,进行接口测试,测试完成后还要停止服务。
可以在流水线执行完后查看扫描报告和测试报告
在这里插入图片描述

扫描报告
代码扫描报告,报出来的大部分是格式规范的问题。
在这里插入图片描述

测试报告
自动化测试报告是通过pytest测试完成形成的报告。
在这里插入图片描述

五、自动构建

自动构建将会将构建好的制品打包上传至构建服务器上。
在这里插入图片描述

六、自动部署

在这里插入图片描述

也可以配置部署后的通知邮件,比如部署成功或失败后发邮件通知。

在这里插入图片描述

最后通过统计报表可以看到流水线近段期间的执行情况

在这里插入图片描述

七、总结

DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。


博客地址:http://xiejava.ishareread.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 脚本转换为drawio ER 脚本

Navicat 导出数据库脚本 通过代码转换脚本 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** SQL 脚本转换为 drawio ER 脚本*/ pu…

【C++指南】函数重载:多态性的基石

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、函数重载的概念 二、函数重载的原理 三、函数重载的应用场景 四、函数重载的规则 五…

使用 Vue 官方脚手架初始化 Vue3 项目

Vite 官网:https://cn.vitejs.dev/ Vue 官网:https://vuejs.org/ Vue 官方文档:https://cn.vuejs.org/guide/introduction.html Element Plus 官网:https://element-plus.org/ Tailwind CSS 官网:https://tailwindcss.…

Xilinx课程,就这么水灵灵地上线了~

如果你想了解: 如何利用精通流水线(Pipeline)技术,让电路设计效率倍增? 如何掌握利用性能基线指导设计流程的方法? 如何理解集成电路设计中的UltraFast Design Methodology Implementation设计方法学中的…

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…

docker技术中docker-compose与harbor技术

docker-composeharbor docker网络概念 当大规模使用docker时,容器间通信就成了一个问题。 docker支持的四种网络模式在run时指定 host模式 --nethost 容器和宿主机共享一个网络命名空间 container模式 --net{容器id} 多个容器共享一个网络 none模式 --netnone …

【深度学习】TTS,CosyVoice,推理部署的代码原理讲解分享

文章目录 demo代码加载配置文件speech_tokenizer_v1.onnx(只在zero_shot的时候使用)campplus.onnx(只为了提取说话人音色embedding)`campplus_model` 的作用代码解析具体过程解析总结示意图CosyVoiceFrontEndCosyVoiceModel推理过程总体推理过程推理速度很慢: https://git…

基于Python爬虫+机器学习的长沙市租房价格预测研究

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

数据库(三):DML

DML,全称Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改、查。 一、添加数据(INSERT) 注意事项: ①插入数据时,指定的字段顺序需要与值的顺序…

手机在网时长查询接口如何对接?(二)

一、什么是手机在网时长查询接口? 传入手机号码,查询该手机号的在网时长,返回时间区间,支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景? 比如:信用评估辅助 (1&#xff09…

二叉树建堆全过程(数组实现)

定义 typedef int HPDataType;typedef struct Heap {HPDataType* a;//用数组存数据int size;//当前数组存放数据的数量int capacity;//数组容量}HP; 即将要实现的功能 void HPInit(HP* php);//初始化 void HPPush(HP* php, HPDataType x);//堆尾插入数据(数组尾部…

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图,而《E…

深度学习入门指南(1) - 从chatgpt入手

2012年,加拿大多伦多大学的Hinton教授带领他的两个学生Alex和Ilya一起用AlexNet撞开了深度学习的大门,从此人类走入了深度学习时代。 2015年,这个第二作者80后Ilya Sutskever参与创建了openai公司。现在Ilya是openai的首席科学家,…

手机误操作导致永久删除照片的恢复方法有哪些?

随着手机功能的不断增强和应用程序的不断丰富,人们越来越依赖手机,离不开手机。但有时因为我们自己的失误操作,导致我们手机上重要的照片素材被永久删除,这时我们需要怎么做,才能找回我们被永久删除的照片素材呢&#…

Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元

文章目录 前言一、Langchain 框架概述二、大模型-RAG技术原理三、应用示例1.RAG案例一(私有文档直接读取-问答)2.RAG案例二(Vue上传文件结合文件内容回答问题)3.RAG案例三(Vue秒传文件结合文件内容回答问题&#xff09…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【SpringBoot】自定义注解<约定式i18n国际化>终极升级版方案源码Copy

零、前言 在后端对于 SpringBoot 的 数据库数据&#xff0c;需要国际化的字段和主要显示字段是分离的&#xff0c;为了避免大耦合性&#xff0c;与用户端的国际化字段处理问题&#xff0c;统一采用主要显示数据的实体字段。为此&#xff0c;我设计了一套解决方案&#xff0c;通…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…