GitHub Actions Manager(GAMA) を使って workflow_dispatch.inputs の個数制限を回避する
はじめに
GitHub Actions Manager (GAMA) は GitHub Actions の Workflow の一覧をターミナル上に表示したり、ターミナルから Workflow を直接実行したりできる TUI ツールです。
本記事ではまず GAMA の紹介させて頂き、その後 GitHub Actions の workflow_dispatch.inputs の個数制限を GAMA を使って回避する方法を紹介させて頂きます。
セットアップ
ここでは Docker による実行を前提としたセットアップ方法をご説明いたします。
Personal Access Token の生成方法
まず、必要最低限の Permission を持つ Personal Access Token を生成します。
- Fine-grained Token に移動し、「Generate new token」を選択。
- 以下のように適宜項目を入力し、ページ下部の「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]。
デフォルトでは 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]。
また、検索にも対応しているため Repository 数が多くて探すのが大変なときなどに便利そうです。
対象の Workflow を選択する
Workflow タブに切り替え、実行対象の Workflow を選択します(カーソルを合わせます)。
Trigger する
Trigger タブに切り替えると、inputs で定義したパラメーターの一覧が表示されます。
これらのパラメーターは GitHub のブラウザで実行するときと同様に default の値を上書きできます。
そして tab キーを押すと Trigger ボタンがオレンジ色へ代わり選択状態になります。
この状態で Enter キーを押すと Workflow が実行されます。
実行結果のログは GAMA 上では確認できないため、GitHub をブラウザで開いて確認します。
以上より 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 も実行できないことを確認できます。
ちなみに 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 個定義したかのように表示されます。
それぞれ普通に inputs を定義した時と同様に編集できます。
この Workflow を GAMA から Trigger し、結果を GitHub 上で確認すると正常にパラメーターが渡っていることを確認できます。
以上により、GAMA を用いれば workflow_dispatch.inputs の個数制限を回避できることを確認できました。
まとめ
本記事では GAMA の基本的なセットアップと使用方法と、GAMA を用いることで workflow_dispatch.inputs の個数制限を回避できることを解説しました。
workflow_dispatch.inputs の個数制限に関しては以下のような方針で何とか GitHub 側に個数制限を緩和してもらうまで耐える、というのが最善策なのではないかと私は考えております。
- グループ化可能な inputs をグループ化して外部ファイルに切り出して inputs の個数を 10 個以内に収める。
- 1 を行っても 10 個以内に収まらない Workflow に関しては GAMA などのツールを使って Trigger する(という運用にする)。
以上となります。ここまで読んで頂きありがとうございました。
Discussion
すごくいい、ありがとう