GitHub Actionsで過去に失敗したflakyなtest一覧を雑に集計する

というのを作ったのですが、もっといい方法ないんですかね?

  • 以下を .github/workflows/適当な名前.yml に配置してdefault branchにおいて、あとはworkflow_dispatchでrun
    • お好みでcronとか他のもの追加しても良いかも
  • junit reportの形式でtest結果保存してたりするが、それの上手い取得方法がよくわからなかったので、logを [error]grepするという原始的方法・・・
    • [error] というのはsbtに合わせてるだけなので、他の場合は、他の文字でいい感じにgrepしてください
  • per_page部分その他は、workflow_dispatchのinputにして可変にしていいかも
  • https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-workflow
  • https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#download-workflow-run-logs
  • これ応用すれば flakyなtest 以外の集計にも使えるはずだが、過去のものを遡って集計したいのは、とりあえず flakyなtest が多そう?と思った、というか、それきっかけで作ったので、こういうタイトルにしたが
  • logの保存期間(これ書いてる時点ではたしかデフォルト90日?)を過ぎたものまで取得しようとするとstatus 410がかえってくるなど、細かいエラー処理色々雑なので注意
on:
  workflow_dispatch:
env:
  GH_TOKEN: ${{ github.token }}
jobs:
  run:
    timeout-minutes: 10
    runs-on: ubuntu-latest
    steps:
    - run: |
        gh api \
        -H "Accept: application/vnd.github+json" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        "/repos/${{ github.repository }}/actions/workflows/集計したいyamlの名前.yml/runs?status=failure&per_page=30&branch=集計したいbranch名" > failed_workflows.json
    - run: cat failed_workflows.json | jq ".workflow_runs[].id" > ids.txt
    - run: |
        while read p; do
          echo "${p}"
          gh api \
          -H "Accept: application/vnd.github+json" \
          -H "X-GitHub-Api-Version: 2022-11-28" \
          "/repos/${{ github.repository }}/actions/runs/${p}/logs" > "log_${p}.zip"
          rm -rf tmp
          mkdir tmp
          unzip -qq "log_${p}.zip" -d tmp
          cat "tmp/集計したい具体的なjobに関するlogの名前.txt" | sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g' | grep "\[error\] " || true
        done <ids.txt

集計したい具体的なjobに関するlogの名前.txt の行は、全てのログをgrepするなら以下

  pushd tmp
  for x in *.txt ; do 
    cat "$x" | sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g' | grep "\[error\] " || true
  done
  popd

${{ github.repository }} 部分は、あえて固定にしておいて、1つのshell scriptとしてrepository内部においておき、ローカルでも直接実行可能にする、などの工夫もあるかも