一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して17日目です。クリックしてイベントの詳細をご覧ください。
序章
開発中、Gitlabの2回目のオープニングにいくつかの要件がある場合があります。この記事では、Gitlabが提供するAPIをJavaで使用する方法を紹介します。
特徴
この例のコードの主な機能は次のとおりです。
- ウェアハウス全体のすべてのファイルを読み取り、読み取った後に関連する処理を実行します
- Webhookを使用してgitlabのWebhookリクエストを受信し、コードプッシュイベントを監視および処理します
次の特定のサンプルコード
コード例
依存関係のインポート
Mavenでgitlabapiのリポジトリをインポートします
<dependency>
<groupId>org.gitlab4j</groupId>
<artifactId>gitlab4j-api</artifactId>
<version>4.19.0</version>
</dependency>
复制代码
構成関連のリファレンス
例で使用されているSpringブートでは、関連する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の簡単な紹介があります。その主な機能は次のとおりです。
- set repositoryイベントが発生すると(コードプッシュなど、コミットが行われます)
- gitlabはコールバックインターフェースを呼び出し、プッシュ関連の情報をサービスに送信します
- コールバックには関連する送信情報があり、関連情報に従って処理できます
コールバックインターフェイスは次のとおりです。
@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 处理删除的文件
}
}
}
}
复制代码