前回の記事はこちら。
やはり2021年にもなって、手元でテスト回したりするのは犯罪でしょう。普通にpushしたりPull-Req作ったりしたらビルドのチェックとテストぐらいはしたい。
ということで、恥ずかしながら今まで使ったことがないGitHub Actionsを使ってみることにしました。
とりあえずActions登録
今更なのですがQuick Startを読みます。
で、実は今やってる作業は締め切りがある話で、めちゃくちゃ締め切り迫ってるので、真面目に調べてる暇ない!って感じで、 こういう付け焼刃ホントよくないんですけど、このリポジトリにサンプルがいっぱいあるよってことで即見に行きました。
はいはい、顧客が本当に必要になったものありました。Mavenでビルドするための情報。
さくさくパクりまして、 .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っぽい奴も特に存在しない……ううむ。
これは調べてみたら、
ちゃんと答えが書いてあって、 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_request
に branch
指定してないのが普通っぽいので、それを取り除いて
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ってなってるだけです……お恥ずかしい。
まあでも、いちおうこうやって二つ並んで、テストがそれぞれ走るようになりました。よかったよかった。
テストレポートがGitHubの画面から見たい
ここまででまあ一応「pushやPRのたびに自動テストをする」目的は達したんですが、Jenkins + JUnit プラグインを使ってた人間としてはやっぱり非常に寂しい。 ダッシュボードの上からテスト結果が見たいなあと思って、雑にググったらこういうプラグインがヒットしました。
で、各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
結果は……ちょっと期待と違って、
こんなふうに、片方のActionに両方の結果が出ちゃってます。中身もこんな感じで、ちょっと寂しい。
Failしたときの結果も見てみたいけど、このプラグインの設定をもっと詰めるか、ほかのプラグインを探すかも含め、後日ですねー。
READMEにバッジをはる
つまらないことですがCIの結果をREADMEにバッジとして貼ると、なんか今風じゃないですか。ので貼ることにしました。
それぞれのActionの画面の右上の「…」ボタンを押して、「Create status badge」を押すと、
こんなダイアログが出てきて、README貼り付け用Markdownスニペットが得られます。
これをREADMEにぺったんすると、
これでなんかモダンな開発をしているような雰囲気を醸し出すことができた……かな?
まあそんなわけで、まだまだやり残したことはありますが(というかまだ目的全然果たせてないですが)今回の短期集中連載はここまで。
今後の宿題としては:
- XMLのValidatorをちゃんと動かす(最優先)
- マトモなサンプルでちゃんと動くかを確認する(具体的には私の所属先のツール)
- テストをきれいに直す
- 会社名義でMaven Centralにpublishする
- ODF 1.3対応をする
- 下回り(ODF操作部分)を独自実装ではなくODF Toolkitに乗り換え
あたりかなー。協力者も募集ですよ。
*1:今回、JAR配布の予定はないので -B test でも十分なんですけど、まあ、もしかしたらするかもしれないし。