企业级开发中协同开发与持续集成持续部署
文章目录
- 1 创建代码仓库
- 2 使用git协同开发
- 2.1 独立团队开发
- 2.2 多团队开发git工作流
- 2 持续集成和持续部署
- 2.1 创建docker镜像
- 2.2 使用coding构建
1 创建代码仓库
每个项目有唯一的代码仓库,所以不是每个开发者都需要创建一个代码仓库,一般都是项目负责人创建:
代码仓库有以下几种:
github
gitee
gitlib
代码仓库的使用方法都差不多。
以gitee为例创建一个仓库:
如果没有账户的话,要注册一个新的用户名,注册用户之后,使用注册的用户登录到gitee上。
创建一个新的仓库,仓库名称是必填项, 一般会命名为项目名称,仓库介绍是选填的,可以根据项目信息填写。
创建成功后,可以邀请开发者加入到当前项目中。
邀请用户过程中可以指定其权限,仓库的所有者是创建者,开发者具有拉取代码和推送代码的权限。
2 使用git协同开发
2.1 独立团队开发
git是一个分布式版本控制管理工具,git和github不是一回事,也不是一个东西,git是开源的,支持安装在windows,linux,mac上面。
下载后,直接傻瓜式安装即可。
安装成功后在终端输入命令:
10321@coderzhao MINGW64 ~/Desktop
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/10321/.ssh/id_rsa):
Created directory '/c/Users/10321/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/10321/.ssh/id_rsa
Your public key has been saved in /c/Users/10321/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:6nLMyXWB8QFUdIlwi7/PImvEngpl0zyHW8SSm6oktiY 10321@coderzhao
The key's randomart image is:
+---[RSA 3072]----+
| .+=+... |
| .=oo. |
| +++. |
| o.Bo |
| +.S +. |
| o ++=.. |
| o o+o=.o. |
|E..+.+* = .o |
| o. .ooo.o .o |
+----[SHA256]-----+
创建一队公私密钥对,将公钥信息复制,填写到网页中:
将公钥放在仓库的公钥管理中,用于仓库能够识别到用户。
团队协作开发的逻辑:
假设有三个人的团队,组长小张,组员小李,组员小红
-
组长小张在master分支创建一个开发分支
git branch -b develop
-
为组员小李创建一个功能分支
git branch -b feature_li
-
为组员小红创建一个功能分支
git branch -b feature_hong
-
小红开发过程
(1)保持好习惯,在开发之前拉一下master代码
git pull origin master
(2)在自己的工作区开发代码
(3)开发完成之后,添加到暂存区
git add .
(4)将代码推送到本地仓库
git commit -am"代码功能说明"
(5)将代码推送到远程仓库自己的分支内
git push origin feature_hong -
小李开发过程
(1)保持好习惯,在开发之前拉一下master代码
git pull origin master
(2)在自己的工作区开发代码
(3)开发完成之后,添加到暂存区
git add .
(4)将代码推送到本地仓库
git commit -am"代码功能说明"
(5)将代码推送到远程仓库自己的分支内
git push origin feature_hong -
组长小张的工作流程
(1)组长小张工作在develop分支
git checkout develop
(2)将组员小红的代码合并到develop分支
git merge feature_hong
(3)将组员小李的代码合并到develop分支
git merge feature_li
(4)组长在develop分支检查代码
(5)组长将代码推送到远程的develop分支
(6)组长切换到master分支
(7)将develop分支的代码合并到master
(8)将本地master代码推送到远程master
注意点:
如果merge的过程中,相同的位置有不同的代码,需要组长协调组员商议后解决,解决之后再次进行提交。
2.2 多团队开发git工作流
集中式工作流
流程说明
全流程只有一个master分支,类似svn的工作流模式,开发整个过程在本地进行,开发结束直接在本地提交测试,测试通过再push到master。
特点:全程只需维护一个master,没有额外的分支管理开销。
缺点:单线程工作流,无法同时进行多个任务开发,而且一个任务只能一个人负责。
适用对象:不需要协作和合流的小项目,例如一些官网,活动等项目
功能分支工作流(Github flow)
流程说明
新功能在master创建功能分支feature,开发结束通过在客户端UI发起 pull requests请求指定review 人 admin,由admin review通过后合到master。
特点:流程简单,实现功能代码相互隔离,提交的代码通过pull requests可以让团队成员之间互相评论。
缺点:线上版本和master不同步时需要另外新建一个product分支跟踪线上版本(苹果商店的APP提交审核以后,等一段时间才能上架)。
适用对象:持续发布的项目,例如一些开源项目
Gitflow工作流
gitflow是比较常用的工作流,可能细节每个团队规范不一样,但是主体结构和思想是一致的,都是由:feature、develop、release、master、hotfix分支组成。我们曾以gitflow工作流作为我们的
工作流,在过程中发现分支流程过程中过于复杂,对新手不友好,而且每个功能开发feature分支都在develop分支汇合,会导致同段时间进行开发的功能,必须同时上线。
比如同时提测的两个功能需求,其中一个已经测试完毕的A功能,另一个没有测试通过被打回的B功能,这时是无法撤回develop上的B,导致A一直等待B。
流程说明
流程从develop建立功能分支feature,完成开发后push回develop进行测试,在develop建立测试服缺陷修复分支fixbug,完成测试环境验收后,在develop新建release分支作为验收环境的分支,验收完成并封版后合并到master和develop。
特点:清晰可控,多线程工作流,可以多人协作完成一个大任务,并且可以并行多个功能任务,任务可以从本地环境到正式环境一层一层向上推动,各个环境相互不影响。
缺点:相对复杂(经常需要切换分支),若有多个任务同时进行的,必须同一个版本迭代,存在版本污染风险。
适用对象:版本迭代不太频繁、多人协作开发的中小项目
定制Git工作流
Gitflow加强版工作流
‘心形’工作流是我们团队目前稳定使用的工作流,它新分支建立必须基于‘干净的分支’master,它跟gitflow不一样的是,feature推动整个研发周期进行,develop分支只作为测试环境的测试分支。
流程说明
功能开发完成后feature合并到develop,测试通过后基于
master创建发布分支release,release合并开发feature分支后,部署上线, 验收通过并封版后合到master,看需要来打tag。(这里没有画缺陷修复流程,是因为其流程跟功能开发几乎一样,区别是:hotfix最终是合回上一个迭代版本的release分支,而新功能feature是新建一个release分支)
特点:兼备了Gitflow所有优点同时也弥补了缺点
缺点:合并动作会重复,冲突需要解决2次(因为功能代码不是从develop推上master,如果在合develop存在的冲突,到了合master也会存在冲突)。
适用对象:版本迭代频繁、多人协作开发的中大型项目
注意:
开发/缺陷分支只能合并稳定分支例如可以合并master分支,不可merge develop分支,作用是防止环境污染develop分支只能用于测试环境发布,不可直接合并到release分支,正确流程是在release分支合并开发/缺陷分支,具体看下面的表格。
分支管理规范
分支类型
分支说明
开发分支: feat/xxx(功能)_20200804(创建日期)
开发分支基于master创建,开发完成合并到测试develop分支
测试分支:develop
develop分支只用来发布测试环境
发布分支:release/vx.x.x(版本号)_20200804(创建日期)
基于master创建,验收完成,进行封版后合并回master
缺陷分支:hotfix/xxx(功能)_20200804(创建日期)
合并流程和开发分支一致,区别在于,hotfix 在测试环境测试通过后直接合到最新的 release 分支验收
其他
个人认为上线之后的缺陷才算 bug ,未上线的缺陷是功能不完善,对于未上线的缺陷直接在 feature 分支修复即可,
当任务/功能上线之后出现的缺陷才需要建立 hotfix 分支作为修复 bug ,另外建议保留最新的 release 分支。原因是
该版本的线上 bug 修复后在测试环境验收通过后需要合并到该版本的 release 分支进行发布预发布环境。
当然也可以合到下一个版本的 release 分支。看项目迭代周期,如果迭代周期长,又有一些紧急的 bug 的话合到下一个
版本的 release 就不合适,另外当任务上线后验收成功后在 master 打 tag 记录当前的版本。
2 持续集成和持续部署
2.1 创建docker镜像
使用基础镜像Cenos7
FROM centos:7
# 注意点:空白的centos:7镜像如果出现无法启动容器的情况使用如下命令:
docker run -d -it --name xxx centos:7 /bin/bash
-
更改默认的镜像源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo RUN yum makecache fast
curl命令是一个模拟浏览器请求的命令,当你去curl一个网址的时候,会返回给你网站的html代码,因此可以代替浏览器去发送请求,适用于那些纯命令行界面的linux
语法格式:curl -o [filename] url 举例:curl -o /tmp/sina.txt www.sina.com 说明:访问www.sina.com这个网站,并且返回的结果保存在/tmp/sina.txt这个文件中,类似于输出重定向 curl www.sina.com > /tmp/sina.com
-
安装gcc环境
yum -y install gcc 一般是可以直接安装成功的,如果遇到报错Missing Dependency :kernel-header 需要安装kernel-header: 首先安装一下wget yum -y instasll wget # 使用wget获取到安装包 wget http://vault.centos.org/5.7/os/x86_64/CentOS/kernel-headers-2.6.18-274.el5.x86_64.rpm rpm -ivh kernel-headers-2.6.18-274.el5.x86_64.rpm
包管理:
rpm -ivh 包全名 选项: -i (install) 安装 -v (verbose) 显示详细信息 -h (hash) 显示进度 --nodeps 不检测依赖性[不建议使用]
-
安装python环境(依赖于GCC)
使用源码安装Python,可以安装任意版本的Python
多版本的Python是可以共存的。
(1)安装依赖yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
(2)下载压缩包
wget https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz
(3)解压
tar -zxvf Python-3.8.16.tgz
(4)编译安装
./configure --prefix=/home/programs/python/Python-3.8.16 --with-openssl=/usr/local/openssl #指定编译文件的存放目录(安装目录) #--prefix=/home/programs/python/Python-3.8.16 #待openssl包编译,否则pip install组件的时候,会无法下载https的组件 #--with-openssl=/usr/local/opensslmake && make install
(5) Python3环境变量
# 设置软连接 rm -rf /usr/bin/pip3 /usr/bin/python3 ln -s /home/programs/python/Python-3.8.16/bin/pip3.8 /usr/bin/pip3 ln -s /home/programs/python/Python-3.8.16/bin/python3.8 /usr/bin/python3 # 查看软连接是否设置好了 ll /usr/bin/python* ll /usr/bin/pip*
(6)测试安装结果
python3 -V pip3 -V
(7)设置pip安装包的镜像源
# 创建pip的配置文件 mkdir -p ~/.pip vim ~/.pip/pip.conf# 配置pip.conf [global] index-url = http://mirrors.aliyun.com/pypi/simple/[install] trusted-host = mirrors.aliyun.com
(8)centos pip包安装常见问题
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.### 下载 openssl 编译安装 #### # 下载并解压 wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.tar.gz tar -zxvf OpenSSL_1_1_1d.tar.gz# 指定安装路径并编译 ./config --prefix=/usr/local/openssl make && make install# 替换当前系统的旧版本 openssl 「先保存原来的」 mv /usr/bin/openssl /usr/bin/openssl.old mv /usr/lib64/openssl /usr/lib64/openssl.old mv /usr/lib64/libssl.so /usr/lib64/libssl.so.oldln -s /usr/local/openssl/bin/openssl /usr/bin/openssl ln -s /usr/local/openssl/include/openssl /usr/include/openssl ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so echo "/usr/local/openssl/lib" >> /etc/ld.so.conf # 建立动态链接 ldconfig -v
DockerFile文件的写法
#
FROM python:3.8#
WORKDIR /code#
COPY ./requirements /code/requirements.txt#
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt#
COPY . /code#
CMD ["python", "src/main.py"]
docker容器打包成镜像
1. 确认容器运行正常,保证需要打包的应用程序运行正常,并且没有任何问题。2. 对容器进行快照,使用 docker commit 命令将运行的容器转化为一个镜像,例如:docker commit <container-id> <image-name>其中,container-id 是容器的 ID,image-name 是新镜像的名称。3. 建议对新镜像进行打标签,使用 docker tag 命令,例如:docker tag <image-name> <new-image-name>:<version>其中,new-image-name 是新的镜像名称,version 是镜像的版本号。4. 验证新镜像的可用性,使用 docker run 命令启动新镜像,并确认镜像能够正常运行,例如:docker run -it <new-image-name>:<version>5. 最后,将新镜像推送到 Docker 注册中心,以便其他人能够获得该镜像,例如:docker push <new-image-name>:<version>
2.2 使用coding构建
coding是腾讯研发的协同管理工具,里面集成了持续集成和持续部署的功能。
基础信息配置
流程配置
通过流程配置jenkins静态文件,也可以直接写。
配置环境变量,注意生产服务器必须要有docker环境,coding服务器需要能够登录到生产服务器的docker环境
点击构建后,代码就可以自动部署到远程服务器。
相关文章:

企业级开发中协同开发与持续集成持续部署
文章目录 1 创建代码仓库2 使用git协同开发2.1 独立团队开发2.2 多团队开发git工作流 2 持续集成和持续部署2.1 创建docker镜像2.2 使用coding构建 1 创建代码仓库 每个项目有唯一的代码仓库,所以不是每个开发者都需要创建一个代码仓库,一般都是项目负责…...

九五从零开始的运维之路(其二十八)
文章目录 前言一、概述二、用户权限类型三、用户赋权四、权限删除五、用户删除六、刷新权限:七、修改用户密码总结 前言 本篇将简述的内容:Linux系统下的MySQL服务用户权限管理 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面ÿ…...

iOS--Runloop
Runloop概述 一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。 而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状…...

Doccano工具安装教程/文本标注工具/文本标注自己的项目/NLP分词器工具/自然语言处理必备工具/如何使用文本标注工具
这篇文章是专门的安装教程,后续的项目创建,如何使用,以及代码部分可以参考这篇文章: NER实战:(NLP实战/命名实体识别/文本标注/Doccano工具使用/关键信息抽取/Token分类/源码解读/代码逐行解读)_会害羞的杨卓越的博客-…...

windows系统之WSL 安装 Ubuntu
WSL windows10 以上才有这个wsl功能 WSL: windows Subsystem for Linux 是应用于Windows系统之上的Linux子系统 作用很简单,可以在Windows系统中获取Linux系统环境,并完全直连计算机硬件,无需要通过虚拟机虚拟硬件 Windows10的W…...

洛谷题解 | P1046 陶陶摘苹果
目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 AC代码 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 1010 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 3030 厘米高的板凳,当她不能直接用手摘到苹果…...

记一次Apache HTTP Client问题排查
现象 通过日志查看,存在两种异常情况。第一种:开始的时候HTTP请求会报超时异常。 762663363 [2023-07-21 06:04:25] [executor-64] ERROR - com.xxl.CucmTool - CucmTool|sendRisPortSoap error,url:https://xxxxxx/realtimeservice/services/RisPort o…...

Linux获取文件属性
以-rw-rw-r-- 1 ubuntu ubuntu 56 八月 1 19:37 1.txt 为例 一、stat函数 功能:获取文件的属性 函数原型: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>int stat(const char *pathname, struct stat *stat…...

String字符串拼接
String字符串拼接 1.简介2.StringBuilder2.1StringBuilder介绍2.2使用说明 3.StringBuffer4.StringJoiner5.String.Join() 1.简介 对于String来说是不可变的,使用修改字符串是在不断地创建新的字符串对象,而不是在原有的对象上修改的。并且对于字符串的…...

在矩池云使用Llama2-7B的具体方法
今天给大家分享如何在矩池云服务器使用 Llama2-7b模型。 硬件要求 矩池云已经配置好了 Llama 2 Web UI 环境,显存需要大于 8G,可以选择 A4000、P100、3090 以及更高配置的等显卡。 租用机器 在矩池云主机市场:https://matpool.com/host-m…...

API教程:轻松上手HTTP代理服务!
作为HTTP代理产品供应商,我们为您带来一份详细的教程,帮助您轻松上手使用API,并充分利用HTTP代理服务。无论您是开发人员、网络管理员还是普通用户,本教程将为您提供操作指南和代码模板,确保您能够顺利使用API并享受HT…...

脑网络通信:概念、模型与应用——Brain network communication: concepts, models and applications
脑网络通信:概念、模型与应用 介绍神经系统是通信网络从图论到大脑网络通信大脑网络通信模型和测量的分类法路由协议最短路径路由导航扩散过程广播(可通信性)参数模型线性阈值模型偏向性随机游走最短路径集合当前和新兴的应用将大脑结构与功能关联起来认知和临床表型的个体间…...

Docker创建tomcat容器实例后无法访问(HTTP状态 404 - 未找到)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

oracle数据库dbLink的使用
Oracle的数据库链路(dbLink)是一种允许在两个不同的数据库实例之间进行通信和数据交换的功能。它可以让你在一个数据库中访问另一个数据库的对象和数据,就像它们属于同一个数据库一样。 创建一个link: CREATE public DATABASE LINK link_sco…...

Coremail中睿天下|2023年第二季度企业邮箱安全态势观察
7月24日,Coremail邮件安全联合中睿天下发布《2023第二季度企业邮箱安全性研究报告》,对2023第二季度和2023上半年的企业邮箱的安全风险进行了分析。 一、垃圾邮件同比下降16.38% 根据Coremail邮件安全人工智能实验室(以下简称AI实验室&#…...

ZooKeeper分布式锁、配置管理、服务发现在Java开发中的应用
ZooKeeper提供了多种功能,包括分布式锁、配置管理、服务发现、领导选举等。 下面是一些常见的ZooKeeper功能及其在Java中的应用示例代码。 分布式锁 import org.apache.zookeeper.*; import java.io.IOException; import java.util.concurrent.CountDownLatch;pu…...

openGauss学习笔记-27 openGauss 高级数据管理- JOIN
文章目录 openGauss学习笔记-27 openGauss 高级数据管理- JOIN27.1 交叉连接27.2 内连接27.3 左外连接27.4 右外连接27.5 全外连接 openGauss学习笔记-27 openGauss 高级数据管理- JOIN JOIN子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 在…...

域名解析优先级
浏览器访问过程解析 访问网址——>首先在本地电脑看看hosts里面是否有域名对应IP地址,如何有直接访问对应IP, 如果没有,则联网询问DNS服务器(一般网卡那边都配置了DNS服务器IP) linux hosts 路径: w…...

【Opencv】视频跟踪算法KCF
目录 KCF算法简介opencv实现代码copencv实现代码python KCF算法简介 KCF(Kernelized Correlation Filter)是一种基于核相关滤波器的目标跟踪算法。它通过学习目标的外观特征和使用核相关滤波器进行目标定位。KCF属于传统算法的单目标跟踪器。下面是对KC…...

后端整理(集合框架、IO流、多线程)
1. 集合框架 Java集合类主要有两个根接口Collection和Map派生出来 Collection派生两个子接口 List List代表了有序可重复集合,可以直接根据元素的索引进行访问Set Set代表无序不可重复集合,只能根据元素本身进行访问 Map接口派生 Map代表的是存储key…...

C++ 类和对象篇(二) this指针
目录 一、this指针概念 二、this指针的特性 三、this指针存在哪里? 四、this指针可以为空吗? 一、this指针概念 1.是什么? 它是类内非静态成员函数的隐含形参,this指针指向调用该函数的对象。 this指针是C编译器给每个“非静态…...

Excel快捷键F1-F9详解:掌握实用快捷操作,提升工作效率
Excel是广泛应用于办公场景的优质电子表格软件,然而,许多人只是使用鼠标点击菜单和工具栏来完成操作,而忽略了快捷键的威力。在本文中,我们将详解Excel中的F1-F9快捷键,帮助您掌握实用的快捷操作,提升工作效…...

Webpack 安装教程
Webpack 是一个前端资源加载/打包工具。 安装 Webpack 使用 cnpm 安装 webpack: cnpm install webpack -g 创建项目 接下来我们创建一个目录 app: mkdir app 在 app 目录下添加 runoob1.js 文件,代码如下: app/runoob1.js 文件…...

移远通信首批加入“5G+eSIM计算终端产业合作计划”,助力大屏移动终端全时在线
7月29日,在全球数字娱乐产业盛会 ChinaJoy上,中国联通携手高通公司、GSMA发布了“5GeSIM 计算终端产业合作计划”。 作为全球领先的物联网整体解决方案供应商,移远通信首批加入该计划,副总经理刘明辉受邀参加5GeSIM 计算终端产业合…...
全网最强大的工具箱—utools介绍及分享
今天来介绍一个相见恨晚的PC端工具——utools,什么是utools?用其自身的话来说:“uTools是一个极简、插件化、跨平台的现代化桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。”,体验了下,好用且强大&…...

Linux常用基础命令❀
文章目录❀ ❀ls命令 ❀cd命令 ❀pwd命令 ❀date命令 ❀创建、删除文件和目录命令 ❀alias命令 ❀复制、移动、重命名、查看(文件、目录)命令 ❀find查找、wc统计命令 ❀vi/vim命令 1、打开文件 2、工作模式 vi与vim的四个模式 进入编辑模式…...

SQL-进阶
mysql --local-infile -u root -pset global local_infile 1;load data local infile 目录 into able 表名 fields terminated by , lines terminated by \n;...

[Pytorch]卷积运算conv2d
文章目录 [Pytorch]卷积运算conv2d一.F.Conv2d二.nn.Conv2d三.nn.Conv2d的运算过程 [Pytorch]卷积运算conv2d 一.F.Conv2d torch.nn.functional.Conv2d()的详细参数: conv2d(input: Tensor, weight: Tensor, bias: Optional[Tensor]None, stride: Union[_int, _s…...

主流开源监控系统一览
减少故障有两个层面的意思,一个是做好常态预防,不让故障发生;另一个是如果故障发生,要能尽快止损,减少故障时长。而监控的典型作用,就是帮助我们发现及定位故障,这两个环节对于减少故障时长至关…...

爬虫原理详解及requests抓包工具用法介绍
文章目录 一、什么是爬虫?二、爬虫的分类三、网址的构成四、爬虫的基本步骤五、动态页面和静态页面六、伪装请求头七、requests库介绍1. 概念:2. 安装方式(使用镜像源):3. 基本使用:4. response对象对应的方…...