GitLabのMaven Repository機能を使ってみる
GitLabにはMaven Repositoryのように動く機能があるみたいで、
これを使うことでGradleで依存関係を解決できるプライベートな環境を使うことができそう。
JavaやKotlinなどでプロダクトを作っていくことを考えたら、
このあたりの知識が必ず必要になると思う。
ってことで、今回はGitLabのMaven RepositoryとGradleを使って依存関係を解決してみる。
Javaでライブラリを作る
GitLabにPrivate Repositoryを作成
作ったJava製ライブラリをpush
Kotlinでライブラリを作る
GitLabにPublic Repositoryを作成
作ったKotlin製ライブラリをpush
GitLabのMaven Repositoryを利用する
Java版とKotlin版を作ったので、それぞれのMaven Repositoryを利用する。
基本的な流れ
gitlabからDeploy Tokenを取得する
Settings > Repository > Deploy Tokens で read_package_resigtory と write_package_resigtory にチェックをいれて Create
https://gyazo.com/df32eefe26f50c3ac628e6df2f8cd49e
その後表示されるTokenをメモしておく
build.gradle に pluginとして maven-publish を追加する
publishingとして公開の設定を書く
リポジトリはgitlabを指定し、認証方法はDeploy-Tokenを利用する。詳細は後述
CI実行
Packages & Registories に反映されていることを確認
https://gyazo.com/a6154d3b44599ac08599ebd08bb7ade8
Java版
build.gradle
maven-publish を登録する
code:build.gradle
plugins {
id 'java'
id 'maven-publish' // 追加
}
publishing にタスクの詳細を定義する
code:build.gradle
// 追加
publishing {
publications {
library(MavenPublication) {
from components.java
}
}
repositories {
maven {
name "GitLab"
credentials(HttpHeaderCredentials) {
name = 'Deploy-Token'
value = '' // 作ったDeploy Token
}
authentication {
header(HttpHeaderAuthentication)
}
}
}
}
.gitlab-ci.yml
gradle publish を追加する
code:.gitlab-ci.yml
stages:
- test
- publish # 追加
gradle-test:
stage: test
image: amazoncorretto:11
script: ./gradlew test
# 追加
gradle-publish:
stage: publish
image: amazoncorretto:11
script: ./gradlew publish
Kotlin版
build.gradle
maven-publish を登録する
code:build.gradle
plugins {
kotlin("jvm") version "1.5.10"
maven-publish // 追加
}
publishing にタスクの詳細を定義する
code:build.gradle
// 追加
publishing {
publications {
create<MavenPublication>("library") {
}
}
repositories {
maven {
name = "GitLab"
credentials(HttpHeaderCredentials::class) {
name = "Deploy-Token"
value = '' // 作ったDeploy Token
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
}
.gitlab-ci.yml
gradle publish を追加する
Java版と同じ
先に作ったライブラリを利用するプログラムを作る
publicなリポジトリの依存を追加する
repositoryの指定
code:build.gradle.kts
repositories {
mavenCentral()
}
依存関係の指定
code:build.gradle.kts
dependencies {
implementation(kotlin("stdlib"))
implementation("com.tsuchinaga.hellokotlinlib:hello-kotlin-lib:0.0.1") // 追加
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
}
依存の書き方はgitlabのregistoryを見れば分かりやすい
https://gyazo.com/a5f30399383a0a9c73f4166250cb4e44
privateなリポジトリの依存を追加する
repositoryの指定
code:build.gradle.kts
repositories {
mavenCentral()
// ここから追加
maven {
credentials(HttpHeaderCredentials::class) {
name = "Deploy-Token"
value = "Deploy Token"
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
deploy tokenはpublishのtokenとは別に、read_package_registoryのみが許可されたtokenを発行しましょ
依存関係の指定
code:build.gradle.kts
dependencies {
implementation(kotlin("stdlib"))
implementation("com.tsuchinaga.hellojavalib:hello-java-lib:0.0.2") // 追加
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
}
main関数の追加
code:Main.kt
import com.tsuchinaga.hellojavalib.HelloWorldFromJava
import com.tsuchinaga.hellokotlinlib.HelloWorldFromKotlin
fun main() {
println("こんにちわーるど")
val hwj = HelloWorldFromJava("ライブラリユーザー")
println(hwj.greeting())
val hwk = HelloWorldFromKotlin("ライブラリユーザー")
println(hwk.greeting())
}
実行
こんにちわーるど
Hello, ライブラリユーザー from Java
Hello, ライブラリユーザー from Kotlin
注意
private リポジトリのdeploy tokenが漏れると中身が読まれてしまいます。
private リポジトリのライブラリを使うなら、使う側もprivateにすべきです
おわりに
privateなmavenリポジトリが使えるだけで、JavaやKotlinのプロダクトの効率は劇的に上がると思います。
共通部分を切り出し、楽に依存管理する。
むしろこれをしないと本当に管理が大変です。
更新履歴