Skip to main content

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

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

はじめに

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

前提条件

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

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

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

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

pom.xml ファイル内の groupId および artifactId フィールドは、パッケージをレジストリにリンクするためにレジストリが使用するパッケージの一意の識別子を作成します。 詳細については、Apache Maven ドキュメントの「Guide to uploading artifacts to the Central Repository」(セントラル リポジトリに成果物をアップロードするためのガイド) を参照してください。

pom.xml ファイルには、Maven がパッケージをデプロイするディストリビューション管理リポジトリの構成も含まれています。 各リポジトリは、名前とデプロイメントURLを持たなければなりません。 これらのリポジトリの認証は、Maven を実行しているユーザーのホーム ディレクトリにある .m2/settings.xml ファイルで構成できます。

この setup-java アクションを使用して、デプロイ リポジトリと、そのリポジトリの認証を構成できます。 詳細については、「setup-java」を参照してください。

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

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

このワークフローでは、setup-java アクションを使用できます。 このアクションにより、特定のバージョンの JDK が PATH にインストールされますが、パッケージを発行するための Maven settings.xml も構成されます。 デフォルトでは、設定ファイルはGitHub Packagesに対して設定されますが、Maven Central Repositoryなどの他のパッケージレジストリにデプロイするようにも設定できます。 pom.xml で既にディストリビューション管理リポジトリが構成されている場合は、setup-java アクションの呼び出し時にその id を指定できます。

たとえば、OSSRH ホスティング プロジェクトを使用して Maven セントラル リポジトリにデプロイする場合、pom.xmlossrhid を持つディストリビューション管理リポジトリを指定できます。

xml
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>ossrh</id>
      <name>Central Repository OSSRH</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

この構成では、リポジトリ管理 idsetup-java アクションに指定することで、Maven セントラル リポジトリにパッケージを発行するワークフローを作成できます。 リポジトリの認証のために、ユーザ名とパスワードを含む環境変数を提供する必要もあります。

デプロイのステップでは、リポジトリに認証してもらうユーザ名と、認証のためのパスワードあるいはトークンで設定したシークレットを環境変数に設定する必要があります。 詳細については、暗号化されたシークレットの作成と使用に関するページを参照してください。

YAML
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 Maven Central Repository
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}

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

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

  2. Java JDK を設定し、Maven settings.xml ファイルも構成して、MAVEN_USERNAME および MAVEN_PASSWORD 環境変数を使用して ossrh リポジトリの認証を追加します。

  3. ossrh リポジトリに公開するには、mvn --batch-mode deploy コマンドを実行します。 MAVEN_USERNAME 環境変数には OSSRH_USERNAME シークレットの内容が設定され、MAVEN_PASSWORD 環境変数には OSSRH_TOKEN シークレットの内容が設定されます。

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

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

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

このワークフローでは、setup-java アクションを使用できます。 このアクションにより、特定のバージョンの JDK が PATH にインストールされ、パッケージを GitHub Packages に発行するための Maven settings.xml も設定されます。 生成された settings.xml では、GITHUB_ACTOR 環境変数をユーザー名として、GITHUB_TOKEN 環境変数をパスワードとして使用し、githubid を使用してサーバーの認証を定義します。 GITHUB_TOKEN 環境変数には、特別な GITHUB_TOKEN シークレットの値が割り当てられます。

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

Maven ベースのプロジェクトの場合は、githubid を使用して GitHub Packages エンドポイントを指すディストリビューション リポジトリを pom.xml ファイルに作成することで、これらの設定を利用できます。

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

xml
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>github</id>
      <name>GitHub Packages</name>
      <url>https://maven.pkg.github.com/octocat/hello-world</url>
    </repository>
  </distributionManagement>
</project>

この構成では、自動的に生成された settings.xml を使用して、パッケージを GitHub Packages に発行するワークフローを作成できます。

YAML
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: Publish package
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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

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

  2. Java JDK を設定し、github Maven リポジトリで GITHUB_TOKEN 環境変数を使用するための認証を追加するように Maven settings.xml ファイルも自動的に構成します。

  3. mvn --batch-mode deploy コマンドを実行して、GitHub Packages に公開します。 GITHUB_TOKEN 環境変数には、GITHUB_TOKEN シークレットの内容が設定されます。 permissions キーには、GITHUB_TOKEN に付与されているアクセス権を指定します。

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

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

各レジストリの setup-java アクションを使用して、Maven セントラル リポジトリと GitHub Packages の両方にパッケージを発行できます。

pom.xml ファイルに、GitHub リポジトリと Maven セントラル リポジトリ プロバイダーの両方のディストリビューション管理リポジトリが含まれている必要があります。 たとえば、OSSRH ホスティング プロジェクトを使用してセントラル リポジトリにデプロイする場合は、idossrh に設定してディストリビューション管理リポジトリで指定し、idgithub に設定してディストリビューション管理リポジトリで GitHub Packages を指定できます。

YAML
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 for publishing to Maven Central Repository
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish to the Maven Central Repository
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
      - name: Set up Java for publishing to GitHub Packages
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Publish to GitHub Packages
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

このワークフローでは、setup-java アクションを 2 回呼び出します。 setup-java アクションが実行されるたびに、パッケージを発行するための Maven settings.xml ファイルが上書きされます。 リポジトリに対する認証の場合、settings.xml ファイルはディストリビューション管理リポジトリ id とユーザー名とパスワードを参照します。

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

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

  2. 初回の setup-java の呼び出しを行います。 これにより、ossrh リポジトリの Maven settings.xml ファイルが構成され、次の手順で定義されている環境変数に認証オプションが設定されます。

  3. ossrh リポジトリに公開するには、mvn --batch-mode deploy コマンドを実行します。 MAVEN_USERNAME 環境変数には OSSRH_USERNAME シークレットの内容が設定され、MAVEN_PASSWORD 環境変数には OSSRH_TOKEN シークレットの内容が設定されます。

  4. 2 回目の setup-java の呼び出しを行います。 これにより、GitHub Packages の Maven settings.xml ファイルが自動的に構成されます。

  5. mvn --batch-mode deploy コマンドを実行して、GitHub Packages に公開します。 GITHUB_TOKEN 環境変数には、GITHUB_TOKEN シークレットの内容が設定されます。 permissions キーには、GITHUB_TOKEN に付与されているアクセス権を指定します。

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