Gradle + GitHub ActionsでGitHub Packages作成

# 初めに
ド素人のメモです。
すみません。
本職でもないから許してくれ。

# 環境
- Windows10
- IntelliJ IDEA Community

# リポジトリ作成
GitHubでリポジトリ作ります。

# プロジェクト作成
Kotlin DSL ビルドスクリプトにチェックを入れます。
グループIDとかアーティファクトIDは適当なものを。
![プロジェクト作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404837/05ba9511-929f-c7e8-1f4a-d881284416fd.png)
終わったらローカルリポジトリを作成してリモートリポジトリを追加してください。

# build.gradle.kts
GitHubのドキュメントからまんまパクりました。

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#example-using-kotlin-dsl-for-a-single-package-in-the-same-repository

気を付ける点としてはurlのOWNER(ユーザー名/組織名)は全て小文字にすること。
nameはGitHubPackagesで固定。
```kotlin:build.gradle.kts
plugins {
    `maven-publish`
}
publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY")
            credentials {
                username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }
    publications {
        register<MavenPublication>("gpr") {
            from(components["java"])
        }
    }
}
```

# gradle.properties
先程のbuild.gradle.ktsの`project.findProperty`はgradle.propertiesの値を取得します。そのため、ユーザー名とtokenをgradle.propertiesに書かなければなりません。まずはトークン取得から。

## トークン取得
https://github.com/settings/tokens でトークンを作成します。
以下を参考に必要な権限を設定します。

https://docs.github.com/ja/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries

よく分からんから全部付けてみた！！
![token permission.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404837/5bbf9956-390b-d9da-5b43-de63c5dbc4b6.png)
権限の設定が終わったらGenerate tokenを押します。
トークンが生成されるのでコピーして下さい。
![generated.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404837/2abf95e3-e6a7-630d-c493-cf9775963d72.png)

## 貼り付けする前に
トークンを取得したはいいものの、作成したプロジェクト内にあるgradle.propertiesに貼り付けてはリモートリポジトリで丸見えです。
`project.findProperty`はユーザーディレクトリの方のgradle.propertiesの内容も取得します。
なので、貼り付ける先はユーザーディレクトリの`.gradle/gradle.properties`にします。
`<USER_HOME>/.gradle/gradle.properties`です。
ちなみに2つのファイルに同じキーがあった場合、優先度はユーザーディレクトリの方にあります。
```gradle:gradle.properties
gpr.user=GitHubID
gpr.key=TOKEN
```

# gradleでPackage作成
別にActions使わなくてもPackagesは作れます。
コマンドを打つだけです。
```
> .\gradlew publish
```
gradle.propertiesに定義せずとも作成する方法もあります。
コマンドラインの引数でプロパティを設定してあげます。
`-PpropertyName=propertyValue`で設定できます。
```
> .\gradlew publish -Pgpr.user=GitHubID -Pgpr.key=TOKEN
```

# GitHub ActionsでPackage作成
## Actions作成
ドキュメントからパクリました。

https://docs.github.com/ja/actions/publishing-packages/publishing-java-packages-with-gradle#github-packages%E3%81%B8%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%85%AC%E9%96%8B

```yaml:packages.yml
name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest 
    permissions: 
      contents: read
      packages: write 
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@v1
      - name: Publish package
        uses: gradle/gradle-build-action@v2
        with:
          arguments: publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

先程のbuild.gradle.ktsの`System.getenv`は環境変数の取得です。そのため、GitHub Actionsで`GITHUB_ACTOR`と`GITHUB_TOKEN`を環境変数として設定してあげる必要があります。
`GITHUB_TOKEN`は`secrets.GITHUB_TOKEN`を設定してあげます。`secrets.GITHUB_TOKEN`はデフォルトで定義されているシークレット変数なので`secrets.GITHUB_TOKEN`を設定する作業とかは無いです。
`GITHUB_ACTOR`はデフォルトで環境変数として設定されているので特に何かする必要はありません。

## リリースしてPackages作成
GitHubでリリースを作成するとActionsが走ってPackagesが作成されます。

## Gradle script /home/runner/work/*/gradlew is not executable.
gradlewに実行権限が無いらしいです。
なので実行権限を与えてあげます。
```
> git update-index --chmod=+x gradlew
```
# 公開されたパッケージの利用

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

```kotlin:build.gradle.kts
repositories {
    maven {
        url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY")
        credentials {
            username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
            password = project.findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN")
        }
    }
}
dependencies {
    implementation("com.example:package")
}
```

# 参考にしたサイト
- [GradleでのJavaパッケージの公開 - GitHub Docs](https://docs.github.com/ja/actions/publishing-packages/publishing-java-packages-with-gradle)
- [Gradleレジストリの利用 - GitHub Docs](https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry)
- [GitHub Packagesの権限について - GitHub Docs](https://docs.github.com/ja/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries)