おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

jOpenDocumentを2021年にリブートしてみる その4:GitHub ActionsでJDKを振って自動テスト

前回の記事はこちら。

naruoga.hatenablog.com

やはり2021年にもなって、手元でテスト回したりするのは犯罪でしょう。普通にpushしたりPull-Req作ったりしたらビルドのチェックとテストぐらいはしたい。

ということで、恥ずかしながら今まで使ったことがないGitHub Actionsを使ってみることにしました。

とりあえずActions登録

今更なのですがQuick Startを読みます。

docs.github.com

で、実は今やってる作業は締め切りがある話で、めちゃくちゃ締め切り迫ってるので、真面目に調べてる暇ない!って感じで、 こういう付け焼刃ホントよくないんですけど、このリポジトリにサンプルがいっぱいあるよってことで即見に行きました。

github.com

はいはい、顧客が本当に必要になったものありました。Mavenでビルドするための情報。

github.com

さくさくパクりまして、 .github/workflows/mvn-build-actions.yml というファイルをこんな風に書きました*1

name: Java CI with Maven

on:
  push:
    branches: [ $default-branch ]
  pull_request:
    branches: [ $default-branch ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Build with Maven
      run: mvn -B package --file pom.xml

で、こいつを master ブランチに入れて、push時のトリガを強制的にかけるために

touch foobar
git add foobar
git commit -m "GitHub Actions test"
git push

とかやったんですが動かない……なんぞ? なんかスキーマの書き間違い? でもサンプルのコピーだしなあ。

Actionsがトリガされない問題のチェック

Actionsの画面を見ると、手動実行のUIっぽい奴も特に存在しない……ううむ。

これは調べてみたら、

docs.github.com

ちゃんと答えが書いてあって、 workflow_dispatch ってトリガを追加すればいいらしいですね。で、こんな感じにした:

on:
  workflow_dispatch:
  push:
    branches: [ $default-branch ]
  pull_request:
    branches: [ $default-branch ]

ら、手動実行のボタンが出てきました。よしよし。ということはスキーマが全然違ってて認識できてないみたいなことはないらしい。

やれやれということで手動で実行してみたら、一回目は

Error:  Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project jOpenDocunentNg: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test failed: Plugin org.apache.maven.plugins:maven-surefire-plugin:2.12.4 or one of its dependencies could not be resolved: Could not transfer artifact org.apache.maven.shared:maven-common-artifact-filters:jar:1.3 from/to central (https://repo.maven.apache.org/maven2): transfer failed for https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/1.3/maven-common-artifact-filters-1.3.jar: Connection reset -> [Help 1]

とかなんとか言われて、えっ、手元ではビルドできてるんだけどな……なんでや……ってなったのですが、 ダメモトでもっかい再実行したらうまく行って、あとはずっと成功してます。 なんじゃそりゃ……と思いますが、まあ、いいでしょう。

それとは別にいくつかのサンプル見たら、そもそも push とか pull_requestbranch 指定してないのが普通っぽいので、それを取り除いて

on:
  workflow_dispatch:
  push:
  pull_request:

こうしたら、普通に push した場合でもActionsがキックされるようになりました。めでたしめでたし。

複数のJDKでビルドする

こういうときってジョブを割るのがいいのかActionを割るのがいいのか、たぶんちゃんとどこかにどうすればいいってプラクティスがあるんでしょうけど、 前述のように時間がない中付け焼刃でやってるので、雑にActionを割りました。 こういうときも共通部分をどこかに記述して差分(今回の場合はJDKのバージョン)だけを記述する方法が絶対あると思うのですが、 それはあとで考えるとして、いったんはJDK11側のファイルはこんな感じにしました。

name: Build with JDK11

on:
  workflow_dispatch:
  push:
  pull_request:

jobs:
  build-on-jdk11:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '11'
      - name: Build with Maven
        run: mvn -B package --file pom.xml

JDK8のファイルは11って書いてあるところが8ってなってるだけです……お恥ずかしい。

まあでも、いちおうこうやって二つ並んで、テストがそれぞれ走るようになりました。よかったよかった。

f:id:naruoga:20210716182138p:plain
JDK8とJDK11の両方でCIできるようになった

テストレポートがGitHubの画面から見たい

ここまででまあ一応「pushやPRのたびに自動テストをする」目的は達したんですが、Jenkins + JUnit プラグインを使ってた人間としてはやっぱり非常に寂しい。 ダッシュボードの上からテスト結果が見たいなあと思って、雑にググったらこういうプラグインがヒットしました。

github.com

で、各yamlファイルにこんな感じで書いてみました。

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '11'
      - name: Build with Maven
        run: mvn -B package --file pom.xml
      - name: Publish Test Report
        if: ${{ always() }}
        uses: scacap/action-surefire-report@v1
        with:
          check_name: JDK11 result

結果は……ちょっと期待と違って、

f:id:naruoga:20210716182649p:plain
片方のActionに両方の結果が出ちゃう

こんなふうに、片方のActionに両方の結果が出ちゃってます。中身もこんな感じで、ちょっと寂しい。

f:id:naruoga:20210716182822p:plain
履歴とかはなくてその時の結果の数しか見られない

Failしたときの結果も見てみたいけど、このプラグインの設定をもっと詰めるか、ほかのプラグインを探すかも含め、後日ですねー。

READMEにバッジをはる

つまらないことですがCIの結果をREADMEにバッジとして貼ると、なんか今風じゃないですか。ので貼ることにしました。

それぞれのActionの画面の右上の「…」ボタンを押して、「Create status badge」を押すと、

f:id:naruoga:20210716183133p:plain
メニューからバッジ作成

こんなダイアログが出てきて、README貼り付け用Markdownスニペットが得られます。

f:id:naruoga:20210716183252p:plain
バッジのMarkdown記法が得られる

これをREADMEにぺったんすると、

f:id:naruoga:20210716184021p:plain
バッジが並んで今風(そうか?

これでなんかモダンな開発をしているような雰囲気を醸し出すことができた……かな?

まあそんなわけで、まだまだやり残したことはありますが(というかまだ目的全然果たせてないですが)今回の短期集中連載はここまで。

今後の宿題としては:

  • XMLのValidatorをちゃんと動かす(最優先)
  • マトモなサンプルでちゃんと動くかを確認する(具体的には私の所属先のツール)
  • テストをきれいに直す
  • 会社名義でMaven Centralにpublishする
  • ODF 1.3対応をする
  • 下回り(ODF操作部分)を独自実装ではなくODF Toolkitに乗り換え

あたりかなー。協力者も募集ですよ。

*1:今回、JAR配布の予定はないので -B test でも十分なんですけど、まあ、もしかしたらするかもしれないし。