文章目录
1. git代码管理
前面我们已经学习了通过git管理代码,在实际企业开发中需要使用git对项目进行版本控制,也就是GitFlow工作流程。
1.1. GitFlow工作流程
在gitflow流程中,master和develop分支属于长期分支,长期分支是相对稳定,所有开发完成或测试通过的提交最终都要合并到这两个分支上,他俩也有一些区别:
- master:发布上线时,基于master打tag,基于tag进行发布,不允许在该分支上开发,始终保持该分支的稳定。
- develop:开发阶段使用的分支,提交到该分支代码都是相对稳定的,不能直接基于此分支开发,如果开发新的功能,需要基于此分支创建新的分支进行开发功能,待功能开发、测试通过后合并到develop分支。
对于新功能的开发,基于Develop分支创建Feature分支,功能开发完后合并到Develop分支,禁止未开发完成的代码合并到Develop分支。
在开发中,新功能的代码已经全部合并到Develop分支,此时需要基于Develop分支创建Release分支,在Release分支中不再添加新的功能,只是做bug的修复,等测试完成bug全部修复之后,需要将Release分支合并到Master分支和Develop分支,并且基于Master打出版本的tag。
如果发布到生成环境的版本出现bug,比如:生产环境的v1.0版本出现bug需要尽快修复,此时就需要基于master创建hotfix分支,并且基于hotfix分支修复bug,待bug修复完成后需要将代码合并到master和develop分支。
1.2. 基于gogs服务开发
前面介绍了GitFlow工作流程,项目中我们将基于gogs服务进行开发,下面用一个简单的工程演示如何按照GitFlow工作流程进行开发。
1.2.1. 拉取代码
拉取sl-express-gitflow-web代码,在本地运行起来,目前项目版本为1.0。
拉取完成后,点击【Cancel】按钮:
导入Module:
启动后访问http://127.0.0.1:18099/doc.html
测试功能:
1.2.2. 创建develop分支
推送develop分支到gogs:
推送成功:
1.2.3. 基于feature分支开发新功能
开发新的功能需要基于develop分支创建feature分支,假设我们需要增加一个相乘的接口。
在com.sl.gitflow.controller.GitFlowController
中新增相乘的方法:
@ApiOperation("两个数相乘")
@GetMapping("/mul")
@ApiImplicitParams({@ApiImplicitParam(name = "value1", value = "第一个数", example = "1"), @ApiImplicitParam(name = "value2", value = "第两个数", example = "2")})
public R<Object> mul(@RequestParam(value = "value1") Long value1, @RequestParam(value = "value2") Long value2) {
return R.success(value1 * value2);
}
重启、测试:
测试完成后,将代码合并到develop
分支:
提交代码(此时,在feature分支进行提交):
切换到develop分支:
推送develop分支到gogs:
推送成功:
推送完成后,一般情况需要将feature分支删除掉,不推送到远程仓库。
1.2.4. 创建Release分支
在develop
分支开发基本上结束后,将基于develop
分支创建release
分支,在此分支进行测试,测试完成后合并到master
和develop
分支。
创建分支后,模拟测试和bug修复,对代码增加注释改动:
提交代码:
推送到远程仓库:
推送成功:
所有测试完成后,将release
分支合并回master
和develop
,并且推送到远程仓库。
1.2.5. 创建tag标签
推送到远程:
推送成功:
创建tag完成后,就可以基于tag发布了。
1.3. 项目代码列表
在虚拟机中的gogs服务中已经提供了项目中所涉及都的项目代码,目前项目拥有19个微服务,1个网关,1个parent工程,2个公共依赖工程。如下:
序号 | 项目名称 | 说明 |
---|---|---|
1 | sl-express-parent | 父工程 |
2 | sl-express-common | 通用工程 |
3 | sl-express-mq | 统一消息代码 |
4 | sl-express-gateway | 统一网关 |
5 | sl-express-ms-base | 基础微服务 |
6 | sl-express-ms-carriage | 运费微服务 |
7 | sl-express-ms-courier | 快递员微服务 |
8 | sl-express-ms-dispatch | 调度微服务 |
9 | sl-express-ms-driver | 司机微服务 |
10 | sl-express-ms-oms | 订单微服务 |
11 | sl-express-ms-service-scope | 服务范围微服务 |
12 | sl-express-ms-sms | 短信微服务 |
13 | sl-express-ms-track | 轨迹微服务 |
14 | sl-express-ms-trade | 支付微服务 |
15 | sl-express-ms-transport | 路线微服务 |
16 | sl-express-ms-transport-info | 物流信息微服务 |
17 | sl-express-ms-user | 用户微服务 |
18 | sl-express-ms-web-courier | 快递员web服务 |
19 | sl-express-ms-web-customer | 用户web服务 |
20 | sl-express-ms-web-driver | 司机web服务 |
21 | sl-express-ms-web-manager | 后台web服务 |
22 | sl-express-ms-work | 运单微服务 |
23 | sl-express-ms-search | 搜索微服务 |
** ❓思考:**是否需要把所有的工程代码都拉取到本地进行编译运行?
不需要的。你只需要将自己将要负责的开发任务相关的代码拉取到本地进行开发即可,其他的服务都可以调用测试环境正在运行的服务。
另外,你有可能是没有权限拉取到其他开发组的代码的。
2. Jenkins
2.1. 持续集成
持续集成是指,开发人员将代码合并到远程仓库后,需要【自动】的完成构建、部署等操作。
下面以Spring Boot web项目举例,说明使用Jenkins进行持续集成的过程。
过程说明:
- 本地开发环境推送代码到远程仓库
- 推送完成后,git服务会向Jenkins发送通知
- Jenkins接收到通知后,开始触发构建(也可以手动触发构建)
- 【git pull】从git仓库中拉取最新的代码
- 【maven package】通过maven进行打包,Spring Boot项目会打成可执行的jar包
- 【docker build & push】构建docker镜像,一般会将docker镜像上传到公司内部私服
- 【ssh remote】通过ssh命令登录到远程服务器(部署的目标服务器)
- 【docker pull】通过公司内部私服拉取docker镜像
- 【docker run】基于拉取到的镜像,运行容器
- 最后,完成构建
2.2. Jenkins使用
下面以部署【sl-express-gitflow-web】为例,通过Jenkins进行部署。
第一步,打开Jenkins,通过root/123登录。
第二步,创建构建任务:
第三步,设置任务内容:
设置一些构建参数:
设置版本号参数:(该参数会在后面部署时使用)
设置微服务注册到nacos中的ip地址:(该参数会在后面部署时使用)SPRING_CLOUD_NACOS_DISCOVERY_IP
设置端口参数:(该参数会在后面部署时使用)
设置服务名称参数:(该参数会在后面部署时使用)
设置git仓库信息:
设置分支:
设置构建步骤:
chmod a+rw /var/run/docker.sock
clean package -Dmaven.test.skip=true -U
设置部署脚本:
#!/bin/bash
# 微服务名称
SERVER_NAME=${serverName}
# 服务版本
SERVER_VERSION=${version}
# 服务端口
SERVER_PORT=${port}
# 源jar名称,mvn打包之后,target目录下的jar包名称
JAR_NAME=$SERVER_NAME-$SERVER_VERSION
# jenkins下的目录
JENKINS_HOME=/var/jenkins_home/workspace/$SERVER_NAME
#进入jenkins目录
cd $JENKINS_HOME
# 修改文件权限
chmod 755 target/$JAR_NAME.jar
#输出docker版本
docker -v
echo "---------停止容器($SERVER_NAME)---------"
docker stop $SERVER_NAME
echo "---------删除容器($SERVER_NAME)---------"
docker rm $SERVER_NAME
echo "---------删除镜像($SERVER_NAME:$SERVER_VERSION)---------"
docker rmi $SERVER_NAME:$SERVER_VERSION
echo "---------构建新镜像($SERVER_NAME:$SERVER_VERSION)---------"
docker build -t $SERVER_NAME:$SERVER_VERSION .
echo "---------运行服务---------"
docker run -d -p $SERVER_PORT:8080 --name $SERVER_NAME -e SERVER_PORT=8080 -e SPRING_CLOUD_NACOS_DISCOVERY_IP=${SPRING_CLOUD_NACOS_DISCOVERY_IP} -e SPRING_CLOUD_NACOS_DISCOVERY_PORT=${port} $SERVER_NAME:$SERVER_VERSION
开始构建:
构建日志:
测试:http://192.168.150.101:18099/doc.html
可以看到已经部署成功。
2.3. 自动构建
想要实现在代码推送到git仓库后自动开始构建,需要分别在gogs和Jenkins中进行设置。
2.3.1. gogs设置
点击【仓库设置】:
添加web钩子:
url格式:http(s)://<< jenkins-server >>/gogs-webhook/?job=<< jobname >>
添加成功:
2.3.2. Jenkins设置
2.3.3. 模拟推送
可以在gogs中模拟发起推送通知,来测试是否可以自动构建。
查看执行记录:
3. 阿里巴巴开发手册
下载地址:阿里巴巴开发手册