GithubActionsでMavenプロジェクトのCI

以下の記事の続きで、今回はGithubActionsを使ってみます。
https://qiita.com/kasa_le/items/1ce0d9e34f29e34835cb

# Github Actions

Githubの各リポジトリの、[Actions]タブから設定/閲覧出来ます。

|<img width="925" alt="githubactions.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/9d146f4f-4983-37b8-4b09-c34ce9666d7f.png">|
|:--|


## 特徴

Github専用のCIツールです。
公式のActionももちろんありますが、それらもまたオープンソースで作っていく、というスタンスが、「らしい」ですよね。
ActionはMarketplaceで探すことが出来ます。
https://github.com/marketplace?type=actions

## 料金
publicなリポジトリでは利用制限はありません。
privateなリポジトリなどでは、従量課金制となっていますが、毎月無料範囲があります。
見積もり計算方法などは、こちらが参考になるかと思います。
https://qiita.com/euxn23/items/8cec3a3b8de9e3213424

無料利用であっても、Windows/Ubuntu/macOSが選べるのは非常に便利です。

## 実績

これからという感じですが、なんといってもMicrosoftがついたので、Azure Pipelinesでの知見などもあるでしょうし、今後確実に使われていくと思います。
ただ、逆に、Azure Pipelinesに統合されて消えてしまう可能性もあるかもしれませんよ?:grin:

## 設定

`yml`ファイルにて行います。
プロジェクトのルート直下に、`.github/wrokflows`というディレクトリを作成し、その配下に置きます。

最初に[Actions]タブをクリックすると、様々なテンプレートから選ぶことが出来、最初のコミットは上記のフォルダに対して行ってくれます。

テンプレートは、Mavenビルドは２つ見つかりますが、今回はビルドだけなので、赤枠の方を使いました。

<img width="1175" alt="github_actions_template.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/56b47c13-e2e9-7b7e-278d-de5a1d35f0c7.png">

最終的に目的を達成したymlはこちらになります。

```./github/workflows/maven.yml
Skip to content
Search or jump to…

Pull requests
Issues
Marketplace
Explore
 
@le-kamba 
le-kamba
/
JerseySample
1
00
 Code Issues 0 Pull requests 0 Actions Projects 0 Wiki Security Insights Settings
Update maven.yml
feature/for_github_actions @le-kamba  8ba108d
 
Java CI with Maven
on: push
 
Java CI with Maven
This run
Workflow file
.github/workflows/maven.yml
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven

name: Java CI with Maven

on:
  push:
    branches: [ feature/for_github_actions ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: '11.0.6'
    - name: Build and Test with Maven
      run: mvn clean install
    - name: Archive JAR
      if: always()
      uses: actions/upload-artifact@v1
      with: 
        name: repository
        path: repository/target/repository.jar
    - name: Archive WAR
      if: always()
      uses: actions/upload-artifact@v1
      with: 
        name: serverapi
        path: serverapi/target/serverapi.war
    - name: Gather test results
      if: always()
      run: |
        mvn site -DgenerateReports=false -Daggregate=true surefire-report:report-only
        mkdir -p test-results/junit/
        find . -type f -regex ".*/target/surefire-reports/.*xml" -exec cp {} test-results/junit/ \;
    - name: Archive test resuls xml
      if: always()
      uses: actions/upload-artifact@v1
      with: 
        name: test-results
        path: test-results/junit/
    - name: Archive test resuls html
      if: always()
      uses: actions/upload-artifact@v1
      with: 
        name: test-results-html
        path: target/site
```

ステップは見たまんまで他のCIツールとも大きく違わないので割愛しますが、ポイントだけ。

- `Set up JDK 11`ステップ
  - 公式アクションの`setup-java`を使っています。ただし、こちらだとZulu版のOpenJDKが採用されるようです(Zuluは基本有償ですが、Azureから使うと無償だったかで、その関係でしょうか)。AdoptOpenJDK版を作ってくださっている方もいるので、Marketplaceで探してみて使うのも良いでしょう。

- `Gather test results`ステップ
  - `mvn site -DgenerateReports=false -Daggregate=true surefire-report:report-only`
      - JUnitテストレポートをページ上で見られないので(Workflowの成否でテスト失敗があったかどうかはわかりますが)、xmlをダウンロードしてきても人間の目には分かりづらいため、surefire-reportを使って出したhtml版の方も保存するようにしています。
      - `-Daggregate=true`はサブモジュールの結果をまとめるオプションです。
      - `site -DgenerateReports=false`は、CSSファイルやイメージファイルだけを出力させています。
  - `mkdir`以降は、xml形式のJunit結果レポートをまとめてArtifactに上げられるようにするため、フォルダを作ってそちらに全部コピーしているステップです。(後述の通り,
  Artifactに上げる際に、正規表現やワイルドカードが使えないため、一つのディレクトリにまとめています)

**追記 2020/03/25**
~~この書き方だと、テストに失敗があってもビルド成功が報告されてしまうので、他の方法を考えないとダメみたいです。困った・・・~~

**追記2020/03/27**
テストのエラーを検知しつつ、surefireが出すhtmlレポートを出せるようになったので、そのパターンのymlに修正しています。

# 感想

Androidビルドでも触っていて(https://qiita.com/kasa_le/items/5feb953cd50489c30c90 )、馴染みがあったのでこれまでの２つ(AppVeyor, CircleCI)よりは設定を楽に出来ました。
surefireのレポートでは少しハマりましたが。

テスト結果をActionsのページ上で見られると楽なのですがね。今はいちいちダウンロードして解凍してからじゃないと見られないので、それが手間です。

Github Pagesにsurefireの吐き出したhtmlを上げることで可能にならないかなあと思っているのですが、まだ詳しく調査はしていません。

そうそう、Artifactのパスが、CircleCI同様、正規表現やワイルドカードが使えないようで、そのへんは不便ですね。