DevOps产品开发实践

news2025/2/27 2:44:29

背景

2022年11月,公司启动了智能运维产品的研发项目,该项目基于zabbix进行二次开发,对行业客户的数据中心的基础软硬件设施进行数据采集和分析,通过持续的数据采集和监控,及时发现数据中心软硬件的异常状态并预警,同时为故障处理,根因溯源,提供数据支撑,满足银行日常运维需求。

产品的整体开发思路是基于DevOps思想进行实践的,采用敏捷开发,每两个星期作为一个产品的迭代周期,在每个迭代的结束,团队会审查、评估和改进自己的工作方式,以便更好地满足客户需求和适应变化。

什么是DevOps

DevOps是 Development 和 Operation 组合而成的词。是一种让开发者和运维者共同努力,顺利开发和运维,不断提升系统价值的理念。

开发VS运维

  • 开发人员希望快速完成代码并快速部署系统

  • 运维人员则希望有足够的时间在部署前进行测试

解决方案:采用 DevOps 消除了两者之间的冲突,并显着改善了系统发布周期。

为什么使用DevOps

提高开发速度

DevOps 通过拥有一种支持开发人员和运维人员之间协作的机制,以及通过实现各种工作的自动化,显着提高了开发速度。借助微服务和持续交付,可以快速发布更新,从而快速响应不断变化的用户需求

提高系统稳定性

在短时间内重复开发,更容易发现错误和缺陷。此外,可以通过自动化任务(如自动编译构建,测试,部署等)来防止人为错误。这些实现提高了工作的可靠性,保持了系统的稳定运行

提高生产力

通过采用 DevOps,利用工具来改善开发人员和运营人员之间的协作,加快发布过程,更容易整合用户反馈,并提高工作效率

提高安全性

通过将安全性集成到持续集成 (CI/CD)、持续交付和持续部署管道中,可以将安全性在产品的构建过程中介入

提高企业竞争力

如果没有 DevOps 系统,将在竞争激烈的社会中落后,比如无法响应管理部门对新服务的请求,无法及时响应用户请求

DevOps 中的开发方法

持续集成(CI): 持续集成是关于运行自动化构建和测试。它使构建和测试能够在一天中频繁且自动地发生,并且是 DevOps 不可或缺的一部分,可以快速发现并修复代码缺陷,从而在短时间内开发出高质量的系统

持续交付(CD): 持续交付创建一个发布管道,自动部署构建,每当代码更改时自动准备发布到生产环境。持续交付有助于我们更好地在内部沟通变化,并有助于关注用户价值

持续部署(CD): 部署自动化,持续高频率交付最新特性。快速响应市场变化的公司使用持续部署来确保最新的软件始终可供其用户使用

持续反馈: 持续反馈是指不断接受用户对服务的意见和要求,并在开发中反映出来。通过聊天、电子邮件和 SNS 上的评论进行的查询也可以通过持续反馈纳入开发

持续监控: 如果系统出现问题,需要实时发现并修复。持续监控是做到这一点的方法。通过持续监控,可以快速查明问题的根本原因,防患于未然发生系统中断,并最大限度地减少对用户造成的潜在问题

DevOps生命周期

DevOps 的生命周期由基本的七个步骤组成:“计划”、“编码”、“构建”、“测试”、“部署”、“运行”和“监控”。

请添加图片描述

  • 计划:定义整个项目的任务管理和开发要求
  • 编码:程序员根据开发需求创建代码
  • 构建:从源代码创建一个工作应用程序
  • 测试:测试构建的应用程序是否存在错误和其他缺陷
  • 部署:将应用程序部署到生产环境
  • 运营:进行维护管理工作,提供持续服务
  • 监控:检查从操作、评价和用户请求中获得的信息

依次、连续地重复这些步骤,就是DevOps的实践。

DevOps文化

2009 年,Flickr 发布了 DevOps 理念,强调四种文化,以在开发人员和运营人员之间建立协作关系。

  • 尊重:互相尊重,评价对方的能力和成就
  • 信任:相互信任,根据角色委派任务
  • 对失败的积极态度:失败是可能的,所以不要责怪别人
  • 避免责备:与其责备失败,不如鼓励建设性的讨论,以防止失败的发生

DevOps实践

在研发智能运维产品的过程中,遵循DevOps的理念和生命周期,依次连续地从计划,编码,构建、测试、代码安全扫描、部署,跟进产品上线运行情况,监控用户反馈信息来不断地进行产品迭代和优化。

下面从具体的步骤,来说明我们的产品软件开发是如何进行DevOps实践

请添加图片描述

上图可见,蓝色的主要是开发的事情,而橙黄色则主要是运维的事情,可以看到,只要产品一旦有新的开发需求,那么这一连串的任务又得重新执行一遍,对于蓝色那部分,目前很难实现自动化,需要架构师进行设计以及程序员去使用代码和算法实现,然而对于运维那部分,每次的需求变动,这部分内容几乎是不会发生变化的,因此可以实现运维部署自动化。

在本项目中,我们的产品代码是托管在gitlab上,通过jenkins来实现整个产品的CI/CD。jenkins采用pipeline,将代码仓库变动后的一系列操作交由jenkins进行监督执行。

请添加图片描述

请添加图片描述

计划

产品经理通过在TAPD上面提交对于产品的相关的需求和实现要求,并指派项目组成员进行开发实现。

产品的开发采用敏捷迭代的方式进行,设计每两周为一个周期,对产品的功能需求点进行追踪。

请添加图片描述

产品的开发追踪采用TAPD工具进行,该TAPD集成了企业微信的通讯录,方便公司成员内部进行协同沟通,以及开发任务的分配。

在这里插入图片描述

需求分析

针对产品需求的特点,产品经理可根据需求情况召集公司高层,产品架构师,市场经理,开发经理等角色,参与并分析产品的需求是否合理,讨论需求是否满足市场需要,技术上是否可以实现,公司的技术资源能力能否覆盖需求,有哪些经济/政治/技术风险等

概要设计

开发经理根据讨论后的需求,对需求的技术实现提供一个概要设计,对前后端交互的接口规范进行定义设计

编码

开发工程师,根据产品的计划和需求,接受指定的开发任务,在产品的开发代码仓库中,建立需求分支并在规定的时效内,通过熟悉的开发IDE和编程语言来完成需求任务的开发

本地测试

开发工程师在完成本地需求功能代码开发后,编写单元测试代码,测试该业务功能代码,确保业务代码的单元测试正常通过

提交代码

开发工程师完成本地开发和验证后,需要向代码仓库提交一个Merge Request,将新增或修改后的代码加入代码仓库,由开发经理进行审核,如果验证代码质量没问题,那么批准该代码分支合并到主分支,成为最终产品代码的一部分。

代码安全扫描

在每次main主分支的代码有变动时,漏洞扫描工具将通过预定义的代码安全规则对产品库的代码进行静态扫描,在发现漏洞代码的前提下,召集开发经理和工程师对漏洞进行分析,作为一个Bug需求,在下一次版本进行更新迭代,确保代码没有明显的开发漏洞

漏洞扫描工具将定期同互联网进行同步最新的安全规则

构建应用程序

在通过代码安全扫描的仓库代码,后端服务器将更新代码,重新对代码进行编译构建,前端主要是通过node工程来进行编译,主要用到了npm命令来构建,后端代码是一个基于sprintboot的java工程,主要是通过maven工具来构建

制作镜像文件

在构建完成后生成目标可执行程序,使用Dockefile指令,通过基于官方的基础镜像文件,添加本产品的可执行程序和配置,完成对产品前后端程序的封装

前端Dockerfile文件

FROM node:16.15.1-slim as builder
COPY . /app/
WORKDIR /app/
RUN sed -i 's#http://deb.debian.org#http://mirrors.huaweicloud.com#g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y python3 make gcc g++ 
RUN yarn
RUN yarn build:prod

FROM nginx
WORKDIR /app
VOLUME /myvol
COPY --from=builder ["/app/dist","/app/"]
COPY --from=builder ["/app/znyy-web.conf","/etc/nginx/conf.d/"]
RUN chown -R nginx:nginx /app

后端Dockerfile文件

FROM maven:3.8.5-openjdk-11 as builder
COPY . /app/
WORKDIR /app/
RUN mvn package

FROM openjdk:11.0.15-oraclelinux7
ENV ZNYY_DB znyy_db
ENV ZNYY_PORT 3306
ENV ZNYY_USER root
ENV ZNYY_PASS root123
ENV ZABBIX_DB zabbix_db
ENV ZABBIX_PORT 5432
ENV ZABBIXDB_USER zabbix
ENV ZABBIXDB_PASS zabbix
ENV TZ Asia/Shanghai
COPY --from=builder ["/app/znyy-system/target/znyy-system-2.6.jar", "/app/znyy-system-2.6.jar"]
CMD java -jar /app/znyy-system-2.6.jar --spring.profiles.active=prod

推送至制品库

在公司内部,通过harbor构建一个企业级的制品仓库,将封装完成后的镜像文件,推送到制品仓库,以供后续的容器调度引擎进行调度部署

后端制品库

请添加图片描述

前端制品库

请添加图片描述

产品部署

当制品库的镜像文件更新时,通过拉取或更新镜像文件,重新对产品的前端/后端镜像进行部署

docker-compose部署

# docker-compose -f srq-znyy.yaml ps
NAME                                 COMMAND                  SERVICE                  STATUS               PORTS
znyy-prod-db_data_mysql-1            "sh"                     db_data_mysql            exited (0)           
znyy-prod-db_data_pgsql-1            "sh"                     db_data_pgsql            exited (0)           
znyy-prod-grafana-1                  "/run.sh"                grafana                  running              0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
znyy-prod-mysqldb-1                  "docker-entrypoint.s…"   mysqldb                  running              0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
znyy-prod-postgres-server-1          "docker-entrypoint.s…"   postgres-server          running              0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
znyy-prod-redisdb-1                  "docker-entrypoint.s…"   redisdb                  running              0.0.0.0:6379->6379/tcp, :::6379->6379/tcp
znyy-prod-zabbix-server-1            "/sbin/tini -- /usr/…"   zabbix-server            running              0.0.0.0:10051->10051/tcp, :::10051->10051/tcp
znyy-prod-zabbix-web-nginx-pgsql-1   "docker-entrypoint.sh"   zabbix-web-nginx-pgsql   running (healthy)    0.0.0.0:80->8080/tcp, :::80->8080/tcp
znyy-prod-znyy-admin-1               "/bin/sh -c 'java -j…"   znyy-admin               running              
znyy-prod-znyy-web-1                 "/docker-entrypoint.…"   znyy-web                 running (starting)   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp

kubernetes部署

# kubectl get pods -n srq-znyy -o wide
NAME                            READY   STATUS    RESTARTS        AGE     IP            NODE              
grafana                         1/1     Running   2 (3d6h ago)    9d      11.55.3.251   k8s-node1.demo.com
myapp-busybox-pod               1/1     Running   152 (15m ago)   6d7h    11.55.3.6     k8s-node1.demo.com
mynginx-test-6b8665bd9c-rg8r4   1/1     Running   1 (3d6h ago)    7d21h   11.55.3.2     k8s-node1.demo.com
mysqldb                         1/1     Running   2 (3d6h ago)    9d      11.55.3.9     k8s-node1.demo.com
postgres-server                 1/1     Running   2 (3d6h ago)    9d      11.55.3.5     k8s-node1.demo.com
redis                           1/1     Running   1 (3d6h ago)    7d21h   11.55.3.15    k8s-node1.demo.com
zabbix-server                   1/1     Running   2 (3d6h ago)    9d      11.55.3.4     k8s-node1.demo.com
zabbix-web-nginx-pgsql          1/1     Running   2 (3d6h ago)    9d      11.55.3.253   k8s-node1.demo.com
znyy-admin                      1/1     Running   2 (3d6h ago)    9d      11.55.3.249   k8s-node1.demo.com
znyy-web                        1/1     Running   1 (3d6h ago)    7d21h   11.55.3.11    k8s-node1.demo.com

功能验证

  • 产品经理来验证产品迭代的功能是否满足需求

    产品经理根据功能实现情况,同需求计划,产品实现路线进行验证,判断此次迭代是否满足需求,达到目标,对此次迭代进行评价后,再决定是否开启下一个迭代目标

  • 质量工程师验证产品是否满足质量指标,在测试的过程中,是否有明显的用户体验问题

以上各个阶段过程在产品的开发阶段进行循环往复,直到第一个产品版本进行正式发布。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s集群部署 | 三节点(复用)高可用集群过程参考

文章目录 1. kubeadm 部署三节点(复用)高可用 k8s 集群1.1 环境规划阶段1.1.1 实验架构图1.1.2 系统版本说明1.1.3 环境基本信息1.1.4 k8s 网段划分 1.2 基础安装及优化阶段1.2.1 系统信息检查1.2.2 静态 IP 地址配置1.2.3 配置主机名1.2.4 配置/etc/hos…

open3d 源码阅读kd_tree_search.py

核心函数接口: search_radius_vector_3d search_knn_vector_3d # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ----------------------…

基于Html+css的图展示52

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

ubuntu脚本解释器踩坑:#!/bin/bash 与 #!/bin/sh

前言: 博主正在写linux的脚本的时候遇到:xx.sh: 3: Syntax error: "(" unexpected 查看shell脚本语法没有问题,后面发现是解释器的原因。 一、不同的解释器 #!是特殊的表示符,其后面根的是此解释此脚本的shell的路径…

【Linux】Linux安装Nexus(图文解说详细版)

文章目录 1.下载2.解压3.启动4.打开防火墙(云服务器)5.访问nexus 1.下载 https://help.sonatype.com/repomanager3/product-information/download/download-archives—repository-manager-3 新建nexus文件夹,上传到服务器中 2.解压 tar -zxvf nexus-3.…

Java序列化引发的血案

1、引言 阿里巴巴Java开发手册在第一章节,编程规约中OOP规约的第15条提到: **【强制】**序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱&#x…

【大数据之Hadoop】二十七、生产调优-HDFS多目录

1 NameNode多目录配置 NameNode本地目录可以配置多个&#xff0c;每个目录存放内容相同&#xff0c;增加可靠性。 在hdfs-site.xml中添加&#xff0c;每台服务器节点的磁盘不同&#xff0c;可以选择不分发。 <property><name>dfs.namenode.name.dir</name>…

All in AI,现在开始算不算太晚?

编者按&#xff1a;目前大模型近乎可以帮助人类处理方方面面的事情&#xff0c;如对话、写文章、写代码等等。在大模型“狂飙”趋势下&#xff0c;想要从事AI领域的小伙伴可能会犹疑&#xff1a;现在进入AI领域会不会已经太晚了&#xff1f; 本文作者结合自身转型经历和对AI市场…

蓝牙耳机哪个牌子好?无线蓝牙耳机前十排名

现如今&#xff0c;蓝牙耳机品牌越来越多&#xff0c;很多人都不知道怎么选。下面&#xff0c;我来给大家推荐十款很不错的蓝牙耳机&#xff0c;有需要的朋友可以参考一下。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;239 蓝牙版本&#xff1a;5.3 南卡作为国产影音数码…

[数据库系统] 四、分组操作符与聚集函数

第1关&#xff1a;数据统计&#xff08;初级&#xff09; 使用 group by 语句结合聚集函数解决数据统计问题 数据统计 一般的数据统计关系代数表达式如下&#xff1a; 其中L是属性集。含义是在属性集L上分组&#xff0c;分组后用函数fun运算 &#xff0c;如 表示按性别sex的…

Android UI深度理解:Activity UI视图结构

Activity UI视图结构 每个Activity都会获得一个窗口&#xff0c;那就是Window&#xff0c;它用于绘制用户的UI界面 Window是一个抽象类&#xff0c;提供了绘制窗口的一组通用API&#xff0c;PhoneWindow是它的唯一实现类 DecorView是所有应用窗口的根节点。是FrameLayout的子类…

java 生产者消费者问题解决办法

Java的生产者消费者模式是 Java的核心之一&#xff0c;它可以提供很好的性能和扩展性。但是在 Java的生产环境中&#xff0c;生产者消费者模式并不是很稳定&#xff0c;因为如果出现网络问题、程序崩溃等情况&#xff0c;生产者消费者模式可能会不稳定&#xff0c;给业务带来影…

实例七:MATLAB APP design- 灰色预测-G(1,1)

注:该算法主要用来做预测,不需更改调试程序,可以直接导入数据使用。在下面会详细介绍APP制作的过程以及使用方法。 一、灰色预测-G(1,1)的原理解析 1. 生成累加数据 k表示时刻, 表示 t=k 时刻某量的观测值,不妨设 , 将原始数据列记成

工控机AllInOne——篇5,pve安装istoreos

工控机AllInOne——篇5&#xff0c;pve安装istoreos 1、准备 istoreos img镜像 2、镜像解压 3、镜像上传到pve iso 4、虚拟盘挂载 qm importdisk 10X XXX local-lvm其中10X代表是pve虚拟机序号&#xff0c;XXX代表iso文件上传位置 之后将虚拟盘设为sata 5、启动pve虚拟机…

腾讯云轻量8核16G18M服务器带宽CPU系统盘性能测评

腾讯云轻量应用服务器8核16G18M带宽配置&#xff0c;18M公网带宽下载速度峰值可达2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;3500GB月流量&#xff0c;折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽…

全年前装出货超200万台,W/AR HUD赛道进入新竞争周期

作为座舱智能化、体验升级的关键环节&#xff0c;HUD赛道仍处于快速变化周期。 本周&#xff0c;水晶光电宣布&#xff0c;已经正式获得捷豹路虎全球下一代EMA电气化平台多个车型的WHUD和AR HUD定点&#xff0c;后者作为捷豹路虎的全新纯电动平台&#xff0c;预计将于2025年量…

数据可视化第二版-拓展-和鲸网约车分析一等奖作品

文章目录 数据可视化第二版-拓展-网约车分析案例竞赛介绍 1等奖作品-IT从业者张某某的作品结论过程数据和思考数据处理数据探索数据分析方法选择数据分析相关性分析转化率分析分析结论 完单数量分析分析结论 司机数量分析分析结论 时间分析每日订单分析 工作日各时段分析周六日…

redis(5)

需求:防止用户进行暴力破解密码 package com.example.demo;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.HashOperations; import org.sprin…

数据结构-树、森林应用(哈夫曼树)

目录 一、树存储结构 1.1双亲表示法 1.2孩子表示法 *1.3孩子兄弟表示法 * 二、树&#xff0c;森林、二叉树之间的转化 三、树和森林的遍历 3.1树 *3.1.1先根遍历 *3.1.2后根遍历 *3.1.3层次遍历 3.2森林 * 3.2.1先序遍历 *3.2.2中序遍历 *等同关系 四、哈夫曼树和哈夫…

开源音频处理库AudioLDM

环境 windows 10 64bitAudioLDM 0.1.1anaconda with python 3.8nvidia gtx 1070Ti 简介 AudioLDM 是一个开源的音频处理库&#xff0c;它可以用于实现语音识别、语音合成、语音转换等应用&#xff0c;很多 AIGC 大模型都在用它。该库提供了一组音频信号处理算法&#xff0c;包括…