通过自动化部署消除人为操作:不断提高提交部署比率

三十年后,我仍然热爱成为一名软件工程师。事实上,我最近读了威尔·拉森(Will Larson)的《员工工程师:超越管理轨道的领导力》,这进一步点燃了我以编程方式解决复杂问题的热情。知道雇主继续照顾员工、原则和杰出的工作分类,为想要成为一名工程师的技术人员提供了新鲜空气。

不幸的是,好的事情有时也会带来不太好的事情。对于今天的软件工程师来说,现实并不那么理想,因为 Toil 不断寻找一种方法来破坏日常工作效率。一个常见的例子是部署我们的工件——尤其是部署到生产环境中。

是时候更加重视部署自动化了。

传统的部署生命周期

软件工程师的开发生命周期通常围绕三个简单的步骤:开发、审查和合并。基于这些步骤,以下流程图说明了传统的部署生命周期:

图 1.传统开发生命周期

在图 1 中,软件工程师介绍了底层源代码的更新。创建合并请求后,持续集成 (CI) 工具将执行单元测试并执行静态代码分析。如果成功完成这些步骤,第二位软件工程师将对更改进行代码审查。如果这些更改获得批准,原始软件工程师会将源代码更改合并到主分支中。

此时,软件工程师开始部署到开发环境 (DEV),该部署由持续交付 (CD) 工具处理。在此示例中,候选版本被部署到开发人员并执行其他测试(如回归测试)。如果这两个步骤都通过,软件工程师将通过相同的 CD 工具启动到 QA 环境的部署。接下来,软件工程师创建变更单以将源代码更新发布到生产环境 (Prod) 中。一旦批准经理批准了变更单,软件工程师就会开始部署到产品中。此步骤指示 CD 工具执行产品部署。

不幸的是,流程中有几个点涉及到基于人工的任务。

是时候专注于消除辛劳了

Google 站点可靠性工程的 Eric Harvieux对 Toil 的定义如下:

“辛劳是一种往往是手动的、重复性的、自动化的、战术性的工作,缺乏持久的价值,并且随着服务的增长而线性扩展。”

软件工程师应该改变他们的心态,认识到在他们的角色和职责中识别辛苦。一旦承认辛劳,就应该制定任务来消除这些不利于生产力的项目。大多数敏捷团队会预留 20% 的冲刺能力用于积压任务。消除劳累始终是此类工作的完美候选者。

在图 1 中,以下任务是手动处理的,应视为“Toil”:

  1. 开始DEV部署
  2. 开始质量检查部署
  3. 创建变更单
  4. 经理批准变更票
  5. 开始产品部署

为了推动下一代部署生命周期,实现“Toil-free”非常重要。

DevOps 生命周期和部署自动化

虽然消除繁重工作是下一代部署生命周期的一个重要方面,但通过 DevOps 实现部署自动化也同样重要。使用 DevOps 管道,我们可以自动化部署流程,如下所示:

  1. 合并到主事件完成后创建发布候选映像。
  2. 创建新的候选版本时,自动部署到 DEV。
  3. 成功部署到 DEV 后继续部署到 QA。
  4. 一旦 QA 部署成功,就以编程方式创建变更票证。

在实施上述自动化过程中,消除了五项人工任务中的三项。为了减轻剩下的两项任务,可以利用可观察性平台。

服务所有者通常依赖其可观察性平台来支持和维护在生产中运行的应用程序。通过扩展覆盖范围以包括较低的环境(例如 DEV 和 QA),DevOps 管道可以使用Ansible等开源工具与部署生命周期期间发出的指标进行交互。

这意味着,当 DevOps 管道对环境进行更改时,可以创建Ansible Playbook来监视给定的一组指标,以便了解部署是否按预期运行。如果没有出现异常或错误,管道将继续运行。否则,当前任务将中止并恢复部署的先前状态。

因此,使用服务所有者和可观察性平台定义的指标集合,经理批准的需要就会减少。这是因为合并请求的批准是分析更改的地方。此外,通常会添加批准经理步骤,因为不存在更好的替代方案。更换经理审批步骤后,可以通过相同的 DevOps 管道触发到 Prod 的部署。

采用这种方法,变更单的状态可以反映自动化完成任务时的实际状态。示例雕像包括Created、To Be Reviewed、Approved、Started、In Progress和Completed(或Completed With Errors)。

下一代部署生命周期

通过消除 Toil 并通过管道引入 DevOps 自动化,可以创建下一代部署生命周期。

图 2. 下一代部署生命周期

在图 2 中,部署生命周期变得更小,不再需要审批经理角色。相反,可观测平台用于监控 DevOps 管道。

在下一代部署生命周期中,软件工程师在合并请求获得批准后执行合并到主步骤。从此时起,该过程的其余部分将完全自动化。如果在 CD 管道步骤期间发生任何错误,管道将停止并恢复之前的状态。

与图 1 相比,所有现有的 Toil 都已完全消除,团队可以认为合并到主事件是下一个生产版本的入口点。更令人兴奋的是,团队在采用此策略时将看到其承诺部署比率的改善。

粉碎不合理的阻拦者

在考虑下一代部署生命周期时,经常会出现三个常见的想法:

1. 在部署之前我们需要让企业知道

软件工程师应努力以不需要业务级批准的方式增强或更新服务。使用功能标志和版本化 URI 是如何在不影响现有客户的情况下实现自动化发布的示例。然而,传达计划的功能和修复以及预期的时间范围始终是一个好主意。

2. 经理应该知道将要部署什么

虽然这是一个公平的说法,但批准经理对更新的了解应该在冲刺计划阶段(或类似阶段)建立。一旦给定的一组工作开始,期望该工作将在给定的开发迭代期间完成并部署。像软件工程师一样,管理人员应该采用合并到主线最终导致部署到生产的思维方式。

3. 在将变更投入生产之前,至少应该有一个人批准变更

这是一个有效的语句,它实际上发生在合并请求阶段。事实上,下一代部署生命周期中剩余的批准是有充分理由的。当一名或多名审批者审查合并请求时,他们处于最佳位置(在最佳时间点)来审查和质疑正在完成的工作。此后,可观察性平台监控 DevOps 管道是否出现任何意外问题就更有意义。

结论

传统的开发生命周期通常包括人工审批和大量不可接受的工作。随着时间的推移,这种辛苦不仅会成为挫败感的根源,还会影响软件工程师的生产力和心理健康。团队应优先考虑消除其角色和职责中的辛苦工作,并使用 DevOps 管道并与现有可观察性平台集成来推动下一代开发生命周期。采用这种方法将使团队能够采用“合并到主线等于部署到产品”的心态。这样做的一个好处是,提交部署率将会提高。

三十年前,我发现了作为一名软件工程师的热情,三十年后,我仍然热爱成为一名软件工程师。事实上,我对未来的道路更加兴奋,由于 DevOps 自动化和劳力消除,不再需要人工审批。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pyside6,“提升为”的部件使用困惑

在Qt designer中,新建一个QMainWindow,新建一个QWidget,并命名为widget,如图: 新建NewClass.py,输入代码: # encoding: utf-8 from PySide6.QtWidgets import QWidgetclass NewClass(QWidget):…

关于Mac使用idea问题

多窗口切换问题 如果出现Mac打开idea新的项目,发现始终就一个窗口,不能像window那样多窗口,比如 只能这样来回点着切换,提供以下方案 1.方案一 则在idea里多个项目会呈tab页切换,也是始终一个窗口,只是多了…

SpringCloud Alibaba Sentinel 简介和安装

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十三篇,即介绍 SpringCloud Alibaba Sentinel 简介和安装。 二、Sentinel 简介 2.1 Sent…

STM32CubeMX配置步骤详解七 —— 时钟及其它内部参数配置(2)

接前一篇文章:STM32CubeMX配置步骤详解六 —— 时钟及其它内部参数配置(1) 本文内容主要参考: STM32CUBEMX配置教程(一)基础配置-CSDN博客 野火STM32系列HAL库开发教程 —— 第12讲 STM32的复位和时钟控制…

docker一键部署GPU版ChatGLM3

一键运行 docker run --gpus all -itd --name chatglm3 -p 81:80 -p 6006:6006 -p 8888:8888 -p 7860:7860 -p 8501:8501 -p 8000:8000 --shm-size32gb registry.cn-hangzhou.aliyuncs.com/cwp-docker/chatglm3-gpu:1.0 进入容器 docker exec -it chatglm3 /bin/bash cd /…

企业版ChatGPT用户激增至60万;百度文心一言推出个性化声音定制功能

🦉 AI新闻 🚀 企业版ChatGPT用户激增至60万 摘要:OpenAI首席运营官Brad Lightcap在接受采访时透露,企业版ChatGPT的注册用户已超60万,相较2024年1月的15万用户,短短三个月内增长了300%。这一版本自2023年…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家","内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

14 Python进阶:math模块和requests 模块

常用方法 Python3 的 math 模块提供了许多数学函数&#xff0c;用于执行常见的数学运算。以下是 math 模块中一些常用方法的简介&#xff1a; 数值运算函数&#xff1a; math.sqrt(x)&#xff1a;返回 x 的平方根。math.pow(x, y)&#xff1a;返回 x 的 y 次幂。math.exp(x)&a…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC&#xff08;多版本并发控制&#xff09;机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务&#xff0c;在写入新数据时不会直接替换旧数据&#xff0c;而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时&#xff0c;会导致读…

Golang | Leetcode Golang题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; var symbolValues map[byte]int{I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000}func romanToInt(s string) (ans int) {n : len(s)for i : range s {value : symbolValues[s[i]]if i < n-1 && value < symbolValues[s…

MySQL - MySQL数据库的事务(一)

1. 回顾一下MySQL运行时多个事务同时执行是什么场景 平时我们执行增删改的时候,无非就是从磁盘加载数据页到buffer pool的缓存页里去,对缓存页进行更新,同时记录下来undo log回滚日志和redo log重做日志,应该的是事务提交之后MySQL挂了恢复数据的场景,以及事务回滚的场景…

AcWing 3. 完全背包问题

解题思路 不过这种方式是有序的&#xff0c;而不是无序的。 相关代码 import java.util.Scanner;public class Main{static long f[] new long[1010];static int v[] new int[1010];static int w[] new int[1010];public static void main(String[] args){Scanner scan n…

Windows Docker 部署 PostgreSQL 数据库

一、简介 PostgreSQL是一个功能强大且特性齐全的对象-关系型数据库管理系统&#xff0c;它以加州大学计算机系开发的POSTGRES为基础&#xff0c;并具备高度自由开源的特性。PostgreSQL支持大部分SQL标准&#xff0c;提供了复杂查询、外键、触发器、视图、事务完整性以及多版本…

Android 11属性系统初始化流程

在init进程启动的第二阶段&#xff0c;调用PropertyInit 对属性系统进行初始化 int SecondStageMain(int argc, char** argv) {//省略PropertyInit();//省略 }PropertyInit函数在system\core\init\property_service.cpp 中实现 void PropertyInit() {//省略mkdir("/dev/…

2024最新SpringCloud学习教程,Consul/Nacos/Feign/Sentinel/Gateway/Seata一网打尽

本文主要介绍了SpringCloud最新的应用技术&#xff0c;简单说明每类技术涉及的知识点&#xff0c;对应技术的学习资料、软件、可用代码和下载地址在文末给出。 文章目录 说明SpringCloud简介ConsulConsul简介使用示例 NacosNacos简介使用示例 负载均衡LoadBalancerLoadBalancer…

链表实验.

#include<stdio.h> #include<stdlib.h>// 定义单链表节点结构体 struct Node {int data;struct Node* next; };struct Node* initList() {struct Node* list (struct Node*)malloc(sizeof(struct Node));list->data 0;list->next NULL;return list; }void…

蚁剑修改特征性信息

前言 我们首先得知道蚁剑的流量特征&#xff1a; 编码器和解码器的特征&#xff1a;蚁剑自带的编码器和解码器具有明显的特点&#xff0c;可以通过更改配置文件来达到流量加密的目的1。例如&#xff0c;蚁剑支持多种编码方式&#xff0c;如base64、chr、rot13等&#xff0c;这…

海量智库 | ANY权限原理介绍

ANY权限是Vastbase中的一种特殊的管理权限&#xff0c;用户能够通过ANY权限执行更广泛的操作&#xff0c;更加便利的管理数据库。 本文将为您介绍ANY权限管理的相关原理。 ANY权限管理相关解释 ANY权限管理&#xff0c;是对数据库内的某一类对象的所有实体进行特定的权限管理…

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为&#xff1a;封装、继承、多态。 封装就是将接口实现统一化&#xff0c;隐藏那些不同的地方&#xff0c;在上层函数调用体现的方式一样&#xff0c;如各种容器的迭代器iterator&#xff0c;尽管底层实现的方式不同&#xff0c;但是在使用…