GithubActionsを利用してJavaアプリのテストを自動化する

`GithubActions`を使ってGithub上でリソースを管理しているJavaアプリのテストを自動化してみる。
今回はGithubActionsの触りということで、簡単なUnitテストのみやってみる。

## 初期状態

Githubの以下の構成からスタート。

```
RepositoryRoot
  /SampleJavaApp(EclipseJavaプロジェクト)
      /src/main/java
          Sample.java
      /src/test/java
          SampleTest.java
      /gradle/wrapper
          gradle-wrapper.jar
          gradle-wrapper.properties
      build.gradle
      gradlew
      gradlew.bat
```

Gitリポジトリの下にJavaアプリリソースを管理するEclipseプロジェクトフォルダがある感じ。

`main`ブランチから派生したブランチを作成し、
派生ブランチで以下の編集を行う。

## ワークフロー定義を作成

リポジトリ直下に以下のファイルを作成

```
.github/workflows/JavaTest.yml
```

YAMLのファイル名はなんでもいい。
`JavaTest.yml`の中身は以下の通り。

```yaml
name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
    
permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    - uses: actions/checkout@v3

    # アプリに合わせたJDKバージョンを指定
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: chmod gradlew
      working-directory: ./SampleJavaApp
      run: chmod +x gradlew

    - name: build and test application
      working-directory: ./SampleJavaApp
      run: ./gradlew build

```

EclipseJavaプロジェクト配下のgredrewを実行する場合は、
`working-directory`でEclipseJavaプロジェクトフォルダパスを指定する。
(gradlew実行の前に、`chmod +x gradlew`を事前にやっとかないと動かなかった。)

上記を追加したGithubリポジトリは下記。

```
RepositoryRoot
  /.github/workflows
      JavaTest.yml　★これを追加
  /SampleJavaApp(EclipseJavaプロジェクト)
      /src/main/java
          Sample.java
      /src/test/java
          SampleTest.java
      /gradle/wrapper
          gradle-wrapper.jar
          gradle-wrapper.properties
      build.gradle
      gradlew
      gradlew.bat
```

## GithubにPUSH、ワークフローを確認

`.github/workflows/JavaTest.yml`を追加した状態でコミット、GithubにPUSH。
すると、PRの画面に以下のような画面表示になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/9bfdede2-e0ba-1efc-9744-c96a6ecee512.png)

テスト結果も含めて、すべて正常に処理が完了すると以下の表示に変わる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/0ba2f34d-c262-8437-935c-e84a0de8a515.png)

テスト失敗、もしくはワークフロー上でなんらかの失敗が発生すると以下の表示となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/4be3c478-8c91-84f3-9caa-abb1cfc5d7b3.png)

ワークフローの実行状態を見たいときは`Checksタブ`か`Details`リンクをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/440ccd22-bd15-2d09-7ee1-02af0f38835b.png)

すると以下のような画面が表示される。
右側の背景が黒い画面で各ジョブの実行時の標準出力内容を展開表示できる。
✖となっている個所がワークフローで失敗した個所なので、ここをクリックして展開して原因などを調べる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/4b045568-902a-a58b-a33d-264394e56006.png)

## テスト結果レポートを保存する設定を追加

コンソールに表示された内容だけだと、テスト結果の内容が分かり辛いので、
ワークフロー定義ファイルにGradleテスト結果レポートを保存・取得できる設定を追加。

```yaml
name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
    
permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    - uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: chmod gradlew
      working-directory: ./SampleJavaApp
      run: chmod +x gradlew

    - name: build and test application
      working-directory: ./SampleJavaApp
      run: ./gradlew build

    # ★以下の設定を追加
    - name: save test reports as artifact
      uses: actions/upload-artifact@v2
      if: always()
      with:
        name: test-reports
        path: SampleJavaApp/build/reports/tests/test
```

上記の`upload-artifactアクション`でワークフローの成果物を保存できる。
`if: always()`が無いとテストが失敗したときにワークフローが停止してレポート作成のステップが行われないので注意。

上記をPUSH後に`Actionsタブ`の間近のワークフロー実行結果をクリック。
ワークフロー実行結果ページの`Artifacts`のところからテスト結果レポートがDLできる

- Actionsタブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/5e53c7e0-faa0-3d46-ae90-6c3abaab2481.png)

- ワークフロー実行結果ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/d0196292-aa84-bdc9-d021-9cf80fb09022.png)

- テスト結果レポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/c85724fa-14b4-d4ce-2642-09a14a4b41b5.png)
※上記テスト結果レポートはzipファイルでダウンロードされる

とりあえずGithubActionsでJavaアプリテストするだけならさっくりできた。
`chmod gradlew`と`gredrewの実行`は同じステップで書けたかも。

今回使ったコードは下記
https://github.com/suganury/Sample