【Java】作成したライブラリをGitLab Package Registry で管理する

はじめに

こんにちは!アルバイトスタッフの吉田です。 OPTiM Geo Scan のバックエンドを担当しています。
この度、プロダクト間での共通ライブラリを作成する方法についての調査と開発を行ったので、それについて書いていこうと思います。

目次

直面していた課題

プロダクト間で共通する部分がそれぞれ個別で開発されていました。 このままにしていると同じことを何度もするといった、無駄な作業が出てきてしまうので、共通部分をライブラリとして切り出してプロダクト間で流用できるようにすることとなりました。

GitLab Package Registryについて

いろいろ調べていると、GitLab Package Registry というものに辿り着きました。
GitLab Package Registry とは、GitLabを様々なパッケージマネージャーのレジストリとして利用できる機能で、Maven、npm、NuGet、PyPIなどがサポートされています。(サポートされているパッケージマネージャー)

ここでは Maven Repository を利用する手順について説明していきます。

環境

  • Gradle 7.5.1
  • Java 11

大まかな手順

※前提としてJavaライブラリは作成済みで、GitLabリポジトリがある状態とします。

  • トークンの発行
  • build.gradle に maven-publish の内容を書く
  • gitlab-ci.yml を書く
  • pushする

トークンの発行

認証方法は下記の3つがあります。

  • プライベートトークン
  • デプロイトークン
  • CIトークン

今回はデプロイトークンを利用した認証方法を使います。

発行画面

GitLabのリポジトリ画面左側にあるSettingsからRepositoryを選択します。

Deploy tokensという項目のExpandをクリック。

トークンの名前を入力し、read_package_registry と write_package_registry にチェックを入れてトークンを作成。
作成されたトークンはメモしておいてください。

build.gradle に maven-publish の内容を書く

build.gradle の plugins に maven-publish を追加

// build.gradle
plugins {
    ...
    id 'maven-publish'
}

group 名と version を書いておく

//build.gradle
group = 'jp.co.optim.~'
version = '0.0.1'
// この場合、使用の際は 'jp.co.optim.~:ライブラリ名:0.0.1' となる

publishing の設定を書く

// build.gradle
publishing {
    publications {
        library(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            url 'https://GitLabのFQDN/api/v4/projects/プロジェクトID/packages/maven'
            name 'GitLab'
            credentials(HttpHeaderCredentials) {
                name = 'Deploy-Token'
                value = '発行したデプロイトークン'
            }
            authentication {
                header(HttpHeaderAuthentication)
            }
        }
    }
}

いじる必要のある部分は url と value になります。

注意点:

  • name は 発行した際のトークン名ではなく 'Deploy-Token' です。
  • セキュリティ面を考慮すると、デプロイトークンは別ファイルに記述したほうが良いです。

gitlab-ci.yml を書く

.gitlab-ci.yml に以下を追加します。以下は一例で、imageなどは環境に合わせてください。

gradle-publish:
  stage: publish
  image: amazoncorretto:11
  script: ./gradlew publish

※参考:Scrapbox GitLabのMaven Repository機能を使ってみる

書く部分は以上になります。

pushする

push すると CIが実行されます。うまく行けば Package Registry にパッケージが表示されます。(画面左のダンボール箱のマークから飛べる。)

公開したパッケージの利用方法

公開したパッケージの個別ページに使用方法が書いてありますが、プライベートリポジトリの場合は使用の際も認証が必要になるので、こちらの手順も書いておきます。(Gradle)

まず、デプロイトークンを発行する画面で、read_package_registry のみにチェックを入れてトークンを発行してください。 次に、ライブラリを使うプロジェクトのbuild.gradleを以下のように書いてください。

// build.gradle
repositories {
    ...
    maven {
        url 'https://GitLabのFQDN/api/v4/projects/プロジェクトID/packages/maven'
        name "GitLab"
        credentials(HttpHeaderCredentials) {
            name = 'Deploy-Token'
            value = '発行したデプロイトークン'
        }
        authentication {
            header(HttpHeaderAuthentication)
        }
    }
}

dependencies{
    ...
    implementation 'グループ名:ライブラリ名:バージョン'
}

これで利用することが可能になります。

参考にした記事など

感想

Java も Gradle も CI もほとんど触ったことがなかったので結構しょうもないところで詰まりましたが、おかげで力がついた気がします。

OPTiM ではアルバイトスタッフでも活躍できる環境があります。興味のある方はぜひ採用情報をご覧ください。 www.optim.co.jp