9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OSSTechAdvent Calendar 2019

Day 23

GitHub Packages を使いたい

Last updated at Posted at 2019-12-22

はじめに

私は OpenAM コンソーシアム版 OpenAM を開発していますが、残念ながら現状は OpenAM のコード単体ではビルドできない状態になっています。

$ git clone https://github.com/openam-jp/openam.git
$ cd openam
$ mvn clean install
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for jp.openam:openam:14.0.0-SNAPSHOT: Could not find artifact jp.openam:forgerock-parent:pom:2.0.7-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 53, column 13
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project jp.openam:openam:14.0.0-SNAPSHOT (/home/builduser/source/openam/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for jp.openam:openam:14.0.0-SNAPSHOT: Could not find artifact jp.openam:forgerock-parent:pom:2.0.7-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 53, column 13 -> [Help 2]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

OpenAM のビルドには依存している forgerock-XXX 系のライブラリや OpenDJ のライブラリが必要なのです。これらのライブラリ等についても OpenAM コンソーシアムでフォークしていますが、Maven リポジトリで配布していません。そのため、OpenAM のビルドには forgerock-XXX/opendj-XXX を含めたすべての関連コードのビルドが必要です…

というわけで、Maven リポジトリの確保は課題の一つです。そんな中、最近 GitHub Packages というパッケージレジストリのサービスが正式にローンチされたようです。Maven リポジトリとしても使えるようなので、実際につかってみることにします。

GitHub でアクセストークンを取得する

GitHub でリポジトリのページを開き、commitsbranches と並んでいる packages をクリックすると、次のコマンドが提示されます。

<!-- Just a single step: Deploy using a GitHub token -->
$ mvn deploy -Dregistry=https://maven.pkg.github.com/openam-jp -Dtoken=GH_TOKEN

GH_TOKEN には GitHub のアクセストークンを指定するようです。
アクセストークンは https://github.com/settings/tokens で発行できます。今回は GitHub Packages 用の以下の scope を有効にしてみました。

scope 説明
write:packages Upload packages to github package registry
read:packages Download packages from github package registry
delete:packages Delete packages from github package registry

リポジトリのフォーク

現段階では OpenAM コンソーシアムの GitHub Packages を直接操作するわけにはいかないので、自分のリポジトリにフォークしておきます。
URL は https://maven.pkg.github.com/openam-jp から https://maven.pkg.github.com/tsujiguchitky に変わります。

ソースコードのバージョンから SNAPSHOT を消す

GitHub Packages は SNAPSHOT バージョンに対応していません。

Note: GitHub Packages does not support SNAPSHOT versions of Apache Maven. 
Make sure you disable SNAPHOT in your ~/.m2/settings.xml file.

この記事を書いている時点(12/20)では OpenAM コンソーシアムの各リポジトリは SNAPSHOT バージョンになっているのでソースコードを調整しておきます。

diff --git a/pom.xml b/pom.xml
index 5fd640e..0b6080b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>jp.openam</groupId>
     <artifactId>forgerock-parent</artifactId>
-    <version>2.0.7-SNAPSHOT</version>
+    <version>2.0.7</version>
     <packaging>pom</packaging>
     <name>ForgeRock Parent</name>
     <description>Parent POM for ForgeRock projects. Provides default project build configuration.</description>

デプロイ

OpenAM を除く以下のリポジトリに対して mvn deploy を実行します。

  • forgerock-parent
  • forgerock-bom
  • forgerock-build-tools
  • forgerock-i18n-framework
  • forgerock-guice
  • forgerock-guava
  • forgerock-ui
  • forgerock-commons
  • forgerock-persistit
  • forgerock-bloomfilter
  • opendj-sdk
  • opendj

しかし...

$ mvn deploy -Dregistry=https://maven.pkg.github.com/tsujiguchitky -Dtoken=XXX
...
[INFO] --- maven-deploy-plugin:2.8.2:deploy (default-deploy) @ forgerock-parent ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:23 min
[INFO] Finished at: 2019-12-20T06:03:31+00:00
[INFO] Final Memory: 17M/370M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project forgerock-parent: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

GitHub のページで指定されたコマンドを実行してもうまくいきません。そもそも registrytoken というオプションはこれまで見たことないのですが...

Maven の設定ファイル(~/.m2/settings.xml)の準備

困ったので GitHub の公式ドキュメントをのぞいてみます。Configuring Apache Maven for use with GitHub Packages によると GitHub パッケージレジストリへの認証のために settings.xml を作成する手順になっています。

ということで ~/.m2/settings.xml を用意します。まずは認証に必要な情報だけ記載しています。

<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>USERNAME</username>
      <password>TOKEN</password>
    </server>
  </servers>
</settings>

デプロイ (リベンジ)

registrytoken というオプションを排除して、altDeploymentRepository を指定します。値は id::layout::url というフォーマットで指定します。id は settings.xml の認証情報に一致する idurlhttps://maven.pkg.github.com/OWNER/REPOSITORY で指定します。layout は何なんでしょう、とりあえず default としました。

$ mvn deploy -DaltDeploymentRepository=github::default::https://maven.pkg.github.com/tsujiguchitky/forgerock-parent
...
[INFO] --- maven-deploy-plugin:2.8.2:deploy (default-deploy) @ forgerock-parent ---
[INFO] Using alternate deployment repository github::default::https://maven.pkg.github.com/tsujiguchitky/forgerock-parent
Uploading: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/2.0.7/forgerock-parent-2.0.7.pom
Uploaded: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/2.0.7/forgerock-parent-2.0.7.pom (59 KB at 26.8 KB/sec)
Downloading: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/maven-metadata.xml
Uploading: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/maven-metadata.xml
Uploaded: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/maven-metadata.xml (305 B at 0.4 KB/sec)
Uploading: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/2.0.7/forgerock-parent-2.0.7-site.xml
Uploaded: https://maven.pkg.github.com/tsujiguchitky/forgerock-parent/jp/openam/forgerock-parent/2.0.7/forgerock-parent-2.0.7-site.xml (2 KB at 1.4 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.676 s
[INFO] Finished at: 2019-12-20T06:31:46+00:00
[INFO] Final Memory: 16M/359M
[INFO] ------------------------------------------------------------------------

おお、成功した...

成功したリポジトリの GitHub Package を確認すると、確かに表示されています。

parent-package.png

つづけてほかのリポジトリについてもデプロイを続けます...

Maven キャッシュを削除する

デプロイ作業で Maven キャッシュが作成されてしまいました。このままでは動作確認ができないので、関連するキャッシュを削除しておきます。

$ rm -rf ~/.m2/repository/jp/openam

Maven の設定ファイル(~/.m2/settings.xml)の更新

GitHub Packages を利用するには設定ファイルでリポジトリを指定する必要があります。GitHub のドキュメントのように GitHub レジストリを指定します。

<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">

  <activeProfiles>
    <activeProfile>github-packages</activeProfile>
  </activeProfiles>

  <profiles>
    <profile>
      <id>github-packages</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>https://repo1.maven.org/maven2</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
          <id>github</id>
          <name>GitHub Packages</name>
          <url>https://maven.pkg.github.com/tsujiguchitky/forgerock-parent</url>
        </repository>
        <repository>
          <id>oracle-repository</id>
          <name>Oracle Repository</name>
          <url>http://download.oracle.com/maven</url>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>restlet-repository</id>
          <name>Restlet Repository</name>
          <url>http://maven.restlet.com</url>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>github</id>
          <name>GitHub Packages</name>
          <url>https://maven.pkg.github.com/tsujiguchitky/forgerock-parent</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <servers>
    <server>
      <id>github</id>
      <username>USERNAME</username>
      <password>TOKEN</password>
    </server>
  </servers>
</settings>

repository は GitHub のリポジトリ毎に用意する必要があるのかと思っていましたが、いずれか一つで問題無いようです。
それと、プラグインも GitHub レジストリにデプロイしているため、pluginRepository も指定する必要があります。

github-packages プロファイルが有効だと pom.xml などで設定した repository が有効にならないようです。central のほかにも OpenAM の pom.xml で指定している oracle-repositoryrestlet-repository も記載しておく必要があります。

OpenAM を GitHub Packages を使ってビルドする

結論から言ってしまうと、GitHub Packages を使っても OpenAM だけではビルドできませんでした。JavaScript を Maven で扱うために Maven ローカルリポジトリにインストールする仕組みを forgerock-ui/forgerock-ui-external-libs に作ってしまったため、これもビルドする必要があります(いずれ修正しよう...)。

$ mvn clean install -f forgerock-ui/forgerock-ui-external-libs
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:24 min
[INFO] Finished at: 2019-12-20T09:13:26+00:00
[INFO] Final Memory: 15M/374M
[INFO] ------------------------------------------------------------------------
$ mvn clean install -f openam
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:05 min
[INFO] Finished at: 2019-12-20T09:48:05+00:00
[INFO] Final Memory: 354M/2979M
[INFO] ------------------------------------------------------------------------
$ ls -l openam/openam-server/target/*.war
-rw-rw-r--. 1 builduser builduser 115615769 Dec 20 09:46 openam/openam-server/target/OpenAM-14.0.0.war

できたぞー。

その他

  • 費用ですが、公開パッケージについては無料のようです
  • ただし、公開パッケージは削除できません
  • (公開パッケージだから???)デプロイ時もビルド時も、たまに 502 Bad Gateway で失敗することがあります… コマンドをやり直しましょう…

まとめ

GitHub Packages を紹介しました。公開パッケージであってもダウンロードに GitHub のアクセストークンが必要なのがちょっと辛いところですが、簡単にMaven リポジトリを作成することができます。もし、Maven リポジトリを簡単に立てたいと考えている方は使ってみてはいかがでしょうか。

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?