Gitlab Flow到容器
一.简介
长话短说,本文全景呈现我司项目组gitlab flow && devops
Git Flow定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架。
DevOps 强调的是团队通过自动化的工具协作和高效地沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。开发关注代码,运维关注部署,效率和质量都能得到提升。
- 项目组10人小团队也在实践敏捷开发;
- 每个sprint周期一般包含2-3个功能;
- 采用前后端开发,生产均使用k8s部署;
- 每个sprint上线周期均经历 intergate Test--->alpha--->prod。
现代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名镜像,自动部署
- alpha(develop)上有release-1.0.0,release-1.0.1 这样版本递增的tag; 但是如果针对某一release-版本bugfix,镜像tag不会变,代码会更新,这里其实与docker tag的用法有点不符;
- 在kubernetes deploy我暂时使用两个不同命令来更新镜像.
kubectl set image ...;
kubectl roloout restart deploy ...
对develop release分支形成的镜像tag上可尝试带上CI_COMMIT_SHORT_SHA 来规避这种骚操作。
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
- deploy
variables:
deploy_path: "/home/eap/website"
build:
stage: build
script:
- pwd
- "for d in $(ls app/src);do echo $d;pro=$(pwd)/app/src/$d/$d.csproj; dotnet build $pro; done"
tags:
- my-tag
build_image:EAPWebsite:
stage: build_image
script:
- 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_NAME
tags:
- my-tag
only:
- tags
- develop
- master
- /^release-.*$/i
deploy:intergate-test:
stage: deploy
script:
- 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-tag
only:
- develop # 开发阶段,intergate Test环境只会部署ImageTag:develop镜像
deploy:alpha:
stage: deploy
script:
- 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-tag
only:
- /^release-.*$/i # alpha环境只部署以ImageTag:release-开头镜像
deploy:prod:
stage: deploy
script:
- 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 restart deployment/eap-website"
tags:
- my-tag
only:
- tags
- master
when: manual # prod环境,人工点击部署
- 使用ssh远程部署
- 基于docker-compose完成的Gitlab-ci
- 在kubernetes环境,我是使用kubectl set image ...命令改变镜像,同分支名更新重新拉取镜像部署。
Gitlab Flow到容器的更多相关文章
- 大揭秘| 我司项目组Gitlab Flow && DevOps流程
长话短说,本文全景呈现我司项目组gitlab flow && devops Git Flow定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架. Dev ...
- 高效团队的gitlab flow最佳实践
当前git是大部分开发团队的首选版本管理工具,一个好的流程规范可以让大家有效地合作,像流水线一样有条不紊地进行团队协作. 业界包含三种flow: Git flow Github flow Gitlab ...
- ubuntu快速部署gitlab汉化容器
前言:gitlab的原理我就不扯了(看这个https://www.jianshu.com/p/567207ac51cd),下面直接上操作 1.前提: a.要有docker的运行环境,用service ...
- Jmeter(二十八)_Docker+Jmeter+Gitlab+Jenkins+Ant(容器化的接口自动化持续集成平台)
这套接口自动化持续集成环境已经部署差不多了,现在说说我的设计思路 1:利用Docker容器化Gitlab,Jenkins,Jmeter,Ant,链接如下 Docker_容器化gitlab Docker ...
- 浅析GitLab Flow的十一个规则
使用 Git 版本控制,是对使用它之前的所有版本控制方式的一种改进.然而,很多组织最终以太过混乱或过于复杂的流程来结束.这个问题对于刚从其他版本控制系统转过来的组织来说特别突出. 在本文中我们会列出 ...
- 容器化系列 - GitLab启动和配置 on Docker
本文简单说明了如何在Docker容器中运行GitLab. 1 准备工作 1.1 下载镜像 $ docker pull docker.io/gitlab/gitlab-ce:latest 1.2 创建持 ...
- 把Gitlab迁移到Docker容器里
把Gitlab迁移到Docker容器里 Apr 9, 2015. | By: 任怀林 公司的gitlab一直是运行在ovm的虚拟机里的,版本还是6.7.5.版本有点老了,最近在研究docker,于是想 ...
- 为Docker容器中运行的gitlab添加ssh的一些问题记录
最近做的一个东西,是将gitlab10.x的汉化版本,从源码编译(在源码中自己定制一些东西),然后制作成Docker镜像,作为Docker容器来运行 在启用容器中的gitlab的ssh的时候,遇到了一 ...
- gitlab数据迁移到docker容器
需求:想把服务器上的gitlab迁移到docker容器里面注意:gitlab的迁移,必须保持gitlab的版本一致,此处使用的是:8.4.3,数据库版本和类型一致,此处使用的是postgresql 9 ...
随机推荐
- 数字逻辑实践3->EDA技术与Verilog设计
本文属于EDA技术概述类文章 1 EDA技术及其发展 概念 EDA(Electronic Design Automation),指的是以计算机为工作平台,以EDA软件工具为开发环境,以PLD期间或者A ...
- Linux学习 - 树莓派4b的U-Boot的初识
Linux学习 - 树莓派4b的U-Boot的初识 初识U-Boot 学习书籍:<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.1> 章节:第三十章 学习内容: 书中介绍u ...
- 数字逻辑实践5->Verilog语法 | wire 与 reg 的选择与特性
问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题: 对于源码模块的变量定义,何时定义为reg.何时定义为wire?它们各自又有什么特性和物理意义? 1. wi ...
- C/C++转义字符表
转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将 ...
- UOJ #76 -【UR #6】懒癌(思维题)
UOJ 题面传送门 神仙题. orz czx,czxyyds 首先没有懒癌的狗肯定不会被枪毙,证明显然. 接下来考虑怎样计算一种局面的答案,假设 \(dp_S\) 表示对于有且仅有 \(S\) 中的狗 ...
- 洛谷 P4646 - [IOI2007] flood 洪水(拆点+bfs)
题面传送门 一道挺有意思的题(?) orz djq yyds %%%%%%%%%%%%%%%%%% 首先一个很直观的想法是将每个房间看作一个节点,在有墙的房间旁边连边权为 \(1\) 的边然后 bfs ...
- Perl语言编程(大骆驼)
啰嗦几句 Perl的时代已经过去,现在年轻的同事们基本上都在用Python了.但个人认为单就生物信息文本处理而言,Perl语言是绝对够用的.最主要的是,前辈们搭建的流程大多数是Perl写的,因此,如果 ...
- python12对象初
- vim ——批量注释
1111. ctrl+v进入列编辑模式,在编辑模式中,在行间上下移动光标,选择需要编辑哪些行的对应的列,之后使用I(大写)进入列插入.插入注释符,按两次Esc退出列编辑模式即可实现多行注释 删除注释: ...
- KVM原理
虚拟化是云计算的基础.简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU.内存.IO 硬件资源,但逻辑上虚拟机之间是相互隔离的.物理机我们一般称为宿主机(Host), ...