💬

GitHub Actions Manager(GAMA) を使って workflow_dispatch.inputs の個数制限を回避する

2024/04/04に公開

はじめに

GitHub Actions Manager (GAMA) は GitHub Actions の Workflow の一覧をターミナル上に表示したり、ターミナルから Workflow を直接実行したりできる TUI ツールです。

本記事ではまず GAMA の紹介させて頂き、その後 GitHub Actions の workflow_dispatch.inputs の個数制限を GAMA を使って回避する方法を紹介させて頂きます。

セットアップ

ここでは Docker による実行を前提としたセットアップ方法をご説明いたします。

Personal Access Token の生成方法

まず、必要最低限の Permission を持つ Personal Access Token を生成します。

  1. Fine-grained Token に移動し、「Generate new token」を選択。
  2. 以下のように適宜項目を入力し、ページ下部の「Generate token」を選択。
    • 「Repository Access」は「All repositories」または「Only select repositories」を選択。
    • 「Repository Permissions」は「Actions」「Contents」「Workflows」についてそれぞれ以下のように設定。
      • Actions: Read and write
      • Contents: Read-only
      • Workflows: Read and write

GAMA を起動する

以下のコマンドをターミナルで実行します。

docker run --rm -it --env GITHUB_TOKEN="<生成した Personal Access Token>" termkit/gama:latest

以下のような画面に切り替わったら成功です[1]

image1

デフォルトでは shift と左右の矢印キーでタブを切り替えられます。

キー設定は ~/.config/gama/config.yamlにファイルを作成し、以下のように記述することでカスタマイズできるようです。

keys:
  switch_tab_right: shift+right
  switch_tab_left: shift+left
  quit: ctrl+c
  refresh: ctrl+r
  enter: enter
  tab: tab

また、画面下部に操作方法が表示されているため、途中で操作方法が分からなくなって困ることはあまりなさそうです。

GAMA を用いて Workflow を実行してみる

とりあえず GAMA を用いて Workflow を実行してみます。

Workflow を作成する

前準備として以下のような Workflow を作成します。

name: SimpleGamaSandbox
on:
  workflow_dispatch:
    inputs:
      param1:
        type: string
        default: "param1"
        description: "Parameter 1"
      param2:
        type: string
        default: "param2"
        description: "Parameter 2"
      param3:
        type: string
        default: "param3"
        description: "Parameter 3"

jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      - name: Echo parameters
        run: |
          echo "param1: ${{ github.event.inputs.param1 }}"
          echo "param2: ${{ github.event.inputs.param2 }}"
          echo "param3: ${{ github.event.inputs.param3 }}"

Workflow を Trigger する

対象の Repository を選択する

まず Repository タブで対象のリポジトリにカーソルを合わせます[2]

image3

また、検索にも対応しているため Repository 数が多くて探すのが大変なときなどに便利そうです。

image4

対象の Workflow を選択する

Workflow タブに切り替え、実行対象の Workflow を選択します(カーソルを合わせます)。

Trigger する

Trigger タブに切り替えると、inputs で定義したパラメーターの一覧が表示されます。

これらのパラメーターは GitHub のブラウザで実行するときと同様に default の値を上書きできます。

image5

そして tab キーを押すと Trigger ボタンがオレンジ色へ代わり選択状態になります。

image6

この状態で Enter キーを押すと Workflow が実行されます。

実行結果のログは GAMA 上では確認できないため、GitHub をブラウザで開いて確認します。

image7

以上より GAMA を用いてとりあえず Workflow を Trigger できることを確認できました。

workflow_dispatch.inputs の個数制限について

GitHub Actions には「workflow_dispatch.inputs は 10 個までしか定義できない」という大きな制限が存在します。

GitHub Docs にも The maximum number of top-level properties for inputs is 10. と明記されています。

具体的に inputs を 11 個以上定義した場合にどのような現象が発生するのか見てみます。

まず以下のような inputs を 11 個持つ Workflow を作成し、Repository の main ブランチに取り込みます。

name: TooManyInputsWorkflow
on:
  workflow_dispatch:
    inputs:
      param1:
        type: string
        default: "param1"
        description: "Parameter 1"
      param2:
        type: string
        default: "param2"
        description: "Parameter 2"
      param3:
        type: string
        default: "param3"
        description: "Parameter 3"
      param4:
        type: string
        default: "param4"
        description: "Parameter 4"
      param5:
        type: string
        default: "param5"
        description: "Parameter 5"
      param6:
        type: string
        default: "param6"
        description: "Parameter 6"
      param7:
        type: string
        default: "param7"
        description: "Parameter 7"
      param8:
        type: string
        default: "param8"
        description: "Parameter 8"
      param9:
        type: string
        default: "param9"
        description: "Parameter 9"
      param10:
        type: string
        default: "param10"
        description: "Parameter 10"
      param11:
        type: string
        default: "param11"
        description: "Parameter 11"

jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      - name: Echo parameters
        run: |
          echo "param1: ${{ github.event.inputs.param1 }}"
          echo "param2: ${{ github.event.inputs.param2 }}"
          echo "param3: ${{ github.event.inputs.param3 }}"
          echo "param4: ${{ github.event.inputs.param4 }}"
          echo "param5: ${{ github.event.inputs.param5 }}"
          echo "param6: ${{ github.event.inputs.param6 }}"
          echo "param7: ${{ github.event.inputs.param7 }}"
          echo "param8: ${{ github.event.inputs.param8 }}"
          echo "param9: ${{ github.event.inputs.param9 }}"
          echo "param10: ${{ github.event.inputs.param10 }}"
          echo "param11: ${{ github.event.inputs.param11 }}"

すると、GitHub 上で "you may only define up to 10 inputs for a workflow_dispatch event" というエラーが出ており、Workflow も実行できないことを確認できます。

image8

ちなみに workflow_dispatch max inputs from 10 to 25 にて 2 年以上前にこの制限を緩和して欲しいという旨の要望が上がっています。リアクションの多さを見るとやはり多くの方が困っているようです。

GAMA を用いて workflow_dispatch.inputs の個数制限を回避する

workflow_dispatch.inputs の個数制限を回避する方法として「グループ化可能な inputs をグループ化して外部ファイルに切り出すことで inputs の個数を減らして何とか 10 個以内に収める」という方法が考えられます。

しかしこの方法ではグループ不可能な inputs の個数が 11 個以上存在する場合に対応できません。

そこで 上述した Discussion にて GAMA の作者の方が GAMA を用いてこの個数制限を回避する方法を紹介しています。

紹介されている方法を実際に試してみます。まずは以下のような 20 個のキーを持つ JSON の string を default 値として持つ inputs が存在する Workflow を作成し、main ブランチに取り込みます。

name: GamaManyInputsSandbox
on:
  workflow_dispatch:
    inputs:
      parameters:
        description: "JSON Parameters"
        required: true
        default: '{
          "param01": "Paramter 1",
          "param02": "Paramter 2",
          "param03": "Paramter 3",
          "param04": "Paramter 4",
          "param05": "Paramter 5",
          "param06": "Paramter 6",
          "param07": "Paramter 7",
          "param08": "Paramter 8",
          "param09": "Paramter 9",
          "param10": "Paramter 10",
          "param11": "Paramter 11",
          "param12": "Paramter 12",
          "param13": "Paramter 13",
          "param14": "Paramter 14",
          "param15": "Paramter 15",
          "param16": "Paramter 16",
          "param17": "Paramter 17",
          "param18": "Paramter 18",
          "param19": "Paramter 19",
          "param20": "Paramter 20"
          }'

jobs:
  echo:
    runs-on: ubuntu-latest
    steps:
      - name: Echo parameters
        run: |
          echo ${{ fromJson(inputs.parameters).param01 }}
          echo ${{ fromJson(inputs.parameters).param02 }}
          echo ${{ fromJson(inputs.parameters).param03 }}
          echo ${{ fromJson(inputs.parameters).param04 }}
          echo ${{ fromJson(inputs.parameters).param05 }}
          echo ${{ fromJson(inputs.parameters).param06 }}
          echo ${{ fromJson(inputs.parameters).param07 }}
          echo ${{ fromJson(inputs.parameters).param08 }}
          echo ${{ fromJson(inputs.parameters).param09 }}
          echo ${{ fromJson(inputs.parameters).param10 }}
          echo ${{ fromJson(inputs.parameters).param11 }}
          echo ${{ fromJson(inputs.parameters).param12 }}
          echo ${{ fromJson(inputs.parameters).param13 }}
          echo ${{ fromJson(inputs.parameters).param14 }}
          echo ${{ fromJson(inputs.parameters).param15 }}
          echo ${{ fromJson(inputs.parameters).param16 }}
          echo ${{ fromJson(inputs.parameters).param17 }}
          echo ${{ fromJson(inputs.parameters).param18 }}
          echo ${{ fromJson(inputs.parameters).param19 }}
          echo ${{ fromJson(inputs.parameters).param20 }}

この Workflow を GAMA で閲覧するとまるで普通に inputs を 20 個定義したかのように表示されます。

image9

それぞれ普通に inputs を定義した時と同様に編集できます。

image10

この Workflow を GAMA から Trigger し、結果を GitHub 上で確認すると正常にパラメーターが渡っていることを確認できます。

image11

以上により、GAMA を用いれば workflow_dispatch.inputs の個数制限を回避できることを確認できました。

まとめ

本記事では GAMA の基本的なセットアップと使用方法と、GAMA を用いることで workflow_dispatch.inputs の個数制限を回避できることを解説しました。

workflow_dispatch.inputs の個数制限に関しては以下のような方針で何とか GitHub 側に個数制限を緩和してもらうまで耐える、というのが最善策なのではないかと私は考えております。

  1. グループ化可能な inputs をグループ化して外部ファイルに切り出して inputs の個数を 10 個以内に収める。
  2. 1 を行っても 10 個以内に収まらない Workflow に関しては GAMA などのツールを使って Trigger する(という運用にする)。

以上となります。ここまで読んで頂きありがとうございました。

脚注
  1. もし「Terminal window is too small. Please resize to at least 100x24」と表示された場合はターミナルのサイズを大きくしてみてください。 ↩︎

  2. デフォルトでは上下の矢印キーでカーソルを操作できます。 ↩︎

GitHubで編集を提案

Discussion