🐙

actions/github-script を TypeScript で書くのが簡単になりました

に公開

actions/github-script とは

actions/github-script とは GitHub Actions のワークフローで GitHub API を呼び出すなど任意のスクリプトを実行できる公式アクションです。
要はなんでもできてしまうため柔軟性が高く、要求に合う既存のアクションが無かったり、セキュリティなど何らかの理由で限られたアクションしか使いたくなかったりといった場面で大変便利です。

https://github.com/actions/github-script

スクリプトは基本的に JavaScript で記述するのですが、コードの保守性やエディタでの補完などを考えるとやはり TypeScript で書きたくなりますよね。それが最近、簡単にできるようになったというお話です。

これまでのやりかた

これまで actions/github-script で TypeScript のコードを実行したい場合、以下のようにトランスパイルをしたり、tsx などの Node.js 上で TypeScript のコードを直接実行するためのライブラリを使ったりする必要がありました。

追加の依存ライブラリなしで TypeScript が実行できるように

actions/github-script@v8 からスクリプトの実行に Node.js v24 が使われるようになりました。つまり --experimental-strip-types オプションなしで Type Stripping を使えるようになったということです。

https://github.com/actions/github-script/releases/tag/v8

Type Stripping とは、Node.js 上で直接 TypeScript を実行する機能です。型注釈を単純に削除して実行するため、型チェックや Enum など TypeScript 固有の記法は使えませんが、追加の依存ライブラリなしで手軽に TypeScript を実行することができます。

使用例

試しに、Job summary にテキストを出力するスクリプトを書いてみましょう。

.github/scripts/helloworld.ts
import type * as core from "@actions/core";

type Args = {
  core: typeof core;
};

export async function main({ core }: Args) {
  await core.summary
    .addHeading("Hello World!")
    .addRaw("This script is written in TypeScript.")
    .write();
}
.github/workflows/helloworld.yaml
name: Hello world

on: push

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5

      - uses: actions/github-script@v8
        with:
          script: |
            const { main } = await import("${{ github.workspace }}/.github/scripts/helloworld.ts");
            await main({ core });

Hello world ワークフローに Job Summary が追加されているスクリーンショット
実行結果

core の型は @actions/core パッケージから取得していますので、型チェックや補完を行うためにはインストールしておく必要があります。
actions/github-script が提供するその他のオブジェクトとその型については以下を参照してください。

https://github.com/actions/github-script?tab=readme-ov-file#this-action

まとめ

TypeScript で書かれたスクリプトを actions/github-script で直接実行することができました。
Node.js の Type Stripping によって実行されているため、型チェックが必要な場合は別途実行する必要がある点に注意してください。

参考

https://github.com/actions/github-script/issues/294#issuecomment-3273626401

Discussion