【Github】Github Actions ~ 三項演算子 ~

■ はじめに

小ネタ。

https://dk521123.hatenablog.com/entry/2024/05/18/032229

の「案3:条件分岐(真or偽)で切り替える」で
正直どのような文法で切り替えているのか分かってなかったが
色々調べてみて、Github Actions の 三項演算子 だと分かったので
メモっておく

目次

【1】Github Actions の 三項演算子
【2】構文
【3】補足:複雑な条件
 1)条件のネストについて
 2)条件部分の複数指定について

【1】Github Actions の 三項演算子

* 公式ドキュメントより

https://docs.github.com/ja/actions/learn-github-actions/expressions#operators

より抜粋
~~~~~
三項演算子を使うと、
あり得るオプションごとに個別に if-else ブロックを書かなくても、
条件に基づいて環境変数の値を動的に設定できます
~~~~~
 => 「あり得るオプションごと」なので、runs-on でも使えた

【2】構文

      ${{
        【条件】
          && 【条件が真の場合】
          || 【条件が偽の場合】
      }}

https://docs.github.com/ja/actions/learn-github-actions/expressions#example

# より抜粋
env:
  MY_ENV_VAR: ${{
    github.ref == 'refs/heads/main'
      && 'value_for_main_branch'
      || 'value_for_other_branches' }}

解説 (公式ドキュメントより抜粋)

この例では、三項演算子を使い、
GitHub の参照が refs/heads/main に設定されているかどうかに基づいて、
環境変数 MY_ENV_VAR の値を設定しています。
そうである場合、変数は value_for_main_branch に設定されます。
そうでない場合は、value_for_other_branches に設定されます。
&& の後の最初の値は真値でなければならないことに注意することが重要です。
それ以外の場合、|| の後の値は常に返されます

【3】補足:複雑な条件

1)条件のネストについて

* ネストも可能
 => ただ、可読性が悪くなるが、工夫次第、、、

構文(3通りの場合)

      ${{
        【条件1】
          && 【条件1が真の場合】
          || (【条件2】 && 【条件1が偽で、条件2が真の場合】 || 【それ以外】)
      }}

https://dk521123.hatenablog.com/entry/2024/05/18/032229

# より抜粋
    runs-on: >-
      ${{
        github.ref_name == 'prod'
          && fromJSON('[ "ubuntu-latest" ]')
          || (github.ref_name == 'stage' && fromJSON('["ubuntu-24.04" ]')
          # 4通りなら、、、
          # || (github.ref_name == 'dev' && fromJSON('["ubuntu-24.04" ]')
          || fromJSON('["ubuntu-20.04" ]'))
      }}

2)条件部分の複数指定について

* こちらも 【条件】を () で括れば可能
 => ただ、めちゃめちゃ複雑になる、、、

https://dk521123.hatenablog.com/entry/2024/05/18/032229

# より抜粋
    runs-on: >-
      ${{
        # (【条件1(github.ref_name == 'develop')】 &&(かつ) 【条件2(inputs.env == 'dev')】)
        (github.ref_name == 'develop' && inputs.env == 'dev')
          && fromJSON('[ "ubuntu-20.04" ]')
          || ((github.ref_name != 'develop' && inputs.env == 'dev') && fromJSON('["ubuntu-24.04" ]')
          || fromJSON('["ubuntu-latest" ]'))
      }}

関連記事

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 ~ workflow_run / workflow_call ~
https://dk521123.hatenablog.com/entry/2024/02/14/232546
Github Actions ~ if ~
https://dk521123.hatenablog.com/entry/2024/03/11/000000
Github Actions ~ Self-hosted runners / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/12/18/204119
Github Actions ~ Self-hosted runners / あれこれ編 ~
https://dk521123.hatenablog.com/entry/2024/02/07/002736
Amazon S3AWS CLI
https://dk521123.hatenablog.com/entry/2017/04/01/235355