stenyan[.]dev

JAEN

Jev 向けの CLI を作成し、 GitHub Actions 経由で Pull Request のリスク判定に活用

最近話題の Jev を触ってみようと思って調べていくうちに、どうやら公式で TypeScript と Python 向けの SDK は公開しているものの1、CLIとして直接呼び出す公式ツールは存在しないことに気づいたので一旦作ることにしました。

stefafafan/jev の思想

標準入力から値を受け取って、結果を出力し、 jq コマンドなどを便利に組み合わせられるインターフェースを意識しました。あと、 Go を使っているので、公式の SDK は特に利用していないです。

活用イメージとしてはこんな感じです:

Shell
git diff | jev noul "差分に破壊的変更はありますか?" | jq .

また、 TypeSafe AI の新規受付が閉じていて自分も困っていたのですが、 Cloudflare Workers AI や、 Vercel AI Gateway でも Jev が利用できるらしいので、それらに対応させました。

以下のような感じで、特定の環境変数がセットされていれば対応したプロバイダーが使われたり、 --provider で明示的に指定できるようにしてみました。

Shell
export TYPESAFE_API_KEY=...
git diff | jev --provider typesafe noul "差分に破壊的変更はありますか?" | jq .
Shell
export CLOUDFLARE_API_TOKEN=...
export CLOUDFLARE_ACCOUNT_ID=...
git diff | jev --provider cloudflare noul "差分に破壊的変更はありますか?" | jq .

GitHub Actions でも使いたい

元々個人的に持っていたアイデアとして、 Pull Request のレビューが大変なので、一次レビューとして高速で激安と噂の Jev にざっくり判断してもらおうというのがありました。ということで、ついでに↑のCLIを GitHub Actions にインストールするだけの Action も用意してみました。

名前の通り、ただセットアップするだけで、内部では OS やバージョンに対応するバイナリを入れるみたいな感じです。

YAML
- uses: stefafafan/setup-jev@68157056af19eac3d6d649efa641d1e9662b5186 # v1.0.1
  with:
    version: v0.1.2

実際に GitHub Workflow に組み込んでみる

実際に stefafafan/jev のリポジトリでは、 Pull Request のリスクを判定する Workflow を動かしてみました。

特定の状態の Pull Request で発火し、 gh pr diff の出力を jev choice へ渡し、risk-low、risk-medium、risk-high のいずれかを選ばせています。中心となる部分は以下のようになっています。

Shell
result=$(gh pr diff "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" | \
  jev --provider cloudflare choice \
    --option risk-low \
    --option risk-medium \
    --option risk-high \
    "$instructions")

risk=$(jq -er '.answers.result.choice' <<< "$result")

あとは受け取った結果をもとに label をつけ外しするという感じです。試してみたところ、外部APIを叩いてる割には判別するステップで1-2秒くらいで終わっているので便利そう。

一方、現状は事前に発行したトークンを使うため、漏洩時のリスクが気になります。理想的にはWorkflow実行時だけ有効な短命トークンを使いたいところですが、今のところ難しそう。可能な範囲で権限や有効期限を絞り、Budgetの上限も設定しておくくらいが現状できることに思います。

Footnotes

  1. https://github.com/typesafe-ai ↩