JitPackでJDK1.8以外をつかうときにする設定

# JitPackとは

- [JitPack](https://jitpack.io/)はGitHub等のVCS Hostingサービスから特定のコミットハッシュのソースコードを取得してビルドし、artficatのHostingを行ってくれるサービス
- MavenCentral(sonatype)はPGPによる署名が必要だったりリリースするために設定する項目があるがJitPackの場合は取り合えず`MavenLocal`にpublishさえできればOKなためお手軽
- 多くのユーザーに使われていないライブラリはビルドされたartifactが削除された状態になっているため、利用者側が使用しようとしたときにartifactのビルド時間分だけ依存解決に時間がかかるようになってしまう


# android向けライブラリを配信するときに詰まるところ

- AGP8.0以降を使用する場合、ビルドにはJDK17が必要となる
- JitPackのデフォルトランタイムはJDK1.8が設定されているため、ビルドが通らない


# どうする

- 設定ファイルを追加してJDK17をJitPackのランタイムに入れる
- [公式](https://jitpack.io/docs/BUILDING/#java-version)には以下の通りに記載がある
```
JitPack will compile projects using OpenJDK Java 8. See the example projects on how to set a different target version in your build file.
Maven projects that specify a target version in their pom will be built with that target version.
If your project uses Travis or Circle CI then JitPack will read the lowest jdk version from yml file and use that to build.
Alternatively create a jitpack.yml file in the root of your repository and specify a jdk version:
```

- `jitpack.yml`というファイルを作って`openjdk${jdk_version}`を指定するか[SDKMAN](https://sdkman.io/)を使って自分でいれてねとのことらしい
- 宗教上の理由でJDK distributionは[`Adoptium`](https://adoptium.net/)しか使わないのでローカルと環境を揃える意味で`.sdkmanrc`をバージョン管理に含めてしまうのが楽そう
- SDKMANでpublishされているJDK一覧は[ここ](https://api.sdkman.io/2/candidates/java/linux/versions/list?installed=)をブラウザで開いちゃうのが楽


# どうなった
- 以下のような`.sdkmanrc`と`jitpack.yml`をバージョン管理に追加することでJitPack側でのビルドが通るようになった


```.sdkmanrc
java=17.0.10-tem
```

```yaml:jitpack.yml
before_install:
  - source "$HOME/.sdkman/bin/sdkman-init.sh"
  - sdk update
  - sdk env install
```

# 追記：どうする

- 基本的には先述のymlで動くのだが時々動かないパターンがある
- default branchへのマージなどがトリガーになるsnap shot buildではSDKMANで問題なく動く
```
Build starting...
Start: Mon May 13 16:39:00 UTC 2024 fa8ce95b9f10
Git:
1.0.0-alpha07-0-g290c5b2
commit 290c5b271300f01211c4a1e083644efb9f9ce17a
Author: github-actions[bot] 
Date:   Mon May 13 16:32:16 2024 +0000

    release: 1.0.0-alpha07 (#78)
    

Init SDKMan
Running before_install command:
source "$HOME/.sdkman/bin/sdkman-init.sh";sdk update;sdk env install
[1;36mBroadcasts discontinued. Please follow @sdkman_ on Twitter for announcements.[0m
[1;32m
Adding new candidates(s): bld coursier detekt gcn grace helidon jarviz jikkou joern kobweb ktlint ktx liquibase neo4jmigrations scalacli skeletal taxi toolkit[0m
[1;33m
Please open a new terminal now...[0m

Downloading: java 17.0.10-tem

In progress...


                                                                           0.0%
######################################################################## 100.0%

Repackaging Java 17.0.10-tem...

Done repackaging...

[1;32mInstalling: java 17.0.10-tem[0m
[1;32mDone installing![0m

[1;32mSetting java version 17.0.10-tem as default.[0m

[1;32mUsing java version 17.0.10-tem in this shell.[0m
```


- tagを切ってGitHub Releaseを作成した際などのリリースビルドがエラーになる
- なぜか`sdk env`コマンドを認識してくれない
```log
Build starting...
Start: Mon May 13 16:36:33 UTC 2024 5b982186e099
Git:
1.0.0-alpha07-0-g290c5b2
commit 290c5b271300f01211c4a1e083644efb9f9ce17a
Author: github-actions[bot] 
Date:   Mon May 13 16:32:16 2024 +0000

    release: 1.0.0-alpha07 (#78)
    

Init SDKMan
Running before_install command:
source "$HOME/.sdkman/bin/sdkman-init.sh";sdk update;sdk env install
[1;36mBroadcasts discontinued. Please follow @sdkman_ on Twitter for announcements.[0m

[1;32mAdding new candidates(s): activemq ballerina bld ceylon connor coursier crash detekt doctoolchain dotty flink gcn glide grace gradleprofiler hadoop helidon http4k jarviz jikkou jmc jmeter joern jreleaser kcctl ki kobweb ktlint ktx layrry lazybones liquibase mcs mvnd mybatis neo4jmigrations pierrot pomchecker quarkus scalacli schemacrawler skeletal taxi test tomcat toolkit webtau znai [0m

[1;33mPlease open a new terminal now...[0m
Invalid command: env

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version] [local-path]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> <version>
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       update
       flush             <broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list
   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy
   local-path :  optional path to an existing local installation
                 eg: $ sdk install groovy 2.4.13-local /opt/groovy-2.4.13


[1;31mStop! install is not a valid candidate.[0m
```



# 追記：どうなった

- `source "$HOME/.sdkman/bin/sdkman-init.sh"`系を排除し、installのみを実施するように変更した

```yaml:jitpack.yml
before_install:
  - sdk env install
```

- 無事に動くようになった！
    - https://jitpack.io/com/github/RyuNen344/WebAuthnKt/1.0.0-alpha08/build.log

# おわりに

- WebAuthnのJSON類をGOSNやJacksonを使わず、Moshi or Kotlinx Serializationでシリアライズするライブラリを作っている途中でぶつかった
- こっちのライブラリのフィードバックください（趣味でパスキーを管理するバックエンドを持っている人が少なくて使用感が絶妙にわからん

https://github.com/RyuNen344/WebAuthnKt