こんにちは。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
想定通り値を取得できました!
これで他の方が作成したアクションでも、サクッとデバッグ・動作確認できるようになりましたね!
ぜひ皆さんも「んっ?」と思ったら、ローカルでアクションを動かして遊んでみてください!