# Gradle を使用したJava パッケージの発行

このチュートリアルでは、Gradle を使用して、継続的インテグレーション (CI) ワークフローの一部としてJava パッケージをレジストリに発行する方法について説明します。

## はじめに

このガイドは、JavaのパッケージをGitHub PackagesやMaven Central Repositoryに公開するワークフローの作成方法を紹介します。 1つのワークフローで、パッケージを1つのリポジトリあるいは複数のリポジトリに公開できます。

> \[!WARNING] このガイドで使われている例は、レガシ OSSRH サービスを参照しています。 Maven Central リポジトリ ドキュメントの「[Publishing](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing)」(公開) を参照してください。

## 前提条件

ワークフローファイルと設定オプションに関する基本的な理解をしておくことをおすすめします。 詳しくは、「[ワークフローの書き込み](/ja/enterprise-server@3.22/actions/how-tos/write-workflows)」をご覧ください。

Gradle を使用してJava プロジェクトの CI ワークフローを作成する方法の詳細については、「[Gradle を使用したJavaの構築とテスト](/ja/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-gradle)を参照してください。

また、以下の基本的な理解があれば役立ちます。

* [Apache Mavenレジストリの利用](/ja/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [変数に情報を格納する](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## パッケージの設定について

`groupId` セクションの `artifactId` および `MavenPublication` フィールドは、*build.gradle* ファイル内でレジストリがパッケージをレジストリにリンクするために使用する、パッケージに対する一意の識別子を作成します。 これは、Maven の `groupId` ファイルの `artifactId` および \_\_ フィールドと似ています。 詳しくは、Gradle のドキュメント「[Maven 公開プラグイン](https://docs.gradle.org/current/userguide/publishing_maven.html)」をご覧ください。

*build.gradle* ファイルには、Gradle によるパッケージの公開先である配布管理リポジトリの設定も含まれています。 各リポジトリは、名前、デプロイメントのURL、認証のためのクレデンシャルを持っていなければなりません。

## Maven Central Repositoryへのパッケージの公開

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、`release` イベントが `created` 型でトリガーされたときに実行されます。 このワークフローは、CIテストをパスすればMaven Central Repositoryにパッケージを公開します。
`release` イベントの詳細については、「[ワークフローをトリガーするイベント](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)」を参照してください。

*build.gradle* ファイルのパッケージ リポジトリを指す publishing ブロックで、新しい Maven リポジトリを定義できます。 たとえば、OSSRH ホスティング プロジェクトを使用して Maven Central Repository にデプロイした場合、*build.gradle* では `"OSSRH"` という名前でリポジトリを指定できます。

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
  }
}
```

この構成を使うと、`gradle publish` コマンドを実行することによりパッケージを Maven Central Repository に公開するワークフローを作成できます。 デプロイのステップでは、ユーザ名とパスワードのための環境変数か、Mavenリポジトリの認証に使うトークンを環境変数に設定する必要があります。 詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

```yaml copy

# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。

# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。

name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリのコピーをチェックアウトします。
2. Java JDKをセットアップします。
3. Gradle 環境を設定します。 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。
4. Gradle `publish` タスクを実行して `OSSRH` Maven リポジトリに発行します。
   `MAVEN_USERNAME` 環境変数には `OSSRH_USERNAME` シークレットの内容が設定され、`MAVEN_PASSWORD` 環境変数には `OSSRH_TOKEN` シークレットの内容が設定されます。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

## GitHub Packages へのパッケージの発行

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、`release` イベントが `created` 型でトリガーされたときに実行されます。 CI テストに合格した場合、ワークフローはパッケージを GitHub Packages に発行します。
`release` イベントの詳細については、「[ワークフローをトリガーするイベント](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)」を参照してください。

\_
\_を指す新しい Maven リポジトリを GitHub Packages の発行ブロックに定義できます。 そのリポジトリの設定では、CIワークフローの実行で設定された環境変数を活用することもできます。
`GITHUB_ACTOR` 環境変数をユーザー名として使用でき、`GITHUB_TOKEN` 環境変数に `GITHUB_TOKEN` シークレットを設定できます。

ワークフロー内のジョブが開始されるたびに、`GITHUB_TOKEN` シークレットはそのリポジトリのアクセス トークンに設定されます。 ワークフロー ファイルでこのアクセス トークンにアクセス許可を設定して、`contents` アクセス許可に対する読み取りアクセスと、`packages` アクセス許可に対する書き込みアクセスを付与する必要があります。 詳しくは、「[ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)」をご覧ください。

たとえば、組織の名前が "octocat" で、リポジトリの名前が "hello-world"、GitHub Packages の\_\_ 構成は次の例のようになります。

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

この構成では、GitHub Packages コマンドを実行してパッケージを`gradle publish`に発行するワークフローを作成できます。

```yaml copy

# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。

# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。

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@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリのコピーをチェックアウトします。
2. Java JDKをセットアップします。
3. Gradle 環境を設定します。 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。
4. Gradle `publish` タスクを実行して、 GitHub Packagesに発行します。
   `GITHUB_TOKEN` 環境変数には、`GITHUB_TOKEN` シークレットの内容が設定されます。
   `permissions` キーでは、`GITHUB_TOKEN` シークレットによって許可されるアクセス権を指定します。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

## Maven Central リポジトリへのパッケージの発行と GitHub Packages

GitHub Packages ファイルでそれぞれを構成することで、Maven Central リポジトリと\_\_ の両方にパッケージを発行できます。

*build.gradle* ファイルに、GitHub リポジトリと Maven Central Repository プロバイダーの両方のリポジトリが含まれていることを確認します。

たとえば、OSSRH ホスティング プロジェクトを通じて Central Repository にデプロイする場合は、`name` を `OSSRH` に設定して、配布管理リポジトリでそのことを指定できます。
GitHub Packagesにデプロイする場合は、`name`が `GitHubPackages` に設定されたディストリビューション管理リポジトリで指定できます。

Organization の名前が "octocat" で、リポジトリの名前が "hello-world"、*build.gradle* の構成は次の例のようになります。

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

この構成では、GitHub Packages コマンドを実行して、Maven Central Repository と `gradle publish` の両方にパッケージを発行するワークフローを作成できます。

```yaml copy

# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。

# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。

name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env: 
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリのコピーをチェックアウトします。
2. Java JDKをセットアップします。
3. Gradle 環境を設定します。 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。
4. Gradle `publish` タスクを実行して、 `OSSRH` Maven リポジトリと GitHub Packagesに発行します。
   `MAVEN_USERNAME` 環境変数には `OSSRH_USERNAME` シークレットの内容が設定され、`MAVEN_PASSWORD` 環境変数には `OSSRH_TOKEN` シークレットの内容が設定されます。
   `GITHUB_TOKEN` 環境変数には、`GITHUB_TOKEN` シークレットの内容が設定されます。
   `permissions` キーでは、`GITHUB_TOKEN` シークレットによって許可されるアクセス権を指定します。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。