Open21

Kesin11/actions-timeline を使ってみる

Futa HirakobaFuta Hirakoba

korosuke613/homepage-2nd に導入

https://github.com/korosuke613/homepage-2nd

Futa HirakobaFuta Hirakoba

ほぇー
独立したジョブで 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

Futa HirakobaFuta Hirakoba

↑ジョブを分けるとランナーの利用時間が +1 分は間違いなくかかってしまうが、そこはしょうがない

Futa HirakobaFuta Hirakoba

needsに全ジョブ羅列するやつ、copilot くんがいい感じに補完してくれて良い

Futa HirakobaFuta Hirakoba
  • with.github-tokenはデフォだと GITHUB_TOKEN を読むっぽいので特に設定しない。
  • permissions.actions: readがないとダメなパターンがあるっぽい。別にあっても良いので最初からつけとく
Futa HirakobaFuta Hirakoba
View raw markdown ボタンでマークダウン取れるよ
```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
```
Futa HirakobaFuta Hirakoba

step summary をすでに使っているジョブ内で実行したら普通に追記された

Futa HirakobaFuta Hirakoba

ジョブ名が長くなると重なっちゃう問題はまあしょうがないか

issue 立てるだけ立ててみよう

Futa HirakobaFuta Hirakoba

あー

reusable workflow 内と親の workflow の二箇所で呼び出されるから二重に図ができてしまう
これはどっちかと言うと actions というかワークフローの組み立て方の問題な気もする

Futa HirakobaFuta Hirakoba

うーむ、これで実行されちゃったな
なんで

      - 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
Futa HirakobaFuta Hirakoba

なるほど。

その中に、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)

https://qiita.com/ou-mori/items/9ad7ec2dcb2ad2393a98#やり方

github.event_name もあるので、こちらでも分岐できないか試してみましたが、workflowB を直接実行した場合も、workflowA から実行した場合も、workflow_dispatch と同じ値になっており、分岐に利用できませんでした。

やっぱりか

Futa HirakobaFuta Hirakoba

こういう図があると色々見えてきていいね。
多くの場合依存関係のインストールが実行時間の大半を占めてる。
ボトルネックがわかるのはいいね