Java打開,Gitlab Java API 使用示例

 2023-10-12 阅读 20 评论 0

摘要:簡介 在開發中,偶爾會有一些關于Gitlab的二開需求,本文將介紹如果在Java中使用Gitlab提供的API 功能介紹 示例中代碼,主要的功能如下: 讀取整個倉庫中的所有文件,讀取后進行相關的處理使用Webhook,接收gitlab的Webhook請求,

簡介

在開發中,偶爾會有一些關于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配置信息

Java打開?主要是服務地址和相關的認證信息等,如下

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 處理刪除的文件}}}
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/135513.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息