見出し画像

CircleCIでAllureレポートのhistoryにレポートURLを含めたい

テスト自動化アーキテクトの森川です。
本日はニッチな自動テストに関するTipsをお送りします。
CircleCI上で自動テストのレポートツールAllureを利用する際のTipsです。

Allure Framework


環境

・Java: AdoptOpenJDK1.8.232
・Gradle4.x
・Gradle Plugin : allure-plugin
・Junit5.x

問題

導入しやすく見やすいレポーティングができるAllure ReportはCircleCIでも利用できてOrbsも公開されています。

CircleCI Developer Hub - ayte/allure

ただ、このままでは過去ビルドのレポートが見れません。見るようにするにはひと手間が必要でした。
こちらについてはエントリー記事がありますので今回は触れません。

参考:自動テストのレポートツールAllure ReportのTips少々|SHIFT Group 技術ブログ|note

これで、過去の履歴が見えるようになりました。

でも便利になると更に欲が出てくるのが人間というものです。

実はこの状態では単に過去の実行結果がリストされているだけでリンクされていないため、過去レポートを見るにはCIのダッシュボードから辿ることになります。ご存知のとおりダッシュボードからArtifactsのページへの操作はとても面倒で萎えます。

そこで改善です。

履歴リストに過去レポートへ直接リンクしたい

過去レポートにさっとアクセスできるようにしてみましょう。

先人の知恵ということでGithub Actionsの「allure-report-action」を参考にさせていただきます。

executor.jsonにレポートURLをふくめて書き出して「allure-results」に置けば、よしなにしてくれるようです。

allure-report-action/entrypoint.sh #L47 / simple-elf/allure-report-action

CircleCIのconfig.ymlを書いてみました。

# (一部略)
jobs:
  test-example:
    executor:
      name: default
    steps: 
      - checkout
      - run:
          name: テスト実行
          command: |
            ./gradlew clean test MyTestClass
            mkdir -p build/reports/allure-report
            echo "" > build/reports/allure-report/index.html
      - store_artifacts:
          name: 仮ファイルを保存
          path: ~/repo/build/reports/allure-report/index.html
          destination: allure-report/index.html
      - run:
          name: executor.json生成
          command: |
            echo "executor.json生成"
            REPORT_URL=$(curl https://circleci.com/api/v1.1/project/github/${CIRCLE_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_BUILD_NUM}/artifacts -H "Circle-Token: ${API_TOKEN}" | grep -o 'https://[^"]*index\.html')            
            echo '{"name":"CircleCI","type":"circleci","reportName":"Test Report",' > executor.json
            echo "\"url\":\"${CIRCLE_REPOSITORY_URL}\"," >> executor.json
            echo "\"reportUrl\":\"${REPORT_URL}\"," >> executor.json
            echo "\"buildUrl\":\"${CIRCLE_BUILD_URL}\"," >> executor.json
            echo "\"buildName\":\"CircleCI Build${CIRCLE_BRANCH} #${CIRCLE_BUILD_NUM}\"," >> executor.json
            echo "\"Job Name\":\"${CIRCLE_JOB}\"," >> executor.json
            echo "\"Build Number\":\"${CIRCLE_BUILD_NUM}\"}" >> executor.json
            mv executor.json ./build/allure-results/            
      - run:
          name: レポート生成
          command: |
            echo "過去レポートダウンロード"
            mkdir -p build/allure-results/history
            cd build/allure-results/history
            curl -H "Circle-Token: $API_TOKEN" \
            https://circleci.com/api/v1.1/project/github/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_PREVIOUS_BUILD_NUM}/artifacts \
               | grep -o 'https://[^"]*history[^"]*\.json' \
               | wget --verbose --header "Circle-Token: $API_TOKEN" --input-file - || true
               
            echo "レポート生成"
            cd ~/repo
            ./gradlew downloadAllure
            chmod 775 ./.allure/allure-*/bin/allure
            ./.allure/allure-*/bin/allure generate build/allure-results -o /build/reports/allure-report
      - store_artifacts:
          name: レポート保存
          path: ~/repo/build/reports/allure-report
          destination: allure-report

それでは、処理の流れを見てみましょう。

テスト実行

・gradleでテスト実行をしています。特に変わったことはしていません

echo "" > build/reports/allure-report/index.html

・仮ファイルを出力しています(理由は後述)

仮ファイルを保存

・成果物のURLを取得するために仮ファイルをstore_artifactsで保管しています

https://{ビルド番号}-{謎の番号}-gh.circle-artifacts.com/0/path_to_artifacts

ArtifactのURLは上記のように謎の番号が含まれます。

この番号はGitHub(またはBitBucket)側で持っているリポジトリのIDらしいのですが、これを取ってくるよりも成果物をアップロードしてURLを取ってきたほうが早いよね、と思いました。

executor.json生成

・CircleCIのAPIからArtifactsのURLを取ってきてexecutor.jsonを書いてbuild/allure-resultsに置きます

・Jsonのバリデーションが辛いのでローカルでこの部分だけ叩いてチェックすることをお薦めします

レポート生成

・ふたたびAPIで前回のビルドから過去分のレポート情報を取ってきて「allure-results/history」に突っ込んでやります
・レポートを生成します

./gradlew downloadAllure # 👈 ダウンロードのみにする
#./gradlew allureReport # 👈これはうまくいかない  

このときgradleプラグインのallureReportタスクで生成するとexecutor情報が上書きされるようなのでダウンロードだけにしています。

./.allure/allure-*/bin/allure generate build/allure-results -o /build/reports/allure-report

Allureコマンドラインでレポートを生成しています。

Allure Framework #Commandline

最後にstore_artifactsでレポートを成果物として保管しておしまいです。

ご覧の通り、リンクになりましたね。

やってみた感想など

これで過去レポートの閲覧が少し楽になりました。
原因調査のときにもちょっとした助けになることでしょう。
レポートにビルド画面のリンクが表示されるのは地味に便利でした。そして、レポートのURLはそのままSlack通知等に利用できそうですね。

パイプライン作成の「あるある」

Jsonのバリデーションや、相対パスの記述ミスなどで、失敗回数が膨れ上がります。作業効率化のネタはいくつか抑えておいたほうが良さそうです。

パイプライン作成時に心がけたいTips

・CLIバリデータでYamlの記述ミスをチェック
  CircleCI のローカル CLI の使用 - CircleCI

・setコマンドでデバッグ

・挙動不明の場合はRerun For SSHで中に入って調べる

参考

_________________________________

執筆者プロフィール:森川 知雄
中堅SIerでテスト管理と業務ツール、テスト自動化ツール開発を12年経験。
SHIFTでは、GUIテストの自動化ツールRacine(ラシーヌ)の開発を担当。
GUIテストに限らず、なんでも自動化することを好むが、ルンバが掃除しているところを眺めるのは好まないタイプ。
さまざま案件で自動化、効率化によるお客様への価値創出を日々模索している。2021年からは技術イベントSHIFT EVOLVEの運営を担当。


【FREE】お役立ち資料ダウンロード

【RECRUIT】

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/