JitPack について

https://jitpack.io/

JitPack は Maven Repository のひとつです。Maven Repository では [Nexus]( https://www.sonatype.com/download-oss-sonatype) などが有名ですが、JitPack は github など git レポジトリとの連携が重視された独特の設計となっています。

Nexus などではあらかじめパッケージングを行った jar ファイルを Nexus サーバーに登録、という流れになります。

JitPack は、github などに置かれているソースを動的に pom ファイルならびに jar ファイルに変換して参照できるようにする、という設計になっています。

そのため、開発者は信頼できるソースコードを github などに push するだけで他の作業は必要なく、JitPack がバージョン番号の解決や pom / jar ファイルの生成などを行います。

なので、適切なコード管理さえされていれば、開発者にとっては CI/CD フローの中での余計な手間が低減され、シンプルな CI/CD 構成を組むことができるのが大きな特徴です。

# 設定例

Bitbucket とも連携可能ですが、ここでは git リポジトリは github を前提として書きます。またパッケージ管理ツールは maven を前提として書きます。

以下、github 側、maven dependency の呼び出し側にわけて記述します。

## github 側の設定
### pom.xml

あらかじめ、以下の条件を整えておく必要があります。

- ルートディレクトリに pom.xml を配置しておくこと
- mvn package が実行可能となっていること

以下が JitPack 動作確認用のサンプルプロジェクトとなります。Spring Boot アプリケーションとして構築し、 **/api/sada** に GET リクエストすると **masashi** という文字列が返却されるどこにでもあるシンプルなプロジェクトです。

https://github.com/moaikids/sada4j

## JitPack との連携

pom.xml の準備が出来たら、JitPack と連携してみます。

連携には特別な手順は不要で、使用している github アカウントでアカウント連携を行えば該当のリポジトリの情報が JitPack でも使用できるようになります。

public な github にあるソースコードであれば、以下のように無償で利用が可能です。

https://jitpack.io/#moaikids/sada4j

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/d74e7f2a-272f-a5ad-2780-f15afd3cb10a.png)


private リポジトリについては有償となり、アクセス時には security token を使用する形になります。

https://jitpack.io/private


## バージョンの設定

JitPack は Nexus のようにあらかじめパッケージングした jar ファイルを バージョン情報とともにアップロードするモデルではありません。

JitPack では、ライブラリのバージョンを以下のルールに基いてバージョニングしていきます。

### タグ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/27609b78-f597-c509-ceb7-d028f29c7f55.png)

コミットにタグを付与すると、それがバージョン情報として使用され、バージョンを指定することで当該コミット内容を参照することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/a02d6c0c-2ede-336c-e15f-409ef6d5cc33.png)

こちらはコミット履歴の例ですが、 0.0.8 というタグが付与されているコミットがあるのが見て取れると思います。

JitPack ではこちらの情報をもとに、 `<version>0.0.8</version>` と呼び出すと当該コミットの内容がパッケージングされ取得されます。



### ブランチ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/1dfb1dc7-f3be-a653-3fcc-c626fb0d64c3.png)

各ブランチの最新 push 内容が SNAPSHOT として参照することができます。

### コミット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/b1bb237f-9dbe-2cb5-6ec7-ec6279088dcd.png)

各コミット内容も、個別に参照可能になっています。



## 呼び出し側の設定

上記の github プロジェクトの内容を、呼び出し側の別のプロジェクトが maven dependency を用いて追加します。

### pom.xml
github 側に登録されている内容は、JitPack 経由で dependency として取得すると以下のようなルールで変換されます。

| 設定項目 | 設定内容 | 判例 | 補足 |
|:-----|:-----|:-----|:-----|
| groupId | com.github.{user_name} | com.github.moaikids | github 側の pom.xml の定義は無視されます。 |
| artifactId | {repository_name} | sada4j | github 側の pom.xml の定義は無視されます。 |
| version | （上述のように、いくつかのルールにより生成されたものを使用） | 0.0.8 | github 側の pom.xml の定義は無視されます。 | 


以下が実際の設定例です。上記ルールに基いて変換した dependency 情報と、JitPack のリポジトリ情報の追加を行えば OK です。

```xml
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
 
 
<dependencies>
    <dependency>
        <groupId>com.github.moaikids</groupId>
        <artifactId>sada4j</artifactId>
        <version>0.0.8</version>
    </dependency>
</dependencies>
```

あとは、mvn コマンドを実行すると、自動的に JitPack 経由で Jar ファイルの取得が行えると思います。

なお、初回呼び出し時は JitPack 側でファイルの生成を行うため、多少時間がかかります。

# 課題
## 壊れたソースコードを参照するリスク

当然ありえますし、Nexus とかを使っていても似たようなことは起こりえます。

master ブランチへのマージの仕方のルールづくりや、 CI/CD フローの確立により、そのような事故が起こらないようにする必要があります。

## 初回呼び出し時に時間がかかる問題

パッケージングして Maven Repository にアップロードする時間が不要になる代わりのオーバーヘッドではありますが、実際の開発時にストレスになることも考えられます。

一応、JitPack で Webhooks に対応しているので、github に JitPack の Webhooks を追加しておくとコミット時に自動的に pom / jar の生成を行ってくれるようです。

https://jitpack.io/docs/BUILDING/#building-ahead-of-time

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/93f7865e-5b72-4801-78ad-cdde99b1e8da.png)



# まとめにかえて
JitPack は今までの Maven Repository のあり方を変える可能性のある画期的なツールで、実際にこれにより CI/CD フローの簡略化など恩恵が大きいように思えます。

ただし日本語でのドキュメントが少ないのと、他の Maven Repository 製品と考え方が異なる部分も多いですので、その辺は割り切って習熟していく必要があります。