Kesin11/actions-timeline を使ってみる
これ
祝 v1 リリース
korosuke613/homepage-2nd に導入
ほぇー
独立したジョブで needs するのが間違いはなさそうだな
いかんせんジョブ追加した時漏れちゃう可能性は否めないが
If your workflow has many jobs, you should run actions-timeline in the job that takes the most time, or create an independent job for actions-timeline in a last of the workflow.
ワークフローに多くのジョブがある場合、最も時間がかかるジョブでactions-timelineを実行するか、ワークフローの最後にactions-timeline用の独立したジョブを作成する必要があります。
by DeepL
↑ジョブを分けるとランナーの利用時間が +1 分は間違いなくかかってしまうが、そこはしょうがない
needs
に全ジョブ羅列するやつ、copilot くんがいい感じに補完してくれて良い
-
with.github-token
はデフォだとGITHUB_TOKEN
を読むっぽいので特に設定しない。 -
permissions.actions: read
がないとダメなパターンがあるっぽい。別にあっても良いので最初からつけとく
ci: use actions-timeline by korosuke613 · Pull Request #314 · korosuke613/homepage-2nd
```mermaid
gantt
title CI
dateFormat HH:mm:ss
axisFormat %H:%M:%S
section Test [Component]
Waiting for a runner (7s) :active, job0-0, 00:00:01, 7s
Set up job (2s) :job0-1, after job0-0, 2s
Run actions/checkout@v3 (1s) :job0-2, after job0-1, 1s
Run actions/setup-node@v3 (7s) :job0-3, after job0-2, 7s
Install dependencies (35s) :job0-4, after job0-3, 35s
Component testing (6s) :job0-5, after job0-4, 6s
Test Summary (0s) :job0-6, after job0-5, 0s
Post Run actions/setup-node@v3 (0s) :job0-7, after job0-6, 0s
Post Run actions/checkout@v3 (0s) :job0-8, after job0-7, 0s
Complete job (0s) :job0-9, after job0-8, 0s
section Test [E2E]
Waiting for a runner (5s) :active, job1-0, 00:00:02, 5s
Set up job (2s) :job1-1, after job1-0, 2s
Run actions/checkout@v3 (1s) :job1-2, after job1-1, 1s
Run actions/setup-node@v3 (7s) :job1-3, after job1-2, 7s
Install dependencies (35s) :job1-4, after job1-3, 35s
E2E testing (8s) :job1-5, after job1-4, 8s
Test Summary (0s) :job1-6, after job1-5, 0s
Post Run actions/setup-node@v3 (0s) :job1-7, after job1-6, 0s
Post Run actions/checkout@v3 (0s) :job1-8, after job1-7, 0s
Complete job (0s) :job1-9, after job1-8, 0s
section lint
Waiting for a runner (7s) :active, job2-0, 00:00:02, 7s
Set up job (2s) :job2-1, after job2-0, 2s
Run actions/checkout@v3 (2s) :job2-2, after job2-1, 2s
Run actions/setup-node@v3 (7s) :job2-3, after job2-2, 7s
Install dependencies (32s) :job2-4, after job2-3, 32s
Run npm run lint (10s) :job2-5, after job2-4, 10s
Post Run actions/setup-node@v3 (0s) :job2-6, after job2-5, 0s
Post Run actions/checkout@v3 (0s) :job2-7, after job2-6, 0s
Complete job (0s) :job2-8, after job2-7, 0s
section build
Waiting for a runner (4s) :active, job3-0, 00:00:03, 4s
Set up job (1s) :job3-1, after job3-0, 1s
Run actions/checkout@v3 (1s) :job3-2, after job3-1, 1s
Run actions/setup-node@v3 (6s) :job3-3, after job3-2, 6s
Install dependencies (30s) :job3-4, after job3-3, 30s
Build (28s) :job3-5, after job3-4, 28s
Post Run actions/setup-node@v3 (0s) :job3-6, after job3-5, 0s
Post Run actions/checkout@v3 (0s) :job3-7, after job3-6, 0s
Complete job (0s) :job3-8, after job3-7, 0s
section tools
Waiting for a runner (5s) :active, job4-0, 00:00:03, 5s
Set up job (1s) :job4-1, after job4-0, 1s
Run actions/checkout@v3 (1s) :job4-2, after job4-1, 1s
Run actions/setup-node@v3 (4s) :job4-3, after job4-2, 4s
Install dependencies (2s) :job4-4, after job4-3, 2s
Dry run update zenn.json (2s) :job4-5, after job4-4, 2s
Dry run update hatena_blog.json (4s) :job4-6, after job4-5, 4s
Post Run actions/setup-node@v3 (0s) :job4-7, after job4-6, 0s
Post Run actions/checkout@v3 (0s) :job4-8, after job4-7, 0s
Complete job (0s) :job4-9, after job4-8, 0s
section Test [Unit]
Waiting for a runner (5s) :active, job5-0, 00:00:03, 5s
Set up job (2s) :job5-1, after job5-0, 2s
Run actions/checkout@v3 (1s) :job5-2, after job5-1, 1s
Run actions/setup-node@v3 (5s) :job5-3, after job5-2, 5s
Install dependencies (36s) :job5-4, after job5-3, 36s
Unit testing (3s) :job5-5, after job5-4, 3s
Test Summary (0s) :job5-6, after job5-5, 0s
Run codecov/codecov-action@v3 (2s) :job5-7, after job5-6, 2s
Post Run actions/setup-node@v3 (0s) :job5-8, after job5-7, 0s
Post Run actions/checkout@v3 (0s) :job5-9, after job5-8, 0s
Complete job (0s) :job5-10, after job5-9, 0s
section actions-timeline
Waiting for a runner (6s) :active, job6-0, 00:01:19, 6s
Set up job (1s) :job6-1, after job6-0, 1s
Run Kesin11/actions-timeline@v1 (1s) :job6-2, after job6-1, 1s
```
Zenn も mermaid 対応してるので、制限内なら描画できるよ
step summary をすでに使っているジョブ内で実行したら普通に追記された
ジョブ名が長くなると重なっちゃう問題はまあしょうがないか
issue 立てるだけ立ててみよう
あー
reusable workflow 内と親の workflow の二箇所で呼び出されるから二重に図ができてしまう
これはどっちかと言うと actions というかワークフローの組み立て方の問題な気もする
自身が呼び出されたワークフローであるかどうかは Context から判別できないか...?
inputs を見る方法はあると思うけども
もしくは REST API 叩くしかない?
いや、github.event_name
見ればいけるか
うーむ、これで実行されちゃったな
なんで
- uses: Kesin11/actions-timeline@v1
if: github.event_name != 'workflow_call'
debug log 見たらイベントが親のイベントである push
になっちゃってるなー
これ仕様なん??
##[debug]..Evaluating NotEqual:
##[debug]....Evaluating Index:
##[debug]......Evaluating github:
##[debug]......=> Object
##[debug]......Evaluating String:
##[debug]......=> 'event_name'
##[debug]....=> 'push'
##[debug]....Evaluating String:
##[debug]....=> 'workflow_call'
##[debug]..=> true
なるほど。
その中に、github.event.workflow というキーが存在します。この値には、workflow のファイルパスが記載されています。
呼び出し方によって呼び出された側のワークフローでは、以下のような値が取得できます。(workflowA から workflowB を呼び出す場合)
- workflowB を直接実行(workflow_dispatch)した場合の github.event.workflow
- workflowB のファイルパス(.github/workflows/workflow-b.yaml)
- workflowA から実行(workflow_call)した場合の github.event.workflow
- workflowA のファイルパス(.github/workflows/workflow-a.yaml)
github.event_name もあるので、こちらでも分岐できないか試してみましたが、workflowB を直接実行した場合も、workflowA から実行した場合も、workflow_dispatch と同じ値になっており、分岐に利用できませんでした。
やっぱりか
勝ち申した
Issue も作ったべ
It will be covered by the figure and reduce visibility, if the job name is too long · Issue #30 · Kesin11/actions-timeline
こういう図があると色々見えてきていいね。
多くの場合依存関係のインストールが実行時間の大半を占めてる。
ボトルネックがわかるのはいいね