というのを作ったのですが、もっといい方法ないんですかね?
- 以下を
.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内部においておき、ローカルでも直接実行可能にする、などの工夫もあるかも