简介

在开发中,偶尔会有一些关于Gitlab的二开需求,本文将介绍如果在Java中使用Gitlab提供的API

功能介绍

示例中代码,主要的功能如下:

  • 读取整个仓库中的所有文件,读取后进行相关的处理
  • 使用Webhook,接收gitlab的Webhook请求,进行代码push事件的监听处理

下面具体的示例代码

代码示例

依赖导入

在maven中导入gitlab api的仓库

  <dependency><groupId>org.gitlab4j</groupId><artifactId>gitlab4j-api</artifactId><version>4.19.0</version></dependency>

配置相关参考

示例中使用的Spring boot,我们在配置文件中添加相关的gitlab配置信息

主要是服务地址和相关的认证信息等,如下

application:gitlab:# gitlab访问地址host: http://127.0.0.1:81/# gitlab 访问的tokenaccessToken: xxxxxxxxxxx# 对应用户名namespace: user# 工程名称projectName: testProject# 工程对应的分支,用于区分环境branch: test

下面是对应的配置类:

@Data
@Configuration
@ConfigurationProperties(prefix = "application.gitlab")
public class GitlabConfig {private String host;private String accessToken;private String namespace;private String projectName;private String branch;
}

webhook回调接口

这里简单介绍下Webhook,其主要作用是:

  • 当设置的仓库事件发生时(比如代码push,进行了一次提交)
  • gitlab就会调用这个回调的接口,发送这次push相关的信息给你的服务
  • 回调时里面有相关的提交信息,你可以根据相关的信息来处理

下面这个是回调的接口:

@RestController
@RequestMapping("/")
public class GitlabController {// gitlab仓库push操作时的回调接口@PostMapping("/event/push")public RespResult<String> pushEvent(@RequestBody GitlabPushEvent gitlabPushEvent) {gitlabService.pushEvent(gitlabPushEvent);return RespResult.<String>builder().code("200").data("success").build();}
}

这个是回调的参考,里面有很多,这个类只取了主要的信息,如下所示:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GitlabPushEvent {// 这个提交的分支信息private String ref;// 提交的详细信息private List<Commit> commits;@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic static class Commit {// 新增的文件列表private List<String> added;// 修改的文件列表private List<String> modified;// 删除的文件列表private List<String> removed;}
}

相关的处理逻辑

下面是简单使用示例

@Slf4j
@Service
public class GitlabService {private final GitlabConfig gitlabConfig;private final GitLabApi gitLabApi;public GitlabService(final GitlabConfig gitlabConfig, final GitbookConfig gitbookConfig) {this.gitlabConfig = gitlabConfig;// 传入gitlab服务地址和token,初始化服务gitLabApi = new GitLabApi(gitlabConfig.getHost(), gitlabConfig.getAccessToken());}private void readAllFile(final Project project) {// 读取指定项目的,指定分支的工程final Project project = gitLabApi.getProjectApi().getProject(gitlabConfig.getNamespace(), gitlabConfig.getProjectName());// 获取工程的所有文件final List<String> allFil = getAllFiles(project.getId(), gitlabConfig.getDirectory(), gitlabConfig.getBranch());// 遍历获取所有文件,进行相关的处理allFil.forEach(filePath -> {// 读取文件内容final InputStream inputStream = gitLabApi.getRepositoryFileApi().getRawFile(projectId, branch, filePath);final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));final StringBuilder stringBuilder = new StringBuilder();while (reader.ready()) {final String lineContent = reader.readLine();}stringBuilder.append(lineContent);// todo 进行相关的处理}});}// 读取工程仓库的所有文件列表@SneakyThrowsprivate List<String> getAllFiles(final Integer projectId, final String directory, final String branch) {List<String> fileNames = new ArrayList<>();gitLabApi.getRepositoryApi().getTree(projectId, directory, branch).forEach(file -> {// 如果当前是目录,则继续获取其下的文件列表if (file.getType().equals(TreeItem.Type.TREE)) {fileNames.addAll(getAllFiles(projectId, file.getPath(), branch));return;}// 如果是文件类型,直接添加final String filePath = String.join("/",directory, file.getName());fileNames.add(filePath);log.info("add file: {}", filePath);});return fileNames;}// Webhook回调函数处理,根据自己的需求进行处理@SneakyThrowspublic void pushEvent(GitlabPushEvent gitlabPushEvent) {log.info("收到Gitlab Webhook请求");if (!gitlabPushEvent.getRef().equals(String.format("refs/heads/%s", gitlabConfig.getBranch()))) {log.info("非设定分支的push事件,不进行更新");return;}for (GitlabPushEvent.Commit commit: gitlabPushEvent.getCommits()) {for (String filePath: commit.getAdded()) {// todo 处理新增的文件}for (String filePath: commit.getModified()) {// todo 处理修改的文件}for (String filePath: commit.getRemoved()) {// todo 处理删除的文件}}}
}

Gitlab Java API 使用示例相关推荐

  1. libsvm java 实例_LibSVM Java API调用示例程序

    [实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...

  2. RocksDB Java API 操作示例

    1. RocksDB特点 rocksDB 是一个可嵌入的,持久性的 key-value存储.基于Google的LevelDB,但提高了扩展性可以运行在多核处理器上,可以有效使用快速存储,支持IO绑定. ...

  3. jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API

    jdeveloper 介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能. 其中之一是对用于WebS ...

  4. .jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API

    .jdeveloper 介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能. 其中之一是对用于Web ...

  5. 在JDeveloper 12.1.3中将Java API用于WebSockets

    介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能. 其中之一是对用于WebSocket的JSR 3 ...

  6. 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

    文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...

  7. 顺丰api相关示例 - java版本(带打印)

    本来一个简简单单的调用api实现的东西根本没必要单独写一篇博客. ....但是!这个顺丰坑实在是太多了!!!让我都有点想骂人了都 实在忍不住吐槽几点: 丰桥的客服qq群,问了一天没人搭理我,真是应了那 ...

  8. mongodb java 更新数据_MongoDB JAVA API更新数据示例

    [java获得数据库信息常用API(DatabaseMetaData)示例] /** * MongoDBTest * MongoDB更新数据使用示例 */ package com.labci.mong ...

  9. Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能

    目录 Java api 实现聚合 依赖 简单聚合按照颜色分组获取每个卖出数量 聚合每个颜色卖出数量,及平均价格(每个分桶子聚合) 按照颜色分组 ,获取销售数量,avg min max sum 按照60 ...

最新文章

  1. atmega8 例程:T1定时器 快速PWM
  2. 双击jar运行main主函数实现-fatJAR
  3. java怎么防止表单重复提交_如何防止表单重复提交
  4. Android -- Fragment动画异常Unknown animation name: objectAnimator
  5. 讲讲OC曲线是什么?
  6. 如果 AI 和算法无罪,那么谁在杀死穷人?
  7. java中Decimaformat_Java中 DecimalFormat 用法详解
  8. 不同用户同时并发测压_教你 7 招,迅速提高服务器并发能力!
  9. SetDockingMode 设置dock停泊方式
  10. 处理IE6下PNG图片透明背景问题
  11. Opencv+opencv_contrib安装
  12. 大学计算机学术活动,计算机学院学术活动公告---南京理工大学Wai-Tat Fu教授学术报告...
  13. codeforces #630 F. Selection of Personnel
  14. Latex取消英语单词自动断行
  15. 图表示学习之时序的事件和节点动态
  16. 防火墙之ipsec vpn实验
  17. 谷歌浏览器如何配置SSL证书
  18. Educational Codeforces Round 132 (Rated for Div. 2) 题解(A~D)
  19. 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止.
  20. eds能谱图分析实例_基础理论丨一文了解XPS(概念、定性定量分析、分析方法等)...

热门文章

  1. 【转】URL和URI的区别
  2. centos下MySQL Workbench连接时崩溃的解决方法
  3. mysql处理varchar类型的between和and的时间问题少一天解决;
  4. vmware安装找不到虚拟网卡解决方案
  5. 德勤发布最新元宇宙报告:愿景、技术和应对
  6. 如何构建一个生产环境的推荐系统?(附代码)
  7. 非线性最小二乘通俗易懂解释
  8. oracle缓存怎么看,Oracle从缓存里面查找真实的执行计划
  9. php 换一换 功能,vue换一换功能原型
  10. android 设置drawable大小,在Android中调整Drawable大小