GitHub ActionsからGitLabのMavenパッケージレジストリにDeployする方法

# この記事の概要
筆者は、HottyDBという検索エンジンとレコメンドエンジンの機能を搭載したRDBMSを個人開発しています！
そのHottyDBのα版を公開するにあたり、GitLabのパッケージレジストリを使いました。
この記事では、GitHub ActionsからGitLabのパッケージレジストリにMavenパッケージをDeployする手順を解説します。

ちなみに、過去の記事でHottyDBに関する解説もしていますので、よければそちらも参照してみてください！！

https://qiita.com/toru1055/items/0fe400989373823e9c78

# 背景
Mavenパッケージを公開したい場合、一般にはMaven Central Repositoryを使うと思います。
ただMaven Central RepositoryはJIRAチケットによる申請が必要なので、HottyDBがまだα版であることを考えると少々面倒です。

GitLabのパッケージレジストリであれば簡単にMavenパッケージの公開や削除することができるので、今回使うことにしました！

# パッケージの公開方法
## 前提
* ビルドツールにはGradle（Groovy DSL）を使います。
* GitHub上にJavaプロジェクトがある前提で解説します

## 流れ
1. GitLabで公開Project作成し、Deploy Tokenを取得する
2. GitHubの設定で環境変数をセットしておく
3. build.gradleの設定を追加
4. GitHub Actionsの設定ファイル作成
5. GitHubにPushし、Releaseタグ作成

## 1. GitLabで公開Project作成し、Deploy Tokenを取得する
### 1-1. GitLabに公開Groupを作成します
https://gitlab.com/groups/new

`Visibility level` を必ずPublicにしましょう。

### 1-2. 作成したGroupに公開Projectを作成
`Create blank project`を選択し、空の公開プロジェクトを作成しましょう

### 1-3. パッケージデプロイに使うDeploy Tokenを取得しましょう
1. `Settings` → `Repository` → `Deploy Tokens` をExpandしましょう
2. `Name` に `maven-publish` と入れましょう（なんでもいいですが）
3. `Scopes` の `read_package_registry` と `write_package_registry`にチェックを入れましょう
4. `Create deploy token` ボタンを押して、作成します
5. 一回しかTokenは表示されないので、ここでTokenをコピーしておきましょう

## 2. GitHubの環境変数にTokenをセットしておく
次はGitHub上での操作です。
GitHubのJavaプロジェクトのリポジトリに移動し、下記のように環境変数をセットしましょう。
（もしまだなければ作成しましょう）

1. `Settings` → `Security` → `Secrets` → `Actions` で `New Repository Secrets`のボタンを押しましょう
2. `Name` に `GITLAB_DEPLOY_TOKEN` と入れましょう
3. `Value` に 先ほどコピーしておいたTokenをペーストしましょう
4. `Add Secret`ボタンを押してセット完了です

## 3. build.gradleの設定を追加
続いて、エディタなどでJavaのGradleプロジェクトの方を編集していきます。

### 3-1. build.gradleにpluginを追加
```
plugins {
    id 'java'
    id 'maven-publish' // 追加
}
```

### 3-2. build.gradleに以下のようなブロックを追記してください
```
publishing {
    publications {
        library(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            url "https://gitlab.com/api/v4/projects/<プロジェクトID>/packages/maven"
            name "GitLab"
            credentials(HttpHeaderCredentials) {
                name = 'Deploy-Token'
                value = System.getenv("GITLAB_DEPLOY_TOKEN")
            }
            authentication {
                header(HttpHeaderAuthentication)
            }
        }
    }
}
```

`url`の値はGitLabプロジェクトに合わせて変更する必要があります。
`<プロジェクトID>` とある部分を手順1で作成したGitLabプロジェクトのIDに変更してください。
プロジェクトIDは、GitLabのプロジェクトページを見ると上の方に書いてあります。

![スクリーンショット 2022-07-15 21.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/a0a0e2b4-084c-b8cb-1906-b7e228bb7933.png)
※画像のProject IDとある部分です。


## 4. GitHub Actionsの設定ファイル作成
続いての手順も、エディタなどでJavaのプロジェクト内の編集をします。
ここでは、GitHub Actionsの設定ファイルを作成します。

1. リポジトリのルートディレクトリに `.github/workflows` という名前のディレクトリを作成しましょう
2. そこに、`maven.yaml` という名前のファイルを作成し、中身を下記のようにしましょう
```
name: Publish Maven package
on:
  release:
    types: [published]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          java-version: '8'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
      - name: Publish package
        uses: gradle/gradle-build-action@0d13054264b0bb894ded474f08ebb30921341cee
        with:
          arguments: publish
        env:
          GITLAB_DEPLOY_TOKEN: ${{ secrets.GITLAB_DEPLOY_TOKEN }}
```

## 5. GitHubにPushし、Releaseタグ作成
1. ここまでのJavaプロジェクトの変更をGitHubにPushしましょう
2. 次に、Releaseタグを作成してください。これでGitHub Actionsが起動するはずです
3. GitHubリポジトリの`Actions`タブでデプロイの進捗状況を確認してください
4. Actionが完了したら、GitLabプロジェクトの方を確認します。`Package Registry` にパッケージが登録されてることを確認してください。


パッケージの公開手順は以上です。
以上の手順で作成したサンプルリポジトリを下記に記します。

* [(GitHub) Javaのサンプルプロジェクト](https://github.com/toru1055/gitlab-sample)
* [(GitLab) Mavenパッケージレジストリのサンプル](https://gitlab.com/hotty2/pakcages/-/packages/8003529)



# パッケージの利用方法
登録したパッケージの利用方法は、作成したGItLabのパッケージレジストリを見るのがわかりやすいです。
上記サンプルの場合、下記のURLとなります。

* [(GitLab) Mavenパッケージレジストリのサンプル](https://gitlab.com/hotty2/pakcages/-/packages/8003529)

## Gradle Groovy DSLの例
Gradle Groovy DSLにおける上記サンプルパッケージの利用例を示します。

### build.gradle
```
plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
    // "Add Gradle Groovy DSL repository command" の部分をここに貼り付けます
    maven {
        url 'https://gitlab.com/api/v4/projects/37838898/packages/maven'
    }
}

dependencies {
    // "Gradle Groovy DSL install command" の部分をここに貼り付けます
    implementation 'org.example:gitlab-sample:1.0'
}
```

---

以上で手順は終了です！

ぜひお試しください！！