【小ネタ】JavaScript(TypeScript)で作成されたGitHub Actionsのアクションをローカルで実行する時のinputsの渡し方

GitHub Actionsって色々な方が公開してくれていて、便利なものも非常に多いですよね!「あれ?なんかうまく動かないぞ」という時にサクッと自分のローカル環境で動作確認・デバッグするためのinputsの渡し方について書いてみました!
2023.03.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。

みなさん、GitHub Actionsをご利用されていますか?

GitHubに組み込まれていて、無料で利用できる時間もかなりあるので利用されている方も多いのではないでしょうか?

JavaScript(TypeScript)で実装でき、意外と自分で実装する敷居も低そうです。

先日自作ではないアクションを使わせていただいていた時に予期せぬエラーが表示され、ローカル環境でJavaScriptを実行して動作を確認したくなりました。

その際、以下のようにactions.ymlにてinputsが定義されていて、「あれ?どうやってこのinputsを渡せば良いんだ?」となったため、その時の解決策を書きたいと思います!

こんなやつですね。

action.yml

name: 'Sample Action'
description: 'hogehoge'
author: 'sample'
inputs:
  # ↓これどうやって渡せば良いの?
  USER_ID:
    required: true
    description: 'your User_ID'
runs:
  using: 'node16'
  main: 'dist/index.js'

先に結論

手元の環境でコードの動作を確認するには、以下のようにINPUTS_という接頭辞を付与して環境変数を与えることで、inputsとして値を渡すことができます。

今回のUSER_IDの場合INPUT_USER_IDという環境変数でテストできます。以下のように実行できます。

INPUT_USER_ID=bun913 node dist/index.js

上記のように実行することで、inputsから値を渡された時と同様にコードを動作させることができます。

参考: GitHub Actions のメタデータ構文 - GitHub Docs

実際に試してみた

上記でも記載したドキュメント(GitHub Actions のメタデータ構文 - GitHub Docs)には、以下のような記載があります。

ワークフロー ファイル内で入力を指定するか、既定の入力値を使用すると、GitHub により、その入力に対して、INPUT_ という名前の環境変数が作成されます。

GitHub Actionsによりコードが実行される際には、inputsのそれぞれの値が環境変数として与えられるようですので、ローカルで実行する時には同じように環境変数を用意してやればよさそうです。

以下のようにTypeScriptコードを準備します。

src/main.ts

import * as core from '@actions/core'

async function run(): Promise<void> {
  try {
    // inputsから値を取得する関数
    const userID = core.getInput('USER_ID')
    console.log(userID);
  } catch (error) {
    if (error instanceof Error) core.setFailed(error)
  }
}

run()

また、action.ymlも以下のように準備してUSER_IDというinputsを必須としてみます。

action.yml

name: 'Sample Action'
description: 'hogehoge'
author: 'sample'
inputs:
  USER_ID:
    required: true
    description: 'your User_ID'
runs:
  using: 'node16'
  main: 'dist/index.js'

以下のようにしてコードを実行してみます。

INPUT_USER_ID=bunbun913 ts-node src/main.ts

以下のように出力されます。 しっかりinputsとして値を取れていますね。

> bunbun913

また、ドキュメントには以下のように記載されています。

作成された環境変数では、入力名を大文字に変換し、空白を _ 文字に置き換えます。 たとえば、ワークフローで num-octocats および octocat-eye-color 入力が定義されている場合は、アクション コードで、INPUT_NUM-OCTOCATS および INPUT_OCTOCAT-EYE-COLOR 環境変数を使用して入力の値を読み取ることができます。

user-id のようなinputでもINPUT_USER_IDという環境変数として展開するということでしょうか。

今度はaction.ymlを少し変更してみます。

name: 'Sample Action'
description: 'hogehoge'
author: 'sample'
inputs:
  # user-idにしてみた
  user-id:
    required: true
    description: 'your User_ID'
runs:
  using: 'node16'
  main: 'dist/index.js'

また同じように実行してみます。

INPUT_USER_ID=daidai ts-node src/main.ts

以下のように出力を確認できます。

> daidai

想定通り値を取得できました!

これで他の方が作成したアクションでも、サクッとデバッグ・動作確認できるようになりましたね!

ぜひ皆さんも「んっ?」と思ったら、ローカルでアクションを動かして遊んでみてください!