IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Gitlab Java API 使用示例 -> 正文阅读

[Java知识库]Gitlab Java API 使用示例

简介

在开发中,偶尔会有一些关于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 访问的token
    accessToken: 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
    @NoArgsConstructor
    public 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 进行相关的处理
            }
        });
    }

   
   // 读取工程仓库的所有文件列表
    @SneakyThrows
    private 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回调函数处理,根据自己的需求进行处理
    @SneakyThrows
    public 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 处理删除的文件
	    }
        }
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:27:33  更:2022-04-18 17:31:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:07:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码