Skip to main content

GradleでのJavaパッケージの公開

継続的インテグレーション(CI)ワークフローの一部として、Javaのパッケージをレジストリに公開するためにGradleを利用できます。

はじめに

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

前提条件

ワークフローファイルと設定オプションに関する基本的な理解をしておくことをおすすめします。 詳しくは、「GitHub Actions について」を参照してください。

Gradle を使用して Java プロジェクトの CI ワークフローを作成する方法の詳細については、「GradleでのJavaのビルドとテスト」を参照してください。

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

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

build.gradle ファイルの MavenPublication セクションの groupId および artifactId フィールドにより、パッケージをレジストリにリンクするためにレジストリで使われる、パッケージに対する一意の識別子が作成されます。 これは、Maven の pom.xml ファイルの groupId および artifactId フィールドと似ています。 詳細については、Gradle のドキュメントの「Maven Publish Plugin (Maven 公開プラグイン)」を参照してください。

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

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

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、release イベントが created 型でトリガーされたときに実行されます。 このワークフローは、CIテストをパスすればMaven Central Repositoryにパッケージを公開します。 release イベントの詳細については、「ワークフローをトリガーするイベント」をご覧ください。

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

Groovy
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 でのシークレットの使用」を参照してください。

YAML

# このワークフローは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@v4
      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

      - 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 アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。

  4. Gradle publish タスクを実行して OSSRH Maven リポジトリに発行します。 MAVEN_USERNAME 環境変数には OSSRH_USERNAME シークレットの内容が設定され、MAVEN_PASSWORD 環境変数には OSSRH_TOKEN シークレットの内容が設定されます。

    ワークフローでシークレットを使う方法について詳しくは、「GitHub Actions でのシークレットの使用」を参照してください。

GitHub Packagesへのパッケージの公開

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、release イベントが created 型でトリガーされたときに実行されます。 このワークフローは、CIテストをパスすればGitHub Packagesにパッケージを公開します。 release イベントの詳細については、「ワークフローをトリガーするイベント」をご覧ください。

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

ワークフロー内のジョブが開始されるたびに、GITHUB_TOKEN シークレットはそのリポジトリのアクセス トークンに設定されます。 ワークフロー ファイルでこのアクセス トークンにアクセス許可を設定して、contents スコープに対する読み取りアクセス権と、packages スコープに対する書き込みアクセス権を付与する必要があります。 詳しくは、「自動トークン認証」を参照してください。

たとえば、Organization の名前が "octocat" で、リポジトリの名前が "hello-world" の場合、build.gradle の GitHub Packages の構成は次の例のようになります。

Groovy
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")
      }
    }
  }
}

この構成を使うと、gradle publish コマンドを実行することによりパッケージを GitHub Packages に公開するワークフローを作成できます。

YAML

# このワークフローは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@v4
      - uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

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

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

  1. プロジェクトのリポジトリのコピーをチェックアウトします。

  2. Java JDKをセットアップします。

  3. Gradle 環境を設定します。 gradle/actions/setup-gradle アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。

  4. Gradle publish タスクを実行して、GitHub Packages に公開します。 GITHUB_TOKEN 環境変数には、GITHUB_TOKEN シークレットの内容が設定されます。 permissions キーでは、GITHUB_TOKEN シークレットによって許可されるアクセス権を指定します。

    ワークフローでシークレットを使う方法について詳しくは、「GitHub Actions でのシークレットの使用」を参照してください。

Maven Central RepositoryとGitHub Packagesへのパッケージの公開

build.gradle ファイルでそれぞれを構成することにより、Maven Central Repository と GitHub Packages の両方にパッケージを公開できます。

build.gradle ファイルに、GitHub リポジトリと Maven Central Repository プロバイダー両方に対するリポジトリを含めます。

たとえば、OSSRH ホスティング プロジェクトを通じて Central Repository にデプロイする場合は、nameOSSRH に設定して、配布管理リポジトリでそのことを指定できます。 GitHub Packages にデプロイする場合は、nameGitHubPackages に設定することで、配布管理リポジトリでそのことを指定できます。

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

Groovy
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")
      }
    }
  }
}

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

YAML

# このワークフローは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@v4
      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

      - 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 アクションは 、ワークフロー実行間のキャッシュ状態を処理し、すべての Gradle 実行の詳細な概要を提供します。

  4. OSSRH Maven リポジトリと GitHub Packages に公開するには、Gradle publish タスクを実行します。 MAVEN_USERNAME 環境変数には OSSRH_USERNAME シークレットの内容が設定され、MAVEN_PASSWORD 環境変数には OSSRH_TOKEN シークレットの内容が設定されます。 GITHUB_TOKEN 環境変数には、GITHUB_TOKEN シークレットの内容が設定されます。 permissions キーでは、GITHUB_TOKEN シークレットによって許可されるアクセス権を指定します。

    ワークフローでシークレットを使う方法について詳しくは、「GitHub Actions でのシークレットの使用」を参照してください。