JavaでGitlab APIを利用してみた

# はじめに

JavaでGitlabのAPIを利用してみたので、利用方法について簡単に記載します。  
今回利用したAPIは下記になります。

- IssuesApi
- RepositoryApi
- RepositoryFileApi

実行環境は下記になります。

```
Gitlab : 14.9.4
Java : 1.8
```

# 事前準備

今回はgradleを利用してJavaプロジェクトを作成しました。  
APIの実行は[gitlab4j-api](https://github.com/gitlab4j/gitlab4j-api)を利用しました。  

https://github.com/gitlab4j/gitlab4j-api

build.gradleは下記になります。
```gradle
apply plugin: "java"

repositories {
  mavenCentral()
}

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
compileJava.options.encoding = 'UTF-8'

dependencies {
  implementation "org.gitlab4j:gitlab4j-api:5.0.1"
}
```

APIの実行のためにアクセストークンを利用するので、作成方法は下記をご確認下さい。

https://www.gitlab.jp/blog/2021/12/06/access-token/

# 簡単な実装

ここからは簡単な実装を紹介します。

## GitLabApiインスタンスの取得

各種APIの実行はGitlabApiインスタンスを通して行います。インスタンスの取得にはアクセストークンが必要です。

```java
// GitLabApiインスタンスの取得
GitLabApi gitLabApi = new GitLabApi("http://sample.gitlab.com", "YOUR_PERSONAL_ACCESS_TOKEN");
```

以降の実装では`GitLabApi`から操作したいAPIを取得して操作します。

## IssuesApi

### Issueの一覧の取得

特定のプロジェクトに起票されているIssueの一覧を取得します。

```java
// プロジェクトに起票されたIssueをすべて取得する（プロジェクトID=1234）
List<Issue> issueList = gitLabApi.getIssuesApi().getIssues("1234");

// Issueのタイトルを出力
for (Issue issue : issueList) {
    System.out.println(issue.getTitle());
}
```

### Issueの作成

指定したプロジェクトにIssueを起票します。指定できるオプションはたくさんありますが、ここでは下記を指定しその他は指定しない（null）で実行してみます。

- プロジェクト
- タイトル
- 説明
- ラベル

説明にはMarkdown形式の表を盛り込んでみます。

```java
// Issueの起票（プロジェクトID=1234）
gitLabApi.getIssuesApi().createIssue(//
        "1234", // ProjectId
        "GitlabAPI sample issue", // Title
        getDescription(), // Description
        null,
        null,
        null,
        "sample_label", // Label
        null,
        null,
        null,
        null
);

String getDescription() {
    StringBuffer sb = new StringBuffer();
    sb.append("# Overview");
    sb.append(System.lineSeparator());
    sb.append(System.lineSeparator());
    sb.append("|COLUMN1|COLUMN2|COLUMN3|");
    sb.append(System.lineSeparator());
    sb.append("|---|---|---|");
    sb.append(System.lineSeparator());
    sb.append("|hoge|fuga|piyo|");
    sb.append(System.lineSeparator());
    sb.append("|foo|bar|baz|");
    return sb.toString();
}
```

下記のようなIssueが起票されます。これならAPIからの起票でもいろいろ情報を盛り込めそうです。

![issue_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960294/5917a05d-6863-d79e-2783-d6310b2f4f05.png)

## RepositoryApi

RepositoryApiでは主にBranchを操作することができます。

```java
// Branchの一覧を取得（プロジェクトID=1234）
List<Branch> branchList = gitLabApi.getRepositoryApi().getBranches("1234");

for (Branch branch : branchList) {
    System.out.println(branch.getName());
}

// Branchを保護する（プロジェクトID=1234）
gitLabApi.getRepositoryApi().protectBranch("1234", "YOUR_BRANCH_NAME");

// Branchの保護の解除（プロジェクトID=1234）
gitLabApi.getRepositoryApi().unprotectBranch("1234", "YOUR_BRANCH_NAME");
```

## RepositoryFileApi

RepositoryFileApiはリポジトリで管理しているファイルを操作するAPIのようです。　　
ここでは、`main`ブランチの`qiita/test/`以下の`hoge.txt`を取得してみます。

```java
// hoge.txtを取得（プロジェクトID=1234）
File file = gitLabApi.getRepositoryApi().getRawFile("1234", "main", "qiita/test/hoge.txt", null);

System.out.println(file.getName()); // hoge.txt
```

# 最後に

今回はIssuesApi、RepositoryApi、RepositoryFileApiを扱いましたが他にも便利なAPIがありそうでした。  
shellコマンドでいろいろ操作できればラクでよいのでしょうが、私は苦手なのでjavaのAPIがあってとても助かりました。