Closed kazurayam closed 1 year ago
How to establish a inhouse-Maven repository?
Working with the Gradle registry
You can configure Gradle to publish packages to the GitHub Packages Gradle registry and to use packages stored on GitHub Packages as dependencies in a Java project.
おっ、GitHub Packages これ 良いんじゃないか? Oh, it looks good.
成功した。手順をメモしておく。
参考にした情報元はこれ: https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry
materialstoreプロジェクトのトップページを開き右側のちょっと下を見ると Packages というタイトルがあって No packages published と表示されていた。
何か操作をするとここに1と表示されるのだろう。そしてそれがmaterialstoreの成果物をアクセス可能とするMavenレポジトリなのだろう。それが達成目標だ。
マニュアルがいうとおり、Personal Access Tokenを作った。
nameを
PAT for GitHub Packages Gradle registry
とした。
90日でexpireする
と指定した。
生成されたPATの文字列を秘密の場所にメモした。
レポジトリにアクセスするためのUSERNAMEとKEYを ~/.gradle/gradle.properties
ファイルに書き込んだ。
# Username and Key for GitHub Package
gpr.user=kazurayam
gpr.key=ghp_************************************
ここで*****は伏せ字。
この準備をすると、build.gradleファイルの中で
println project.findProperty('gpr.user')
println project.findProperty('gpr.key')
と書けば値を読み出すことができる。build.gradleファイルは公開されるべきファイルで、その中にPATを直書きすることは絶対に避けなければならない。Gradleのプロパティ gpr.userと gpr.keyを参照することによって、PATをコードに直書きすることを避けることができる。
なお gpr とはGithub Package Registryの略だと思われる
materialstoreプロジェクトのbuild.gradleファイルを修正した。maven-publishプラグインに対して設定を加えた。materialstoreレポジトリのGitHub Package RestryのURLをmaven-publishプラグインに教える。
publishing {
repositories {
maven {
def releaseRepo = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotRepo = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
url = isReleaseVersion ? releaseRepo: snapshotRepo
credentials {
username = project.hasProperty("ossrhUsername") ? ossrhUsername : "Unknown user"
password = project.hasProperty("ossrhPassword") ? ossrhPassword : "Unknown password"
}
}
maven {
name = "gpr"
url = uri("https://maven.pkg.github.com/kazurayam/materialstore")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("GPR_USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("GPR_TOKEN")
}
}
}
上記の記述により、2つのmavenレポジトリを使えるよう宣言する。一つはMaven Centralレポジトリ、もう一つはGitHub Package Registryだ。GitHub Package Registryにnameとして gpr
を指定した。それからURLを指定した。アクセスするのに必要なusernamとpasswordをGradleのプロパティを参照するよう記述した。
さて、materialstoreのpublicationをgprにパブリッシュしよう。下記のコマンドを投入した。
$ gradle publishMaterialstorePublicationToGprRepository
Packageができた。
materialstore-0.14.0.jarをGPRで公開できたから、inspectusプロジェクトがそれを参照できることを確かめよう。
[inspectusのbuild.gradleファイル]を修正した。
repositories {
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/kazurayam/materialstore")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("GPR_USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("GPR_TOKEN")
}
}
//mavenLocal()
}
Maven CentralとGPRの二つを参照候補として定義して、Maven Localをあえてコメントアウトした。これでmaterialstore-0.14.0.jarが参照できれば成功だ。
できた!
レポジトリを作ったり更新したりするのにcredentialを要求するのは当然として、inspectusプロジェクトがmaterialstoreのGPRレポジトリを参照するのにもPATが要求される。つまりGPRレポジトリは一般不特定多数に公開されるものではない。PATに基づいて誰がそれを参照してよいかを制御することができる。宛先を限定して公開することができるわけだ。ナイスだ。
GitHubでMaven Repositoryを作れるらしいということは三年前にチラと知った記憶がある。当時、真面目に取り組む動機が無かったので、学ぶ時間を取らなかった。今、必要に迫られてGitHub Package Registryを習った。ああ、これなら良い感じだ。学んだ甲斐があった。
done
I am using the Maven Centraol repository to publish the artifacts of kazurayam.com, for example
This works for the versions that are tested enough.
However, in some cases I need to make my still-in-development artifacts public to Internet.
For example, the inspectus projects depends on the materialstore project. the inspectus4katalon-gradle-plugin project depends on the inspects project. Every project now performs CI on GitHub Actions. Gradle build performed on GitHub Actions require all dependencies could be resolved from some repositories public to the Internet. When I make the materialstore-0.14.0.jar, could publish to the mavenLocal repository but not yet to the Maven Central repository, the CI for the inspectus that require the materialstore-0.14.0.jar fails. This is not very convenient.
GitHub enables us to host a Maven repository.
If I could have a Maven repository for kazurayam.com, not globally public to the world, then it is convenient.