【Github】Github Actions ~ timeout-minutes ~

■ はじめに

Github Actions において、
例えば、別処理結果を待つのにシェルで無限ループする箇所があるのだが
これはこれでちょっと怖いので、Timeoutについて調べてみた

目次

【1】Github ActionsでTimeoutを設定するには
【2】利点
【3】timeout-minutes
 1)jobs.<job_id>.steps[*].timeout-minutes
 2)jobs.<job_id>.timeout-minutes
【4】サンプル
【5】使用上の注意
 1)環境変数などを使う場合には fromJSON()が必要

【1】Github ActionsでTimeoutを設定するには

* 「timeout-minutes」で設定する

【2】利点

* 以下のサイトで書かれている

https://qiita.com/chihiro/items/341b579a07fac35fd1d7
https://dev.classmethod.jp/articles/must-set-timeout-on-actions-for-save-cost/

[1] GitHub ホステッド ランナーには使用状況の制限があるが
 Timeoutを設定することにより、そのリソースの枯渇を未然に防ぐことはできる

【3】timeout-minutes

* 以下の2点が用意されている

1)jobs.<job_id>.steps[*].timeout-minutes

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepstimeout-minutes

* Step個別のTimeoutを設定する(分単位)

2)jobs.<job_id>.timeout-minutes

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes

* Job個別のTimeoutを設定する(分単位)

【4】サンプル

name: Sample Githun Actions

on: [push]

jobs:
  job1:
    name: job1
    runs-on: ubuntu-latest
    timeout-minutes: 10 # ★注目★
    steps:
      - name: Hello World
        run: echo "Hello, World"
  job2:
    name: job2
    runs-on: ubuntu-latest
    steps:
      - name: Hi World
        run: echo "Hi, World"
        timeout-minutes: 5 # ★注目★

【5】使用上の注意

1)環境変数などを使う場合には fromJSON()が必要

* 以下「エラーが発生する例」を実行すると、
 エラー「Error: The template is not valid.」が発生する
 => 以下のサイトで書かれているように、fromJSON() が必要
  (以下「解決案」を参照)

https://github.com/orgs/community/discussions/55332

 => 別に timeout-minutes に限ったことではないかもしれないが、、、

エラーが発生する例

name: Sample Githun Actions

on: [push]

env:
  TIMEOUT_MINS: 30

jobs:
  job1:
    name: job1
    runs-on: ubuntu-latest
    timeout-minutes: ${{ env.TIMEOUT_MINS }} # ★エラーメッセージ参照★

エラーメッセージ

Error: An error occurred when attempting to determine the step timeout.
Error: The template is not valid. .github/workflows/xxxx.yml
 (Line: XXX, Col: XXX): unexpected value '30'

解決案

    # 【修正前】
    # timeout-minutes: ${{ env.TIMEOUT_MINS }}

    # 【修正後】
    timeout-minutes: ${{ fromJSON(env.TIMEOUT_MINS) }}

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2023/12/21/155224
Github Actions ~ Artifact ~
https://dk521123.hatenablog.com/entry/2024/02/13/021717