大揭秘| 我司项目组Gitlab Flow DevOps流程

长话短说,本文全景呈现我司项目组gitlab flow && devops

  • Git Flow定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架。

  • DevOps 强调的是团队通过自动化的工具协作和高效地沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。开发关注代码,运维关注部署,效率和质量都能得到提升。

  • 项目组10人小团队也在实践敏捷开发;

  • 每个sprint周期一般包含2-3个功能;

  • 采用前后端开发,生产均使用k8s部署;

  • 每个sprint上线周期均经历 intergate Test--->alpha--->prod。

现代Devops技术基于容器技术自动化脚本实现了依赖环境的打包、版本管理、敏捷部署。

我司操作

为在迭代便利性、部署严谨性上取得平衡,项目组(其实是我~。。~啦)设计了如下Gitlab flow & DevOps流程。

一个完整的迭代上线周期:

第①阶段:开发阶段

  • 开发人员从develop切出feature分支,项目经理梳理本sprint需要上线的feature分支,自测完成后合并到develop;

  • 此时会打出ImageTag:develop的镜像,自动部署到集成测试环境,理论上还属于代码躁动的阶段;

  • 开发人员应该关注集成测试环境,QA人员可酌情参与。

第②阶段:测试阶段

  • 集成测试环境验证之后, 可从develop切出release-1.0.0预发布分支,此处会打出ImageTag:release-1.0.0的镜像,自动部署到alpha环境;

  • 此处QA会重点花时间在这个环境上测试, 发现问题,开发人员迅速响应;

  • 从release-1.0.0分支上切出bugfix分支,修复完后迅速合并回release-1.0.0 分支,同样会自动部署到alpha,QA快速验证;

  • .....

  • 这个阶段我们保持趋近一个稳定的release-1.0.0的分支。

第③阶段:部署阶段

  • 从稳定的release-1.0.0分支打出对应的git tags: v1.0.0, 此处会打出ImageTag:v1.0.0的镜像,需要手动部署到prod;

  • QA线上测试,出现修复不的问题,迅速使用之前的ImageTag回滚;

  • 上线之后若发现不能回退的bug,此时需要hotfix,还是从release-1.0.0切出hoxfix分支,修复完合并回release-1.0.0,alpha环境测试通过;打出git tags:v1.0.0-hotfix1 重新部署到prod;

  • .....

  • 确认上线成功,将release-1.0.0分支合并回develop、master分支

这里为什么保留master分支, 是因为理论上当feature分支合并回develop分支,develop已经被污染了,这里保留master只为兜底。

后续就是开始新的sprint周期了,git release分支名/tag标签名跟随迭代。

Gitlab Flow小结

整个过程贯彻了git flow 预发布分支release,hotfix的核心用法, 同时在部署方式上也有一定的改进。

  • alpha上使用git预发布分支名release-1.0.0作为镜像Tag,切出release分支即形成同tag名镜像,自动部署

  • prod上要求从release分支上打出git标签,同时要求手动点击部署,多步骤操作确保部署是受控可预期,并且可回滚

作业小抄

集成测试采用docker-compose部署;alpha,prod是采用k8s部署;从上面的Gitlab  flow 知道:

  • Git develop分支、release-分支、tag标签、master分支会打出容器镜像,

  • Git develop分支代码(ImageTag:develop)(只)会自动部署集成测试环境,

  • Git release- 分支(ImageTag:release-1.0.0)(只)会自动部署到alpha,

  • Git tag标签(ImageTag:v1.0.0) 手动点击部署到prod

stages:- build- build_image- deployvariables:deploy_path: "/home/eap/website"build:stage: buildscript: - pwd- "for d in $(ls app/src);do echo $d;pro=$(pwd)/app/src/$d/$d.csproj; dotnet build $pro; done"tags:- my-tagbuild_image:EAPWebsite:stage: build_imagescript:- dotnet publish app/src/EAP.Web/EAP.Web.csproj  -c release -o container/app/publish/- docker build -t $DOCKER_REGISTRY_HOST/eap/website:$CI_COMMIT_REF_NAME  container/app       - docker login $DOCKER_REGISTRY_HOST -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD- docker push $DOCKER_REGISTRY_HOST/eap/website:$CI_COMMIT_REF_NAMEtags: - my-tagonly:     - tags- develop- master- /^release-.*$/ideploy:intergate-test:stage: deployscript:- ssh -t testUser@10.202.42.252 "cd /home/eap/website && export TAG=$CI_COMMIT_REF_NAME && docker-compose pull website && docker-compose -f docker-compose.yml up -d"tags:- my-tagonly:- develop      # 开发阶段,intergate Test环境只会部署ImageTag:develop镜像deploy:alpha:stage: deployscript:- ssh -t testUser@10.201.82.170 "sudo kubectl set image  deployment/eap-website  eap-website=repository.****.com:8443/eap/website:${CI_COMMIT_REF_NAME} && sudo kubectl rollout status deployment/eap-website"tags:- my-tagonly:- /^release-.*$/i      # alpha环境只部署以ImageTag:release-开头镜像deploy:prod:stage: deployscript:- ssh -t testUser@10.202.42.20 "sudo kubectl set image deployment/eap-website  eap-website=repository.****.com:8443/eap/website:${CI_COMMIT_REF_NAME} && sudo kubectl rollout status deployment/eap-website" tags:- my-tagonly:- tags- masterwhen: manual              # prod环境,人工点击部署
  1. 使用ssh远程部署,请参阅

  2. 基于docker-compose完成的Gitlab-ci,请参阅

  3. 在kubernetes环境,我是使用kubectl set image ...命令改变镜像

如果本文对你有帮助,

不妨来个分享、点赞、在看三连

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

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

相关文章

leetcode714.买卖股票的

一:题目 二&#xff1a;上码 class Solution { public:int maxProfit(vector<int>& prices, int fee) {/**思路:*/int ans 0;int minPrice prices[0];//最低时买入for(int i 1; i < prices.size(); i) {//低价买入minPrice min(minPrice,prices[i]);if(price…

C++ 学习之旅(1)——编译器Compiler

简单来说&#xff0c;由C代码文件生成可执行文件的过程如下&#xff1a; #mermaid-svg-GQamCVEXMVkYEemz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GQamCVEXMVkYEemz .error-icon{fill:#552222;}#mermaid-svg-…

掌握Rabbitmq几个重要概念,从一条消息说起

RabbitMQ 是功能强大的开源消息代理。根据官网称&#xff1a;也是使用量最广泛的消息队列。就像他的口号“Messaging that just works”&#xff0c;开箱即用使用简单&#xff0c;支持多种消息传输协议&#xff08;AMQP、STOMP、MQTT&#xff09;。一个应用程序或者服务如何使用…

122. 买卖股票的时机

一&#xff1a;题目 二&#xff1a;上码 class Solution { public:int maxProfit(vector<int>& prices) {/**思路:1.这里用的是贪心算法&#xff08;我们每隔两天计算一次赚的钱 只要大于0的话 那就是赚的&#xff09;2.我们手里最多只能有一只股票,所以我们可以当…

C++ 学习之旅(2)——链接器Linker

每一个.cpp文件经过编译之后都会生成对应的.obj文件&#xff0c;然后通过链接器把它们进行链接&#xff0c;最后就可以生成.exe可执行文件了。 举个例子&#xff0c;假设我们有一个 Math.cpp 文件和 Log.cpp 文件&#xff1a; Math.cpp #include <iostream>void Log(c…

使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求

使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求目录一、引言二、项目渊源三、软件使用及 SIP INVITE 流程(一) 注册和心跳(二) 直播 INVITE四、注意事项五、资源独立观察员 2020 年 9 月 16 日一、引言之前写过一篇博客《使用 GB28181.Solution ZLMediaKit MediaSe…

leetcode968. 监控二叉树

一:论语 这个有意思,我们可以从中得出的是&#xff0c;一个人过错 其实是潜意思决定的 行为见品质 但知错更改也是nice的 二:题目 三:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* Tr…

C++ 学习之旅(3)——头文件Header

我们知道&#xff0c;在 C 中&#xff0c;函数只能定义一次&#xff0c;而在 cpp 文件中如果想使用其他 cpp 文件中定义了的函数&#xff0c;就必须声明&#xff0c;这样才能通过编译&#xff0c;然后链接器才会在调用函数时找到该函数的定义。那么当函数声明很多的时候&#x…

虚虚实实,亦假亦真的 ValueTuple,绝对能眩晕你

一&#xff1a;背景 1. 讲故事前几天在写一个api接口&#xff0c;需要对衣物表进行分页查询&#xff0c;查询的output需要返回两个信息&#xff0c;一个是 totalCount,一个是 clothesList,在以前我可能需要封装一个 PagedClothes 类&#xff0c;如下代码:public class PagedClo…

C++ 学习之旅(4)——调试Debug

调试 Debug 程序&#xff0c;首先应该确保处于 Debug 模式而不是 Release 模式下&#xff0c;因为后者会优化你的程序&#xff0c;也就是对你的程序作出了改变&#xff0c;这样你很难找出问题所在。记得在 Debug 之前确保优化是已禁用的&#xff1a; 我们有以下的文件&#xff…

关于脑机接口该如何实现的考虑

脑机接口&#xff0c;已经是最近最热门的科技热点了&#xff0c;因为埃隆马斯克的炒作和推动&#xff08;炒作说的是他本人并不懂技术&#xff0c;宣传中有了很多夸大和不实之词&#xff0c;推动说的是因为他的炒作和带动&#xff0c;有了更多的资金进入了这个领域&#xff0c;…

C++ 学习之旅(5)——设置Setup文件目录

使用过Visual Studio的朋友都应该知道&#xff0c;VS对于编译后的obj文件以及链接生成的exe文件的存放方式是非常反人类的&#xff0c;所以我们有必要对这个设置进行更改。 首先要分清Filter和Folder的概念&#xff0c;在默认的文件目录中&#xff0c;我们看到的实际上是Filte…

JVM笔记详解之垃圾回收器

一&#xff1a;什么是垃圾回收机制&#xff08;GC&#xff09; 在C/C程序中&#xff0c;程序员在内存中主动开辟一段相应的空间来存值。由于内存是有限的&#xff0c;所以当程序不再需要使用该内存空间时&#xff0c;就需要销毁对象并释放其所占用的内存资源&#xff0c;好重新…

跟我一起学.NetCore之配置初体验

前言配置对于程序来说&#xff0c;绝对是必不可少&#xff0c;毕竟配置是应用或组件动态适应各种环境的最优方案&#xff0c;没有之一(我还年轻&#xff0c;我是这么认为的)&#xff1b;之前可能用的最多的配置源是命令行、文件(XML、Json、INI)&#xff0c;Web中对于Asp.Net程…

JVM笔记(JVM内存+垃圾回收器)详解

一:java代码的执行流程(引出JVM) 首先由程序员编写成.java文件然后由javac(java编辑器)将.java文件编译成.class文件.class文件可以在不同平台/操作系统上的JVM上执行再由JVM编译成可供不同操作系统识别的机器码&#xff08;0,1二进制&#xff09; 二:JVM来源 我们在下载JD…

跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展

前言前两节针对.NetCore自带的依赖注入进行简要概述&#xff0c;对于日常开发的需求应该是能满足了&#xff0c;那为什么还需要引入第三方依赖注入组件呢&#xff0c;这里就从自带的依赖注入来分析&#xff0c;有什么样的需求满足不了&#xff1f;主要归纳为以下几点&#xff1…

C++ 学习之旅(7)——指针pointer

开门见山&#xff0c;如果把计算机的内存空间比作是一排房子&#xff0c;那指针就是房门号。指针实际上就是一个用来存储内存地址的整数&#xff0c;与类型没有关系&#xff0c;我可以定义一个void类型的指针&#xff1a; #include <iostream>int main() {int var 8;v…

leetcode509. 斐波那契数

一:论语 我现在应该还没到壮年 还在年少 应该。。。。。。。。。。。。。。。 二:题目 三:上码 class Solution { public:/**思路:动态规划5步曲1.确定dp数组以及下标的含义dp[i] 的定义为:第i个斐波那契数的数值是dp[i]2.确定递推公式状态转移方程 dp[i] dp[i-1] dp[i-2…

C++ 学习之旅(8)——一文搞懂指针、引用、函数参数的传值调用、指针调用和引用调用

废话少说&#xff0c;直接上代码&#xff1a; #include <iostream>int main() {int a 5;int* ptr &a;int& ref a;std::cin.get(); //设置断点 }为了避免混淆&#xff0c;我建议在定义指针时写int* ptr而不是int *ptr&#xff0c;同理&#xff0c;定义引用写…

.NET Core 下使用 Kafka

安装CentOS 安装 kafkaKafka : http://kafka.apache.org/downloadsZooLeeper : https://zookeeper.apache.org/releases.html下载并解压# 下载&#xff0c;并解压 $ wget https://archive.apache.org/dist/kafka/2.1.1/kafka_2.12-2.1.1.tgz $ tar -zxvf kafka_2.12-2.1.1.tgz…