depandabotはライブラリを自動アップデートしてくれるGitHubの機能です。
dependabotは今のところDenoには対応していないようですが、3rd party製ツールであるUDDを使うとdependabotと同じように自動アップデートをかけられます。
Deno版dependabot、「UDD」の使い方
UDDは「Update Deno Dependencies」の略で、その名の通りDenoのモジュールをアップデートしてくれるツールです。
このツールをGitHub Actionsを通して動かすことで、dependabotのような自動アップデートができます。
workflowの書き方
GitHub Actionsでuddを動かすには、以下のようなworkflowファイルをリポジトリに設置します。
name: deno-udd
on:
push:
branches:
- main
schedule:
- cron: "0 9 25 * *" # 毎月25日 9時 0分に実行(※毎日/毎週実行するように変更することもできる)
jobs:
update-deno-dependencies:
permissions: write-all
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: denoland/setup-deno@v1
- name: run deno-udd # UDDで一括アップデート
id: run-deno-udd
env:
NO_COLOR: true
run: |
UDD_RESULT=`deno run -A https://deno.land/x/udd/main.ts $(find . -type f | grep -E ".*\.([mc]?(ts|js)|(ts|js)x?)$" -)`
UDD_RESULT="${UDD_RESULT//'%'/'%25'}"
UDD_RESULT="${UDD_RESULT//$'\n'/'%0A'}"
UDD_RESULT="${UDD_RESULT//$'\r'/'%0D'}"
echo "::set-output name=UDD_RESULT::$UDD_RESULT"
- name: Create Pull Request # プルリクを開いてアップデートを反映させる
uses: peter-evans/create-pull-request@v3
with:
commit-message: "chore(deps): update deno dependencies"
title: Update Deno Dependencies
body: |-
Some external modules are stale.
<details><summary>Details</summary><div>
```
${{ steps.run-deno-udd.outputs.UDD_RESULT }}
```
</div></details>
branch: deno-udd
author: GitHub <noreply@github.com>
delete-branch: true
上記のworkflowファイルを設定すると、自動で下の画像のようなプルリクエストが開かれ、外部ライブラリを自動アップデートしてくれます。
便利ですね~
Deno標準ライブラリについては毎週新しいバージョンが公開されるため、毎週or毎日UDDを実行するように設定すると、毎週プルリクが開かれることになります。
リポジトリが増えてくるとこれが結構うるさいため、上記のworkflowでは毎月25日に実行されるように設定しています。
テストが実行されない時
ただし上のworkflowには欠点があって、UDDのプルリクが開かれた時、push時に走るように設定したworkflowが実行されないという問題があります。(参考)
push時にテストが走るように設定していても実行されないので、ちょっと困ります。
これはpeter-evans/create-pull-request
側の問題のようで、GitHub Actions上で使うトークンの権限に関する制限のようです。
対策としては、以下↓のリンクに書いてある通り、GitHubのパーソナルアクセストークン(PAT)を設定する方法などがあるようです。
または、UDDによって開かれたプルリクエストを一旦closeしてからopenすることでも他のworkflowをトリガーできるようです。
deps.tsやimport-mapいらず?
Denoでは、依存関係を記述する場所を1か所にまとめてアップデートしやすくする手法として、deps.ts
やimport-map.json
が使われています。
ただUDDを使うとアップデートの手間もかからないですし、deps.tsやimport-mapは別に使わなくてもいいのかなと思います。(URLの入力に補完が効くので、import文に直接URLを書いてしまった方が楽)
もちろんPRのレビューの楽さからいうと、1か所に依存関係をまとてしまったほうがいいのかもしれませんが。
まとめ
- dependabotはDeno非対応だが、代わりに使える3rd party製ツール(UDD)がある
- GitHub Actionsを使って動かす
- 使用されるトークンの権限によっては別のworkflowが実行されない
- PATを設定するか、プルリク自体を一旦closeしてからopenすることで解決
-
deps.ts
やimport-map.json
が無くても大丈夫かも