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リポジトリの認証に使うトークンを環境変数に設定する必要があります。 詳細については、「暗号化されたシークレットの作成と使用」を参照してください。

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@v3
      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
      - name: Publish package
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: publish
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}

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

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

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

  3. リポジトリ内にあるすべてのGradle Wrapper JARファイルのチェックサムを検証します。

  4. OSSRH Maven リポジトリに公開するには、publish 引数を指定して gradle/gradle-build-action アクションを実行します。 MAVEN_USERNAME 環境変数には OSSRH_USERNAME シークレットの内容が設定され、MAVEN_PASSWORD 環境変数には OSSRH_TOKEN シークレットの内容が設定されます。

    ワークフローでシークレットを使用する方法の詳細については、暗号化されたシークレットの作成と使用に関するページを参照してください。

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 スコープに対する書き込みアクセス権を付与する必要があります。 詳細については、「GITHUB_TOKEN を使用した認証」を参照してください。

たとえば、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@v3
      - uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
      - name: Publish package
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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

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

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

  3. リポジトリ内にあるすべてのGradle Wrapper JARファイルのチェックサムを検証します。

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

    ワークフローでシークレットを使用する方法の詳細については、暗号化されたシークレットの作成と使用に関するページを参照してください。

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@v3
      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
      - name: Publish package
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: publish
        env: 
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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

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

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

  3. リポジトリ内にあるすべてのGradle Wrapper JARファイルのチェックサムを検証します。

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

    ワークフローでシークレットを使用する方法の詳細については、暗号化されたシークレットの作成と使用に関するページを参照してください。