🤖

Denopendabot で依存関係の更新を自動化する

2022/12/04に公開

背景

Deno では import ステートメントに URL を記述することで外部モジュールを直接読み込むことができます:

import $ from "https://deno.land/x/dax@0.16.0/mod.ts";

このおかげで Node における node_modulespackage-lock.json にまつわる煩わしさと付き合わずにすみますが、利用しているモジュールを更新するのはやや面倒です。 Node には npm update がありますが、これに相当する機能が Deno のランタイムには備わっていません。

そこでよく利用されているのがサードパーティツールの udd です。 udd はソースコード内の URL に含まれる SemVer を上げることに特化したシンプルな CLI ツールですが、活発に開発されており、完成度が高いです。

例えば、次のコマンドで deps.ts に含まれる外部モジュールの URL を一括でアップデートすることができます。

$ udd deps.ts

あまり知られていませんが import_map.json にも対応しています:

$ udd import_map.json

便利ですね。

ただ、GitHub には Dependabot という機能があり、Node などのプロジェクトではそもそもこういった作業を手動で行なっていない方も多いと思います。しかし、Dependabot は今のところ Deno に対応しておらず、 近い将来に対応してくれそうな雰囲気もありません。したがって、依存関係の更新を自動化するには一手間必要です。

幸い、udd は GitHub Action のサンプルファイル を用意してくれているので、これを弄って使えばある程度 Dependabot に近いことが出来ますが、手軽さや機能の面で劣ってしまいます。

Dependabot のコア部分はオープンソースだけど、外部からのコントリビューションを想定している感じではないし、Deno 対応のプルリクを頑張って作るのも違う気がする…

Denopendabot

じゃあ Deno 用の Dependabot を Deno で作ろう!と思って作り始めたのが "Deno"pendabot です:

Denopendabot のイメージキャラクター

https://github.com/hasundue/denopendabot

コア部分では udd を使っていて、主に GitHub とのインタラクションの部分を実装しています。まだ開発途中ですが、筆者は大きな不満無く実用できています。 Denopendabot は次の4つの形式でリリースされていて、好きな方法で使うことができます:

  • GitHub App
  • GitHub Action
  • CLI ツール
  • Deno モジュール

多くの場合 GitHub App を使うのが最も簡単かつ便利なので、今回はそれをメインに解説します。

インストール

Denopendabot の GitHub App のページ からインストールできます。それなりに強い権限を要求するので、Deno を使っているレポジトリのみにインストールすることをオススメします。

レポジトリに deno.jsondeno.jsonc が存在していると、Denopendabot はそのレポジトリを Deno のプロジェクトだと判断して、セットアップ用のプルリクを投げてきます:

セットアップ用のプルリクエスト

中身は GitHub Action の workflow ファイルで、スケジュールに従って Deno Deploy で動いている Denopendabot 本体にジョブを送信します。またこの workflow は設定ファイルも兼ねています。必要に応じて編集してからマージすればセットアップは完了です。

レポジトリに deno.jsondeno.jsonc が無い場合、この workflow ファイル を自分で作成する必要があります。Deno プロジェクトの判定はもう少し色々なケースに対応できるようにしたいと思っています。

実行

デフォルトの workflow ファイルには on: workflow_dispatch が記述されているので、手動で実行することもできます。試しに実行してみましょう。

実行

この workflow は repository dispatch を発行するだけのもので、実際の処理は Deno Deploy 上で動いている Denopendabot 本体が行います。

うまくいくと、下のようなプルリクが送られてくるはずです。

結果

本文が無くてずいぶんとぶっきらぼうですね。近いうちにちゃんと本文を書かせるようにします。 各モジュールの更新は個別のコミットに分けられて、それらがひとつのプルリクにまとめられます。ここは本家と挙動が違うところですが、将来的にはオプションで制御できるようにしたいです。

デフォルトでは auto merge が有効になっているので、CI が通っている場合 Denopendabot がこのプルリクを自動でマージします。これを無効にしたい場合は denopendabot.ymlauto-merge の行をコメントアウトしてください。auto-merge の値は今のところ any だけですが、将来的には patchnon-breaking など自動でマージする条件を指定できるようにするつもりです。

各コミットの中身は以下のような感じです:

コミット

まとめ

というわけで手前味噌ですが Denopendabot の紹介でした。まだ重要なプロジェクトで使用するのはオススメしませんが、ちょっとしたプロジェクトで試しに使ってみていただいて、Issue や PR もらえると嬉しいです。

よく知らない開発者が運用してる App にレポジトリの内容を送るのはちょっと…という方は、GitHub Action 版をお使いください。自分の GitHub Action 環境の中で Denopendabot を実行できます。

あと Deno Deploy で動く GitHub App というのもまだあまり多くないと思うので、そのあたりの技術的な話も近いうちに記事にできればと思っています。

Discussion