⛄️

GitHub PackagesへJARをデプロイする

2021/02/11に公開

概要

GitHub PackagesへJARをデプロイする方法を書きます。

基本的なことは次の公式ドキュメントに書かれています。

公式ドキュメントの内容と重なる部分もありますが、ローカルから手動でJARをデプロイする方法とデプロイしたJARを使う方法、それからGitHub Actionsでデプロイする方法を書きます。

とりあえずローカルから手動でデプロイする

手順は次の通りです。

  1. Personal access tokenを作る
  2. ~/.m2/settings.xmlへデプロイ先となるMavenリポジトリの認証情報を書く
  3. pom.xmlへデプロイ先となるMavenリポジトリ情報を書く
  4. デプロイする

1. Personal access tokenを作る

https://github.com/settings/tokens からPersonal access tokenを作ります。
デプロイしたいので、write:packagesスコープにチェックしてください。

2. ~/.m2/settings.xmlへデプロイ先となるMavenリポジトリの認証情報を書く

username要素にはGitHubのアカウント名を、password要素には先ほど作ったPersonal access tokenを記載します(ここではユーザー名はbackpaper0とします)。

<server>
    <id>github</id>
    <username>backpaper0</username>
    <password>※ここにPersonal access tokenを書く</password>
</server>

~/.m2/settings.xmlが無い場合は作成してください。
Mavenのconfディレクトリにあるものをコピーすると良いです。
Mavenのホームディレクトリはmvn --versionすればわかります(どこにあるかわかっていなかった、、、)。

また、Personal access tokenを平文で書きたくない場合はmvn -epで暗号化できます。
詳しくはMaven – Password Encryptionを参照ください。

3. pom.xmlへデプロイ先となるMavenリポジトリ情報を書く

MavenリポジトリのURLはユーザー名、Gitリポジトリ名によって変わります。
ここではユーザー名はbackpaper0、Gitリポジトリ名はdemoとします(GitHubにはdemoというGitリポジトリを作成していることとします)。

<distributionManagement>
    <repository>
        <id>github</id>
        <name>GitHub OWNER Apache Maven Packages</name>
        <url>https://maven.pkg.github.com/backpaper0/demo</url>
    </repository>
</distributionManagement>

4. デプロイする

mvnコマンドでデプロイできます。

mvn deploy

ソースコードとJavadocもデプロイする

ちなみに、pom.xmlに次のようにmaven-source-pluginmaven-javadoc-pluginの設定をすればソースコードのJARとJavadocのJARもデプロイできます。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

デプロイしたJARを使用する

手順は次の通りです。

  1. pom.xmlへMavenリポジトリ情報を書く
  2. dependencyを追加する

ちなみに、認証は必要なのでPersonal access tokenと~/.m2/settings.xmlの準備をしていない場合はしておいてください。
なお、デプロイするのではなく参照するだけならPersonal access tokenのスコープはread:packagesで大丈夫です。

1. pom.xmlへMavenリポジトリ情報を書く

Mavenリポジトリの情報はデプロイの際に書いたものと同じです。
SNAPSHOTバージョンも使用する場合はsnapshots要素内のenabled要素へtrueを書いておきましょう。

<repositories>
    <repository>
        <id>github</id>
        <name>GitHub OWNER Apache Maven Packages</name>
        <url>https://maven.pkg.github.com/backpaper0/demo</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

2. dependencyを追加する

あとはpom.xmlへデプロイしたJARの情報を書いたdependency要素を追加すると使えます。

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

GitHub Actionsでデプロイする

手順は次の通りです。

  1. 専用のsettings.xmlを用意する
  2. ワークフローのYAMLを書く

1. 専用のsettings.xmlを用意する

GitHub Actionsでデプロイする場合、ローカルの~/.m2/settings.xmlは使えないためsettings.xmlもGitリポジトリへ追加します。

Personal access tokenを書くわけにはいかないので、環境変数から読み取るようにします。
ここでは環境変数GITHUB_TOKENとします。

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>github</id>
            <username>backpaper0</username>
            <password>${env.GITHUB_TOKEN}</password>
        </server>
    </servers>
</settings>

2. ワークフローのYAMLを書く

GitHub Actionsで次のコマンドを実行するとデプロイできます。

GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} mvn -B -s settings.xml deploy

ポイントは次の通りです。

  • Personal access tokenをsecretsコンテキストから読み取って環境変数GITHUB_TOKENへセットする(settings.xmlへ渡すため)
  • -sでGitリポジトリへ追加したsettings.xmlを使用する

secrets.GITHUB_TOKENについて詳しくはワークフローで認証するを参照してください。

YAMLファイル全体は次のようになります。

name: Java CI with Maven

on:
  push:
    branches: [ master ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      - name: Cache local Maven repository
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Release Maven package
        run: GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} mvn -B -s settings.xml deploy

以上です。

Discussion