kazurayam / materialstore

A domain-specific file system to store "materials" (screenshots, HTML, JSON, XML) collected during End-to-End testings using Selenium WebDriver etc. Features to make "diff" and compiling HTML reports are also included. This is written in pure Java8
Apache License 2.0
0 stars 0 forks source link

Consider hosting a Maven Repository for the materialstore on GitHub Package Registry #384

Closed kazurayam closed 1 year ago

kazurayam commented 1 year ago

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.

kazurayam commented 1 year ago

How to establish a inhouse-Maven repository?

https://qiita.com/koduki/items/6babcc6f2b233da96e06

kazurayam commented 1 year ago

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry

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.

kazurayam commented 1 year ago

成功した。手順をメモしておく。

参考にした情報元はこれ: https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry

materialstoreプロジェクトのトップページを開き右側のちょっと下を見ると Packages というタイトルがあって No packages published と表示されていた。

スクリーンショット 2022-12-04 21 07 18

何か操作をするとここに1と表示されるのだろう。そしてそれがmaterialstoreの成果物をアクセス可能とするMavenレポジトリなのだろう。それが達成目標だ。

kazurayam commented 1 year ago

マニュアルがいうとおり、Personal Access Tokenを作った。 nameを PAT for GitHub Packages Gradle registry とした。 90日でexpireする と指定した。 生成されたPATの文字列を秘密の場所にメモした。

kazurayam commented 1 year ago

レポジトリにアクセスするための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の略だと思われる

kazurayam commented 1 year ago

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のプロパティを参照するよう記述した。

kazurayam commented 1 year ago

さて、materialstoreのpublicationをgprにパブリッシュしよう。下記のコマンドを投入した。

$ gradle publishMaterialstorePublicationToGprRepository
スクリーンショット 2022-12-04 22 10 21
kazurayam commented 1 year ago

Packageができた。

スクリーンショット 2022-12-04 22 11 39 スクリーンショット 2022-12-04 22 11 51
kazurayam commented 1 year ago

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に基づいて誰がそれを参照してよいかを制御することができる。宛先を限定して公開することができるわけだ。ナイスだ。

kazurayam commented 1 year ago

GitHubでMaven Repositoryを作れるらしいということは三年前にチラと知った記憶がある。当時、真面目に取り組む動機が無かったので、学ぶ時間を取らなかった。今、必要に迫られてGitHub Package Registryを習った。ああ、これなら良い感じだ。学んだ甲斐があった。

kazurayam commented 1 year ago

done