GitHook+JGit实现最新代码的自动克隆或者项目的自动部署

网友投稿 269 2022-09-06

GitHook+JGit实现最新代码的自动克隆或者项目的自动部署

​​需求​​​​思路​​​​开工​​

​​设置webhook​​​​响应webhook的服务器​​

​​ 需求就是保证后台系统的报表sql是分析师每次push后的最新sql。 通过这种方式也可以实现项目的自动部署,pull最新项目后重启tomcat或者其它服务器就好了。。。

思路

思路一:起初想的是在正式环境中init 一个远程git仓库。每次分析师把sql push到正式环境中。可以使用git的hook功能在push之后做一些操作。测试都成功了,此时发现一个令人伤心的事情就是正式环境中无权限操作。。只能部署项目。唉,只能想别的办法。思路二:在gitlab有一个webhook,相信你看到hook就知道了,钩子,也就是回调函数。通过webhook我们可以在push,merge等操作后可以发送一个 我们需要在服务器上初始化一个git本地仓库,克隆代码到本地仓库,然后对文件进行分析。 所以这里需要另外一个知识:JGit. 通过这个工具我们可以使用java语言操作git,如果想更深入的了解,请自行google哦。在这里我只使用到了clone,checkout和pull。并没有使用add ,commit ,push等操作。

@ResponseBody public void setTitle() { File gitFile = new File("D://temp"); if (cloneRepository(gitFile)) { System.out.println("clone success"); checkFiles(gitFile); } else { System.out.println("clone failure"); } }

clone和checkout操作

首先判断本地仓库是否已经存在 ,若不存在则clone远程仓库。 若已经存在则拉取相应分支上的代码。

; if (new File(gitFile.getAbsolutePath() + "/.git").exists()) { git = Git.open(gitFile); //检测dev分支是否已经存在 若不存在则新建分支 List localBranch = git.branchList().call(); boolean isCreate = true; for (Ref branch : localBranch) { if (branch.getName().endsWith("dev")) { isCreate = false; break; } } git.checkout().setCreateBranch(isCreate).setName("dev").setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).call(); git.pull().call(); } else { List remoteBranch = new ArrayList<>(); remoteBranch.add("master"); git = Git.cloneRepository().setURI(StaticPro.gitURI).setBranchesToClone(remoteBranch).setDirectory(gitFile).call(); git.checkout().setCreateBranch(true).setName("master").setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).call(); git.pull().call();

遍历本地仓库

然后就是递归遍历本地仓库了

private void checkFiles(File file) { File files[] = file.listFiles(); if (files != null && files.length > 0) { for (File file1 : files) { String fileName = file1.getName(); if (file1.isDirectory() && fileName.endsWith(".git")) continue; System.out.println(fileName); System.out.println("内容是:\n" + readFile(file1)); System.out.println("------------------------------------"); checkFiles(file1); } } }

IO流读取内容

private String readFile(File file) { BufferedReader br = null; StringBuilder sb = new StringBuilder(); String line = null; try { br = new BufferedReader(new FileReader(file)); while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } return sb.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return ""; }

运行结果

图片太小的话可以新标签打开图片。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:eclipse连接sql server 图文教程
下一篇:AI营销时代,品牌如何直击人心?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~