git和Jenkins的联动部署

前言

先说一下背景。刚接手了一下新项目,架子是SpringBoot+SpringCloud,但从业务的角度来看,微服务的划分做的并不好,过细的划分使得开发起来十分繁琐,熟悉项目结构就需要一段时间,用同事的话来说就是,强行微服务。吐槽完了来说一下遇到的问题。项目原本使用SVN和Jenkins来管理版本和发布版本,但国企说了,我们要用git!然后丢了一个搭好的gitLab给我们,就让我们自己去解决代码管理和发布的问题了。

git相关的问题

git的基本指令就不说了,说一下遇到的问题。先来看下本地的部分项目结构
在这里插入图片描述
fms-cd-www里面有两个文件夹,一个是静态页面,一个是JS文件。上传到git上后,却变了样。
在这里插入图片描述
咋回事呢?HTML怎么没了。在多次确认git操作没有问题的情况下,于是乎只能从文件上入手排查问题。
在这里插入图片描述
一层一层往里找,原来在git上丢失的目录,是空的。git已经强大到会自动过滤空文件夹了。这还没完,为了使git上的目录看起来和本地一样,在该目录下随便建了一个新文档。执行git指令,发现还是没有push到远程仓库上。最后在新建的文件里面,随便输了点东西,终于上传成功了。所以说,git不仅仅会过滤掉那些空文件夹,甚至连空文件都会自动过滤掉,不会上传到远程仓库,可能会导致git上的目录结构和本地不同的情况。

git和Jenkins的联动部署

由于项目之前都是用SVN结合Jenkins进行发布的,所以我的思路直接复制之前的JOB来进行修改。源码的管理本来是这样的
在这里插入图片描述
换成git的后是这样的,这边需要注意一下分支,不同环境对应的分支是不同的,默认是*/master。
在这里插入图片描述
git仓库的URL有两种
在这里插入图片描述
用HTTP的话,身份验证就选用户名密码即可
在这里插入图片描述
如果要用SSH的话,需要配置公钥和密钥,可以用git生成,git指令为
ssh-keygen -t rsa -C “[email protected]

在该目录下就可以拿到生成的公钥和密钥了在这里插入图片描述
然后将公钥放到gitLab上
在这里插入图片描述
密钥用在jenkins的身份认证上
在这里插入图片描述

建议先从前端开始,因为前端不涉及Maven打包,直接构建即可,还可以先测试下是否能连上git的远程仓库。

然后开始处理后端代码,最好是先从API开始,并且要先分析下项目的依赖关系,再决定从那个API开始打包,因为可能会存在API依赖API的这种不规范依赖,甚至可能会有循环依赖。

源码管理和前端一样,只是换了个仓库的URL。


先说一下把所有微服务放在同一个git分支的坏处。第一,代码的冗余。进入到LUNIX服务器上,Jenkins的工作空间可以看到,每个微服务都有整个后端的代码,因为jenkins去git上拉代码的时候,根据仓库的url和你所选的分支,会把整个分支上的代码都拉下来,这样的结果是十分耗费内存,特别是微服务多的时候。
在这里插入图片描述
目前除了每个微服务在git上都拉单独分支,我还没有找到更好的解决的方法,如果有的话,请麻烦告诉我一下。当然,这个做法也被国企给否定了,原话是:“那么多分支,你让我们怎么管理???”。所以就遇到了如何单独发布微服务打包的问题。

一开始我尝试着用Shell命令来找到对应的POM文件进行打包,但结果还是打了最外层的POM文件,整个项目都打包了。
在这里插入图片描述

在大神的指导下,换了种方法,
在这里插入图片描述
在Root POM这里,对POM文件进行指令操作,而不去写Shell指令了。
在这里插入图片描述
构建完成后看下控制台,确实只对指定的POM文件进行打包。

打包完所有API后,对Service进行处理。
在这里插入图片描述
区别在于Goals and options。构建完,看下控制台输出。
在这里插入图片描述
看到日志输出对应的微服务启动了,那就没问题。

总结

还有一些比较琐碎的问题,这里也说下。第一次打包的时候,报了这个错
在这里插入图片描述
没想明白为啥什么会找不到这个子模块,本地明明跑的好好的啊。依赖关系查了一遍,没问题。我就上gitLab看了下,发现gitLab上的代码,还真的没有这个模块,实在是令人无语。所以说往往越难解决的问题,越是不起眼的小问题。

还遇到过Jenkins构建时,报了XXX类找不到问题。本地明明跑的好好的,为啥编译会不通过呢。解决方法还是把git上的代码拉下来,然后再本地跑一跑,发现还真的跑不起来了。最后发现,原来是在.gitignore中配置错了导致XXX类没有上传到git上。所以遇到问题的时候,不能潜意识的认为,本地可以的代码,git上也是可以的,一定要重新从git上把代码拉一遍下来,在本地控制台执行下打包命令,大多数情况下就可以快速定位到问题了。

猜你喜欢

转载自blog.csdn.net/weixin_43776741/article/details/100136749